{
  "openapi": "3.0.4",
  "info": {
    "title": "Clubnetz Club API",
    "description": "Everything a club API key can do in its club. These are the endpoints the Clubnetz app itself uses.\nA guide with examples is at https://clubnetz.app/docs/api/.\n\n**Authentication:** create a key in the app (club administration, API keys) and send it with every request as\n`Authorization: Bearer cnz_...`. A key acts as the club admin who created it and only works for the routes of its\nclub (`/api/Clubs/<clubId>/...`). It stops working when it expires, is revoked, or its creator is no longer an admin of the club.\n\n**Read-only keys** may only send GET requests, everything else is answered with 403.\n\n**Not part of the API:** managing the API keys and connecting or disconnecting the club's Stripe account. Both need an admin signed in to the app.\n\n**Limits:** 120 requests per minute and key, then 429 with a `Retry-After` header.\n\n**Errors:** invalid input is answered with 412 and a JSON body with `message`, `errorCode` and `errorDetail`.\n\n**Stability:** the app and the API are released together, so endpoints can change with a new version of Clubnetz.\nEvery response carries the running version in the `X-App-Version` header.",
    "version": "1"
  },
  "paths": {
    "/api/Clubs/{clubId}/BadgeTiers": {
      "get": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Get badge tiers",
        "operationId": "BadgeTiers_GetBadgeTiers",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.GetBadgeTiersResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Create badge tier",
        "operationId": "BadgeTiers_CreateBadgeTier",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CreateBadgeTierModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CreateBadgeTierModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CreateBadgeTierModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/BadgeTiers/{tierId}": {
      "put": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Update badge tier",
        "operationId": "BadgeTiers_UpdateBadgeTier",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "tierId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.UpdateBadgeTierModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.UpdateBadgeTierModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.UpdateBadgeTierModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Delete badge tier",
        "operationId": "BadgeTiers_DeleteBadgeTier",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "tierId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/BadgeTiers/copy": {
      "post": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Copy badge tiers",
        "operationId": "BadgeTiers_CopyBadgeTiers",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CopyBadgeTiersModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CopyBadgeTiersModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.CopyBadgeTiersModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/BadgeTiers/{tierId}/image": {
      "post": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Upload badge tier image",
        "operationId": "BadgeTiers_UploadBadgeTierImage",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "tierId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "file": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "BadgeTiers"
        ],
        "summary": "Get badge tier image",
        "operationId": "BadgeTiers_GetBadgeTierImage",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "tierId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/BookCourt": {
      "post": {
        "tags": [
          "Bookings"
        ],
        "summary": "Book court",
        "operationId": "Bookings_BookCourt",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/Batch": {
      "post": {
        "tags": [
          "Bookings"
        ],
        "summary": "Books several slots (court and time) at once with the same play mode and players, as the multi-day planner does.\nEvery slot follows the rules of a single booking; nothing is saved unless every slot is valid.\nWith `dryRun` nothing is saved and the result tells which slots would fail and which bookings an overbooking play mode would remove.",
        "operationId": "Bookings_BookCourts",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtsModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtsModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtsModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "The bookings of the calendar. Members who are not active only see that a court is booked, except for their own bookings.",
        "operationId": "Bookings_GetBookings",
        "parameters": [
          {
            "name": "dayFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dayTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.GetBookingsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/Upcoming": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "Get upcoming bookings",
        "operationId": "Bookings_GetUpcomingBookings",
        "parameters": [
          {
            "name": "amount",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.GetUpcomingBookingsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/{id}": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "Get booking",
        "operationId": "Bookings_GetBooking",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.BookingResult"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Bookings"
        ],
        "summary": "Delete booking",
        "operationId": "Bookings_DeleteBooking",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Bookings"
        ],
        "summary": "Edit booking",
        "operationId": "Bookings_EditBooking",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditBookingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditBookingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditBookingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/BookRecurring": {
      "post": {
        "tags": [
          "Bookings"
        ],
        "summary": "Book recurring court",
        "operationId": "Bookings_BookRecurringCourt",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookRecurringCourtModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookRecurringCourtModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookRecurringCourtModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookCourtResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/Recurring/{id}": {
      "put": {
        "tags": [
          "Bookings"
        ],
        "summary": "Edit recurring booking",
        "operationId": "Bookings_EditRecurringBooking",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditRecurringBookingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditRecurringBookingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.EditRecurringBookingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Bookings"
        ],
        "summary": "Delete recurring booking",
        "operationId": "Bookings_DeleteRecurringBooking",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.DeleteRecurringBookingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.DeleteRecurringBookingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.DeleteRecurringBookingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Bookings/RecurringSeries/{seriesId}": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "Get recurring booking series",
        "operationId": "Bookings_GetRecurringBookingSeries",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.RecurringBookingSeriesResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements": {
      "get": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Get club announcements",
        "operationId": "ClubAnnouncements_GetClubAnnouncements",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "includeExpired",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.GetClubAnnouncementsResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Create club announcement",
        "operationId": "ClubAnnouncements_CreateClubAnnouncement",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/{clubAnnouncementId}": {
      "get": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Get club announcement",
        "operationId": "ClubAnnouncements_GetClubAnnouncement",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Update club announcement",
        "operationId": "ClubAnnouncements_UpdateClubAnnouncement",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Delete club announcement",
        "operationId": "ClubAnnouncements_DeleteClubAnnouncement",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/preview": {
      "post": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Preview club announcement",
        "operationId": "ClubAnnouncements_PreviewClubAnnouncement",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/{clubAnnouncementId}/attachments": {
      "post": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Add club announcement attachment",
        "operationId": "ClubAnnouncements_AddClubAnnouncementAttachment",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "file": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/{clubAnnouncementId}/attachments/{attachmentId}": {
      "delete": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Remove club announcement attachment",
        "operationId": "ClubAnnouncements_RemoveClubAnnouncementAttachment",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Get club announcement attachment",
        "operationId": "ClubAnnouncements_GetClubAnnouncementAttachment",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "attachmentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/email-recipients": {
      "post": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Get club announcement email recipients",
        "operationId": "ClubAnnouncements_GetClubAnnouncementEmailRecipients",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementEmailRecipientsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubAnnouncements/{clubAnnouncementId}/email": {
      "post": {
        "tags": [
          "ClubAnnouncements"
        ],
        "summary": "Send club announcement email",
        "operationId": "ClubAnnouncements_SendClubAnnouncementEmail",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubAnnouncementId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEmailTemplates": {
      "get": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Get club email templates",
        "operationId": "ClubEmailTemplates_GetClubEmailTemplates",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.GetClubEmailTemplatesResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEmailTemplates/settings": {
      "put": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Update club email settings",
        "operationId": "ClubEmailTemplates_UpdateClubEmailSettings",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailSettingsModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailSettingsModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailSettingsModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEmailTemplates/{type}": {
      "get": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Get club email template",
        "operationId": "ClubEmailTemplates_GetClubEmailTemplate",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.GetClubEmailTemplateResult"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Update club email template",
        "operationId": "ClubEmailTemplates_UpdateClubEmailTemplate",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailTemplateModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailTemplateModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailTemplateModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Reset club email template",
        "operationId": "ClubEmailTemplates_ResetClubEmailTemplate",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEmailTemplates/{type}/preview": {
      "post": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Preview club email template",
        "operationId": "ClubEmailTemplates_PreviewClubEmailTemplate",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.PreviewClubEmailTemplateResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEmailTemplates/{type}/test": {
      "post": {
        "tags": [
          "ClubEmailTemplates"
        ],
        "summary": "Send test club email",
        "operationId": "ClubEmailTemplates_SendTestClubEmail",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents": {
      "get": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Get club events",
        "operationId": "ClubEvents_GetClubEvents",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.GetClubEventsResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Create club event",
        "operationId": "ClubEvents_CreateClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents/{clubEventId}": {
      "get": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Get club event",
        "operationId": "ClubEvents_GetClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventDto"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Update club event",
        "operationId": "ClubEvents_UpdateClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Delete club event",
        "operationId": "ClubEvents_DeleteClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents/preview": {
      "post": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Preview club event description",
        "operationId": "ClubEvents_PreviewClubEventDescription",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents/{clubEventId}/registration": {
      "put": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Register for club event",
        "operationId": "ClubEvents_RegisterForClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.RegisterForClubEventModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.RegisterForClubEventModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.RegisterForClubEventModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Unregister from club event",
        "operationId": "ClubEvents_UnregisterFromClubEvent",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents/{clubEventId}/registrations/{registrationId}": {
      "delete": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Remove club event registration",
        "operationId": "ClubEvents_RemoveClubEventRegistration",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "registrationId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubEvents/{clubEventId}/export": {
      "get": {
        "tags": [
          "ClubEvents"
        ],
        "summary": "Export club event participants",
        "operationId": "ClubEvents_ExportClubEventParticipants",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubEventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubProfile": {
      "get": {
        "tags": [
          "ClubProfile"
        ],
        "summary": "Get club profile",
        "operationId": "ClubProfile_GetClubProfile",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubProfile.GetClubProfileResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/ClubProfile/BookingOptions": {
      "get": {
        "tags": [
          "ClubProfile"
        ],
        "summary": "Get booking options",
        "operationId": "ClubProfile_GetBookingOptions",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubProfile.GetBookingOptionsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}": {
      "get": {
        "tags": [
          "Clubs"
        ],
        "summary": "Get club",
        "operationId": "Clubs_GetClub",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.ClubInformationResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Clubs"
        ],
        "summary": "Update club information",
        "operationId": "Clubs_UpdateClubInformation",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.ClubInformationModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.ClubInformationModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.ClubInformationModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/CourtBlockings": {
      "get": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Get court blocking occurrences",
        "operationId": "CourtBlockings_GetCourtBlockingOccurrences",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "dayFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dayTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingOccurrencesResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Create court blocking",
        "operationId": "CourtBlockings_CreateCourtBlocking",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/CourtBlockings/manage": {
      "get": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Get court blockings",
        "operationId": "CourtBlockings_GetCourtBlockings",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "includePast",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/CourtBlockings/conflicts": {
      "post": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Get court blocking conflicts",
        "operationId": "CourtBlockings_GetCourtBlockingConflicts",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingConflictsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/CourtBlockings/{courtBlockingId}": {
      "put": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Update court blocking",
        "operationId": "CourtBlockings_UpdateCourtBlocking",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "courtBlockingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "CourtBlockings"
        ],
        "summary": "Delete court blocking",
        "operationId": "CourtBlockings_DeleteCourtBlocking",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "courtBlockingId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Courts": {
      "get": {
        "tags": [
          "Courts"
        ],
        "summary": "Get courts",
        "operationId": "Courts_GetCourts",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.GetCourtsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Courts/{courtId}/Update": {
      "patch": {
        "tags": [
          "Courts"
        ],
        "summary": "Edit court",
        "operationId": "Courts_EditCourt",
        "parameters": [
          {
            "name": "courtId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.UpdateCourtRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.UpdateCourtRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.UpdateCourtRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families": {
      "get": {
        "tags": [
          "Families"
        ],
        "summary": "All families of the club, for those who manage the members.",
        "operationId": "Families_GetFamilies",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.GetFamiliesResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Families"
        ],
        "summary": "Create family",
        "operationId": "Families_CreateFamily",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.CreateFamilyRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.CreateFamilyRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.CreateFamilyRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}": {
      "get": {
        "tags": [
          "Families"
        ],
        "summary": "Get family",
        "operationId": "Families_GetFamily",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.GetFamilyResult"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Families"
        ],
        "summary": "Delete family",
        "operationId": "Families_DeleteFamily",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/AvailableFamilyMembers/{memberId}": {
      "get": {
        "tags": [
          "Families"
        ],
        "summary": "The members of the club without a family (names only), to pick a partner or children from.",
        "operationId": "Families_GetAvailableFamilyMembers",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.GetAvailableFamilyMembersResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}/Parent": {
      "post": {
        "tags": [
          "Families"
        ],
        "summary": "Add parent",
        "operationId": "Families_AddParent",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddParentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddParentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddParentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}/Child": {
      "post": {
        "tags": [
          "Families"
        ],
        "summary": "Add child",
        "operationId": "Families_AddChild",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddChildRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddChildRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddChildRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}/NewChild": {
      "post": {
        "tags": [
          "Families"
        ],
        "summary": "Add new child",
        "operationId": "Families_AddNewChild",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddNewChildRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddNewChildRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddNewChildRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}/Child/{memberId}": {
      "put": {
        "tags": [
          "Families"
        ],
        "summary": "Update owned child",
        "operationId": "Families_UpdateOwnedChild",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.UpdateOwnedChildRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.UpdateOwnedChildRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.UpdateOwnedChildRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Families/{familyId}/Member/{memberId}": {
      "delete": {
        "tags": [
          "Families"
        ],
        "summary": "Delete family",
        "operationId": "Families_DeleteFamily",
        "parameters": [
          {
            "name": "familyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Leaderboards": {
      "get": {
        "tags": [
          "Leaderboards"
        ],
        "summary": "Get leaderboard",
        "operationId": "Leaderboards_GetLeaderboard",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.GetLeaderboardResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Leaderboards/opt-out": {
      "post": {
        "tags": [
          "Leaderboards"
        ],
        "summary": "Toggle opt out",
        "operationId": "Leaderboards_ToggleOptOut",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.ToggleLeaderboardOptOutRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.ToggleLeaderboardOptOutRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.ToggleLeaderboardOptOutRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MemberBadges/Members/{memberId}/badges": {
      "get": {
        "tags": [
          "MemberBadges"
        ],
        "summary": "Get member badges",
        "operationId": "MemberBadges_GetMemberBadges",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.GetMemberBadgesResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MemberBadges/Members/{memberId}/badge-progress": {
      "get": {
        "tags": [
          "MemberBadges"
        ],
        "summary": "Get member badge progress",
        "operationId": "MemberBadges_GetMemberBadgeProgress",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.GetMemberBadgeProgressResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MemberBadges/Members/{memberId}/trophy-case": {
      "get": {
        "tags": [
          "MemberBadges"
        ],
        "summary": "Get trophy case",
        "operationId": "MemberBadges_GetTrophyCase",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.GetTrophyCaseResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MemberBadges/Members/{memberId}/badge-settings": {
      "put": {
        "tags": [
          "MemberBadges"
        ],
        "summary": "Update member badge settings",
        "operationId": "MemberBadges_UpdateMemberBadgeSettings",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.UpdateMemberBadgeSettingsModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.UpdateMemberBadgeSettingsModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.UpdateMemberBadgeSettingsModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get members",
        "operationId": "Members_GetMembers",
        "parameters": [
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "EnablePaging",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/components/schemas/Bookennis.Shared.Utils.Sorting.SortDirection"
              }
            }
          },
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Roles",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
              }
            }
          },
          {
            "name": "NewMembersOnly",
            "in": "query",
            "description": "Members of the active season that were not enrolled in the previous season.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "InSeasonIds",
            "in": "query",
            "description": "Members enrolled in all of these seasons.",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "NotInSeasonIds",
            "in": "query",
            "description": "Members enrolled in none of these seasons.",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "NoBookingsInSeasonId",
            "in": "query",
            "description": "Members without a played booking in this season.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Genders",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
              }
            }
          },
          {
            "name": "AgeGroups",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.AgeGroup"
              }
            }
          },
          {
            "name": "HasEmail",
            "in": "query",
            "description": "Filters members that can (or cannot) be reached by email, either their own or a parent's.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.GetMembersResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/emails": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get member emails",
        "operationId": "Members_GetMemberEmails",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Roles",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
              }
            }
          },
          {
            "name": "NewMembersOnly",
            "in": "query",
            "description": "Members of the active season that were not enrolled in the previous season.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "InSeasonIds",
            "in": "query",
            "description": "Members enrolled in all of these seasons.",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "NotInSeasonIds",
            "in": "query",
            "description": "Members enrolled in none of these seasons.",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "NoBookingsInSeasonId",
            "in": "query",
            "description": "Members without a played booking in this season.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Genders",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
              }
            }
          },
          {
            "name": "AgeGroups",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.AgeGroup"
              }
            }
          },
          {
            "name": "HasEmail",
            "in": "query",
            "description": "Filters members that can (or cannot) be reached by email, either their own or a parent's.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.GetMemberEmailsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/summary": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get members summary",
        "operationId": "Members_GetMembersSummary",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.GetMembersSummaryResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}/overview": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get member overview",
        "operationId": "Members_GetMemberOverview",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.GetMemberOverviewResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get member",
        "operationId": "Members_GetMember",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.MembersDetailResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}/profile": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Name and picture of a player of the club or of a club it shares its players with. All a member gets to know about somebody else.",
        "operationId": "Members_GetMemberProfile",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.MemberProfileResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}/BookingOptions": {
      "patch": {
        "tags": [
          "Members"
        ],
        "summary": "Edit member",
        "operationId": "Members_EditMember",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberBookingOptionsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberBookingOptionsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberBookingOptionsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}/Roles": {
      "patch": {
        "tags": [
          "Members"
        ],
        "summary": "Update member roles",
        "operationId": "Members_UpdateMemberRoles",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberRolesRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberRolesRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.UpdateMemberRolesRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Members/{memberId}/BookingHistory": {
      "get": {
        "tags": [
          "Members"
        ],
        "summary": "Get booking history",
        "operationId": "Members_GetBookingHistory",
        "parameters": [
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.GetMemberBookingHistoryResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments": {
      "get": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Every club member with how they got into the season, and the orders of the season (optionally only those in one status).",
        "operationId": "MembershipPayments_GetMembershipPayments",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Keep in sync with `Bookennis.Shared.Controller.Memberships.MembershipOrderStatus`.",
            "schema": {
              "$ref": "#/components/schemas/Bookennis.Domain.Memberships.MembershipOrderStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.GetMembershipPaymentsResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Records a fee that was paid by bank transfer or cash for members without an order: creates a paid order and enrolls them.",
        "operationId": "MembershipPayments_RecordMembershipPayment",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.RecordMembershipPaymentModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.RecordMembershipPaymentModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.RecordMembershipPaymentModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/summary": {
      "get": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Get membership payments summary",
        "operationId": "MembershipPayments_GetMembershipPaymentsSummary",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.GetMembershipPaymentsSummaryResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/{orderId}/approve": {
      "post": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Confirms an order of a plan that needs a confirmation. The member is told by email and can pay.\nThe body is optional: with `memberIds` the order covers these members from now on.",
        "operationId": "MembershipPayments_ApproveMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.ApproveMembershipOrderModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.ApproveMembershipOrderModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.ApproveMembershipOrderModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/{orderId}/reject": {
      "post": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Reject membership order",
        "operationId": "MembershipPayments_RejectMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/{orderId}/mark-paid": {
      "post": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Marks an open order as paid outside of the app and enrolls its members.",
        "operationId": "MembershipPayments_MarkMembershipOrderPaid",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MarkMembershipOrderPaidModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MarkMembershipOrderPaidModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MarkMembershipOrderPaidModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/{orderId}/cancel": {
      "post": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "Cancels an order, also a paid one. Enrollments stay, and money is given back outside of the app.",
        "operationId": "MembershipPayments_CancelMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "removeEnrollments",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPayments/export": {
      "get": {
        "tags": [
          "MembershipPayments"
        ],
        "summary": "The list as an Excel workbook, in the language of the request.",
        "operationId": "MembershipPayments_ExportMembershipPayments",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPlans": {
      "get": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "The plans of a season in the order members see them. Treasurers also get the plans only they can assign.",
        "operationId": "MembershipPlans_GetMembershipPlans",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.GetMembershipPlansResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "Create membership plan",
        "operationId": "MembershipPlans_CreateMembershipPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPlans/{planId}": {
      "put": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "Changes a plan. Orders that exist keep the name and the amount they were created with.",
        "operationId": "MembershipPlans_UpdateMembershipPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "planId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "Deletes a plan. Rejected with `MembershipPlanHasOrders` once somebody ordered it.",
        "operationId": "MembershipPlans_DeleteMembershipPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "planId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPlans/copy": {
      "post": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "Copies the plans of a season into a season without plans. Birth years and dates move by the difference of the season years.",
        "operationId": "MembershipPlans_CopyMembershipPlans",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CopyMembershipPlansModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CopyMembershipPlansModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CopyMembershipPlansModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/MembershipPlans/sort": {
      "put": {
        "tags": [
          "MembershipPlans"
        ],
        "summary": "Sets the order in which members see the plans of a season.",
        "operationId": "MembershipPlans_SortMembershipPlans",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SortMembershipPlansModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SortMembershipPlansModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.SortMembershipPlansModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Memberships/options": {
      "get": {
        "tags": [
          "Memberships"
        ],
        "summary": "The plans of a season with who they can be ordered for, and the orders that exist. Without a season: the running one, else the next.",
        "operationId": "Memberships_GetMembershipOptions",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.GetMembershipOptionsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Memberships/orders": {
      "post": {
        "tags": [
          "Memberships"
        ],
        "summary": "Orders a plan for oneself or for members of the own family. The rules of the plan are checked.",
        "operationId": "Memberships_CreateMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CreateMembershipOrderModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CreateMembershipOrderModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.CreateMembershipOrderModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Memberships/orders/{orderId}": {
      "get": {
        "tags": [
          "Memberships"
        ],
        "summary": "An order of the caller. While it waits for a payment whose page was opened, Stripe is asked how the payment went.",
        "operationId": "Memberships_GetMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Memberships"
        ],
        "summary": "Withdraws an order that was not paid.",
        "operationId": "Memberships_CancelMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Memberships/orders/{orderId}/checkout": {
      "post": {
        "tags": [
          "Memberships"
        ],
        "summary": "Returns the address of the payment page for the order. The result of the payment is reported to the app by the payment provider.",
        "operationId": "Memberships_StartMembershipCheckout",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.StartMembershipCheckoutResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Memberships/orders/{orderId}/confirm": {
      "post": {
        "tags": [
          "Memberships"
        ],
        "summary": "Confirms an order of a free plan: there is nothing to pay, the members are enrolled.",
        "operationId": "Memberships_ConfirmMembershipOrder",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges": {
      "get": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "The badges of a season with the members who got them: only for active members.",
        "operationId": "OneTimeBadges_GetOneTimeBadges",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.GetOneTimeBadgesResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Create one time badge",
        "operationId": "OneTimeBadges_CreateOneTimeBadge",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CreateOneTimeBadgeModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CreateOneTimeBadgeModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CreateOneTimeBadgeModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/season-members": {
      "get": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Get season club members",
        "operationId": "OneTimeBadges_GetSeasonClubMembers",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.GetSeasonClubMembersResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/{oneTimeBadgeId}": {
      "put": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Update one time badge",
        "operationId": "OneTimeBadges_UpdateOneTimeBadge",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.UpdateOneTimeBadgeModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.UpdateOneTimeBadgeModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.UpdateOneTimeBadgeModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Delete one time badge",
        "operationId": "OneTimeBadges_DeleteOneTimeBadge",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/copy": {
      "post": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Copy one time badges",
        "operationId": "OneTimeBadges_CopyOneTimeBadges",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CopyOneTimeBadgesModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CopyOneTimeBadgesModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.CopyOneTimeBadgesModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/{oneTimeBadgeId}/image": {
      "post": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Upload one time badge image",
        "operationId": "OneTimeBadges_UploadOneTimeBadgeImage",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "file": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Get one time badge image",
        "operationId": "OneTimeBadges_GetOneTimeBadgeImage",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/{oneTimeBadgeId}/award": {
      "post": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Award one time badge",
        "operationId": "OneTimeBadges_AwardOneTimeBadge",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.AwardOneTimeBadgeModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.AwardOneTimeBadgeModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.AwardOneTimeBadgeModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/OneTimeBadges/{oneTimeBadgeId}/award/{memberId}": {
      "delete": {
        "tags": [
          "OneTimeBadges"
        ],
        "summary": "Revoke one time badge",
        "operationId": "OneTimeBadges_RevokeOneTimeBadge",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "oneTimeBadgeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "memberId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Payments/configuration": {
      "get": {
        "tags": [
          "Payments"
        ],
        "summary": "Whether this installation offers online payment and whether the club is connected.",
        "operationId": "Payments_GetPaymentConfiguration",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.PaymentConfigurationResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Payments/account": {
      "get": {
        "tags": [
          "Payments"
        ],
        "summary": "Get payment account",
        "operationId": "Payments_GetPaymentAccount",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.PaymentAccountDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Players": {
      "get": {
        "tags": [
          "Players"
        ],
        "summary": "Get club players",
        "operationId": "Players_GetClubPlayers",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.GetPlayersResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/PlayModes": {
      "get": {
        "tags": [
          "PlayModes"
        ],
        "summary": "Get club players",
        "operationId": "PlayModes_GetClubPlayers",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.GetPlayModesResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "PlayModes"
        ],
        "summary": "Add play mode",
        "operationId": "PlayModes_AddPlayMode",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/PlayModes/{playModeId}": {
      "put": {
        "tags": [
          "PlayModes"
        ],
        "summary": "Update play mode",
        "operationId": "PlayModes_UpdatePlayMode",
        "parameters": [
          {
            "name": "playModeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.PlayModeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "PlayModes"
        ],
        "summary": "Delete play mode",
        "operationId": "PlayModes_DeletePlayMode",
        "parameters": [
          {
            "name": "playModeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Seasons": {
      "get": {
        "tags": [
          "Seasons"
        ],
        "summary": "Get seasons",
        "operationId": "Seasons_GetSeasons",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.GetSeasonsResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Seasons"
        ],
        "summary": "Add season",
        "operationId": "Seasons_AddSeason",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Seasons/{seasonId}": {
      "put": {
        "tags": [
          "Seasons"
        ],
        "summary": "Update season",
        "operationId": "Seasons_UpdateSeason",
        "parameters": [
          {
            "name": "seasonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Seasons"
        ],
        "summary": "Delete season",
        "operationId": "Seasons_DeleteSeason",
        "parameters": [
          {
            "name": "seasonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Statistics": {
      "get": {
        "tags": [
          "Statistics"
        ],
        "summary": "Get member statistics",
        "operationId": "Statistics_GetMemberStatistics",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.GetMemberStatisticsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Statistics/club": {
      "get": {
        "tags": [
          "Statistics"
        ],
        "summary": "Get club statistics",
        "operationId": "Statistics_GetClubStatistics",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.GetClubStatisticsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/SubscriptionPlans": {
      "get": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Get subscription plans",
        "operationId": "SubscriptionPlans_GetSubscriptionPlans",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.GetSubscriptionPlansResult"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Create subscription plan",
        "operationId": "SubscriptionPlans_CreateSubscriptionPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.CreateSubscriptionPlanModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.CreateSubscriptionPlanModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.CreateSubscriptionPlanModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/SubscriptionPlans/{subscriptionPlanId}": {
      "get": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Get subscription plan",
        "operationId": "SubscriptionPlans_GetSubscriptionPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanDto"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Update subscription plan",
        "operationId": "SubscriptionPlans_UpdateSubscriptionPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionPlanModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionPlanModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionPlanModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Delete subscription plan",
        "operationId": "SubscriptionPlans_DeleteSubscriptionPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/SubscriptionPlans/{subscriptionPlanId}/compute": {
      "post": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Compute subscription schedule",
        "operationId": "SubscriptionPlans_ComputeSubscriptionSchedule",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.ComputeSubscriptionScheduleModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.ComputeSubscriptionScheduleModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.ComputeSubscriptionScheduleModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/SubscriptionPlans/{subscriptionPlanId}/schedule": {
      "put": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Update subscription schedule",
        "operationId": "SubscriptionPlans_UpdateSubscriptionSchedule",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionScheduleModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionScheduleModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionScheduleModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/SubscriptionPlans/{subscriptionPlanId}/export": {
      "get": {
        "tags": [
          "SubscriptionPlans"
        ],
        "summary": "Export subscription plan",
        "operationId": "SubscriptionPlans_ExportSubscriptionPlan",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "subscriptionPlanId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Wrapped": {
      "get": {
        "tags": [
          "Wrapped"
        ],
        "summary": "Get wrapped seasons",
        "operationId": "Wrapped_GetWrappedSeasons",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.GetWrappedSeasonsResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Wrapped/{seasonId}": {
      "get": {
        "tags": [
          "Wrapped"
        ],
        "summary": "Get season wrapped",
        "operationId": "Wrapped_GetSeasonWrapped",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.SeasonWrappedResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Clubs/{clubId}/Wrapped/{seasonId}/publish": {
      "put": {
        "tags": [
          "Wrapped"
        ],
        "summary": "Publish season wrapped",
        "operationId": "Wrapped_PublishSeasonWrapped",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Wrapped"
        ],
        "summary": "Unpublish season wrapped",
        "operationId": "Wrapped_UnpublishSeasonWrapped",
        "parameters": [
          {
            "name": "clubId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seasonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Bookennis.Domain.Memberships.MembershipOrderStatus": {
        "enum": [
          "AwaitingApproval",
          "AwaitingPayment",
          "Processing",
          "Paid",
          "Failed",
          "Cancelled",
          "Refunded",
          "Disputed"
        ],
        "type": "string",
        "description": "Keep in sync with `Bookennis.Shared.Controller.Memberships.MembershipOrderStatus`."
      },
      "Bookennis.Global.Intervals.DateTimeOffsetInterval": {
        "type": "object",
        "properties": {
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Global.Intervals.TimeOnlyInterval": {
        "type": "object",
        "properties": {
          "to": {
            "type": "string",
            "format": "time"
          },
          "from": {
            "type": "string",
            "format": "time"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.BadgeTiers.BadgeTierDto": {
        "required": [
          "description",
          "id",
          "level",
          "matchesRequired",
          "name",
          "sortOrder"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "level": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "matchesRequired": {
            "type": "integer",
            "format": "int32"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "earnedCount": {
            "type": "integer",
            "description": "Number of members that earned this tier.",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.BadgeTiers.CopyBadgeTiersModel": {
        "type": "object",
        "properties": {
          "sourceSeasonId": {
            "type": "integer",
            "format": "int32"
          },
          "targetSeasonId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.BadgeTiers.CreateBadgeTierModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "matchesRequired": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.BadgeTiers.GetBadgeTiersResult": {
        "required": [
          "tiers"
        ],
        "type": "object",
        "properties": {
          "tiers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.BadgeTiers.BadgeTierDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.BadgeTiers.UpdateBadgeTierModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "matchesRequired": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookCourtModel": {
        "type": "object",
        "properties": {
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookCourtResult": {
        "required": [
          "id"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookCourtsModel": {
        "type": "object",
        "properties": {
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookingSlotModel"
            },
            "nullable": true
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "dryRun": {
            "type": "boolean"
          },
          "expectedBookingIdsToRemove": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Books several time slots at once with the same play mode, players and comment (the multi-day planner).\nAll slots are validated with the same rules as a single booking; nothing is saved unless every slot is valid.\nWith Bookennis.Shared.Controller.Booking.BookCourtsModel.DryRun nothing is saved and the result tells which slots would fail and which bookings an overbooking play mode would remove.\nWith Bookennis.Shared.Controller.Booking.BookCourtsModel.ExpectedBookingIdsToRemove (the bookings the user confirmed after a dry run) the save is rejected when an overbooking play mode would remove other bookings than these."
      },
      "Bookennis.Shared.Controller.Booking.BookCourtsResult": {
        "type": "object",
        "properties": {
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookingSlotCheck"
            },
            "description": "One entry per requested slot, in the order of the request.",
            "nullable": true
          },
          "bookingsToRemove": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.BookingToRemoveDto"
            },
            "description": "Existing bookings an overbooking play mode removes (or would remove, for a dry run).",
            "nullable": true
          },
          "createdBookingIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "The ids of the new bookings, in the order of the slots. Empty for a dry run.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookRecurringCourtModel": {
        "type": "object",
        "properties": {
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "recurrenceIntervalWeeks": {
            "type": "integer",
            "format": "int32"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookingSlotCheck": {
        "type": "object",
        "properties": {
          "index": {
            "type": "integer",
            "description": "Position of the slot in the request.",
            "format": "int32"
          },
          "errorCode": {
            "type": "string",
            "description": "Name of the error code that rejects the slot (same codes as a single booking), `null` when the slot is valid.",
            "nullable": true
          },
          "errorDetails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Arguments of the error message, like the error details of an error response.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookingSlotModel": {
        "type": "object",
        "properties": {
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.BookingToRemoveDto": {
        "type": "object",
        "properties": {
          "bookingEntryId": {
            "type": "integer",
            "format": "int32"
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          },
          "playModeName": {
            "type": "string",
            "nullable": true
          },
          "playerNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.DeleteRecurringBookingModel": {
        "type": "object",
        "properties": {
          "bookingEntryId": {
            "type": "integer",
            "format": "int32"
          },
          "scope": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.RecurringDeleteScope"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.EditBookingModel": {
        "type": "object",
        "properties": {
          "bookingEntryId": {
            "type": "integer",
            "format": "int32"
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.EditRecurringBookingModel": {
        "type": "object",
        "properties": {
          "bookingEntryId": {
            "type": "integer",
            "format": "int32"
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "scope": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.RecurringEditScope"
          },
          "recurrenceIntervalWeeks": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.GetBookingsResult": {
        "type": "object",
        "properties": {
          "bookings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.BookingResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.GetUpcomingBookingsResult": {
        "type": "object",
        "properties": {
          "bookings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.BookingResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.RecurringBookingSeriesResult": {
        "required": [
          "comment",
          "courtId",
          "dayOfWeek",
          "endDate",
          "endTime",
          "id",
          "players",
          "playModeId",
          "recurrenceIntervalWeeks",
          "startDate",
          "startTime"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "playModeId": {
            "type": "integer",
            "format": "int32"
          },
          "dayOfWeek": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "startTime": {
            "type": "string",
            "format": "time"
          },
          "endTime": {
            "type": "string",
            "format": "time"
          },
          "recurrenceIntervalWeeks": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "players": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayerResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.RecurringDeleteScope": {
        "enum": [
          "Single",
          "ThisAndFollowing"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Booking.RecurringEditScope": {
        "enum": [
          "Single",
          "ThisAndFollowing"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Booking.Shared.BookingResult": {
        "type": "object",
        "properties": {
          "bookingEntryId": {
            "type": "integer",
            "format": "int32"
          },
          "players": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayerResult"
            },
            "nullable": true
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          },
          "playMode": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayModeDto"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "recurringBookingSeriesId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isExcludedFromSeries": {
            "type": "boolean"
          },
          "isAnonymized": {
            "type": "boolean"
          },
          "isBought": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "A booking of the calendar. Bookennis.Shared.Controller.Booking.Shared.BookingResult.IsAnonymized: the caller is not an active member of the club (not enrolled in the\nactive season, no staff role) and plays in no part of this booking: it only shows that the court is booked. Bookennis.Shared.Controller.Booking.Shared.BookingResult.Players is\nempty, Bookennis.Shared.Controller.Booking.Shared.BookingResult.Comment and Bookennis.Shared.Controller.Booking.Shared.BookingResult.RecurringBookingSeriesId are `null` and Bookennis.Shared.Controller.Booking.Shared.BookingResult.PlayMode is a neutral\nplaceholder (id 0, empty name, gray)."
      },
      "Bookennis.Shared.Controller.Booking.Shared.PlayModeDto": {
        "required": [
          "allowedRoles",
          "allowRecurring",
          "canOverbook",
          "color",
          "commentAllowed",
          "fixedDuration",
          "fixedPlayerCount",
          "id",
          "isChargingBookingSubscription",
          "maxBookingsPerSeason",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "allowedRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          },
          "color": {
            "type": "integer",
            "format": "int32"
          },
          "fixedPlayerCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isChargingBookingSubscription": {
            "type": "boolean"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "fixedDuration": {
            "type": "string",
            "format": "date-span",
            "nullable": true
          },
          "canOverbook": {
            "type": "boolean"
          },
          "commentAllowed": {
            "type": "boolean"
          },
          "maxBookingsPerSeason": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "allowRecurring": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Booking.Shared.PlayerResult": {
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "isGuest": {
            "type": "boolean"
          },
          "isAtpPlayer": {
            "type": "boolean"
          },
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeImageUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeLevel": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.ClubInformationModel": {
        "required": [
          "bookingGracePeriodInMinutes",
          "openingHours",
          "primeTimeSettings"
        ],
        "type": "object",
        "properties": {
          "openingHours": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.TimeOnlyInterval"
          },
          "primeTimeSettings": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.PrimeTimeSettingsDto"
          },
          "bookingGracePeriodInMinutes": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.ClubInformationResult": {
        "required": [
          "bookingGracePeriodInMinutes",
          "openingHours",
          "primeTimeSettings"
        ],
        "type": "object",
        "properties": {
          "openingHours": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.TimeOnlyInterval"
          },
          "primeTimeSettings": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.PrimeTimeSettingsDto"
          },
          "bookingGracePeriodInMinutes": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.CourtResult": {
        "required": [
          "alias",
          "courtId",
          "culbId",
          "inactive",
          "name",
          "sortOrder"
        ],
        "type": "object",
        "properties": {
          "culbId": {
            "type": "integer",
            "format": "int32"
          },
          "courtId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "alias": {
            "type": "string",
            "nullable": true
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "inactive": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.GetCourtsResult": {
        "required": [
          "courts"
        ],
        "type": "object",
        "properties": {
          "courts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.CourtResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.GetPlayModesResult": {
        "required": [
          "playModes"
        ],
        "type": "object",
        "properties": {
          "playModes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayModeDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.GetPlayersResult": {
        "type": "object",
        "properties": {
          "clubMembers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayerResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The players that can be picked for a booking."
      },
      "Bookennis.Shared.Controller.Club.GetSeasonsResult": {
        "required": [
          "seasons"
        ],
        "type": "object",
        "properties": {
          "seasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Club.SeasonResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.PlayModeRequest": {
        "required": [
          "allowedRoles",
          "canOverbook",
          "color",
          "commentAllowed",
          "fixedDuration",
          "fixedPlayerCount",
          "isChargingBookingSubscription",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "allowedRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          },
          "color": {
            "type": "integer",
            "format": "int32"
          },
          "fixedPlayerCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isChargingBookingSubscription": {
            "type": "boolean"
          },
          "fixedDuration": {
            "type": "string",
            "format": "date-span",
            "nullable": true
          },
          "canOverbook": {
            "type": "boolean"
          },
          "commentAllowed": {
            "type": "boolean"
          },
          "maxBookingsPerSeason": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "allowRecurring": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.SeasonRequest": {
        "required": [
          "endDate",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.SeasonResult": {
        "required": [
          "endDate",
          "id",
          "isActive",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "wrappedPublishedAt": {
            "type": "string",
            "description": "When the club released the season's Wrapped to its members, `null` = not released.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Club.UpdateCourtRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "alias": {
            "type": "string",
            "nullable": true
          },
          "interval": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAttachmentDto": {
        "required": [
          "contentType",
          "fileName",
          "id",
          "size"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "contentType": {
            "type": "string",
            "nullable": true
          },
          "size": {
            "type": "integer",
            "description": "Size in bytes.",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAudience": {
        "enum": [
          "AllMembers",
          "ActiveSeasonMembers",
          "Youth",
          "Roles"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementDto": {
        "required": [
          "attachments",
          "body",
          "bodyHtml",
          "id",
          "isExpired",
          "isPinned",
          "publishedAt",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "description": "The Markdown source, used by the editor.",
            "nullable": true
          },
          "bodyHtml": {
            "type": "string",
            "description": "The body rendered and sanitized by the backend.",
            "nullable": true
          },
          "isPinned": {
            "type": "boolean"
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "isExpired": {
            "type": "boolean"
          },
          "createdByName": {
            "type": "string",
            "nullable": true
          },
          "attachments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAttachmentDto"
            },
            "nullable": true
          },
          "emailSentAt": {
            "type": "string",
            "description": "When the announcement was last sent as email. Only filled for members who manage the announcements.",
            "format": "date-time",
            "nullable": true
          },
          "emailAudience": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAudience"
          },
          "emailRecipientCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementEmailRecipientsResult": {
        "required": [
          "recipientCount"
        ],
        "type": "object",
        "properties": {
          "recipientCount": {
            "type": "integer",
            "description": "Number of different email addresses the announcement is (or would be) sent to.",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementSummaryDto": {
        "required": [
          "attachmentCount",
          "excerpt",
          "id",
          "isExpired",
          "isPinned",
          "publishedAt",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "excerpt": {
            "type": "string",
            "description": "The beginning of the text without formatting.",
            "nullable": true
          },
          "isPinned": {
            "type": "boolean"
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "isExpired": {
            "type": "boolean",
            "description": "Expired announcements are only returned to members who manage the announcements."
          },
          "attachmentCount": {
            "type": "integer",
            "format": "int32"
          },
          "createdByName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.GetClubAnnouncementsResult": {
        "required": [
          "announcements"
        ],
        "type": "object",
        "properties": {
          "announcements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementSummaryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementModel": {
        "type": "object",
        "properties": {
          "body": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.PreviewClubAnnouncementResult": {
        "required": [
          "html"
        ],
        "type": "object",
        "properties": {
          "html": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.SaveClubAnnouncementModel": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "description": "Markdown.",
            "nullable": true
          },
          "isPinned": {
            "type": "boolean"
          },
          "expiresOn": {
            "type": "string",
            "description": "Last day the announcement is shown to members.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Create and update model of an announcement.\nTexts are validated by the domain, so empty texts result in a localized error instead of a generic bad request."
      },
      "Bookennis.Shared.Controller.ClubAnnouncements.SendClubAnnouncementEmailModel": {
        "type": "object",
        "properties": {
          "audience": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAudience"
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "description": "Only used with Bookennis.Shared.Controller.ClubAnnouncements.ClubAnnouncementAudience.Roles.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailSettingsDto": {
        "type": "object",
        "properties": {
          "websiteUrl": {
            "type": "string",
            "nullable": true
          },
          "replyToEmail": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel": {
        "required": [
          "body",
          "language",
          "subject"
        ],
        "type": "object",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Language"
          },
          "subject": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "body": {
            "maxLength": 20000,
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateLanguageDto": {
        "required": [
          "body",
          "defaultBody",
          "defaultSubject",
          "isCustomized",
          "language",
          "subject",
          "variables"
        ],
        "type": "object",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Language"
          },
          "isCustomized": {
            "type": "boolean"
          },
          "subject": {
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          },
          "defaultSubject": {
            "type": "string",
            "nullable": true
          },
          "defaultBody": {
            "type": "string",
            "nullable": true
          },
          "variables": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailVariableDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateSummaryDto": {
        "required": [
          "customizedLanguages",
          "type"
        ],
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
          },
          "customizedLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Language"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType": {
        "enum": [
          "Welcome",
          "SeasonActivated",
          "BadgeAwarded",
          "BookingDeleted",
          "Announcement",
          "BookingAdded",
          "BookingReminder",
          "ClubEventCreated",
          "ClubEventReminder",
          "ClubEventRegistrationDeadline",
          "MembershipPaymentReceived",
          "MembershipApproved",
          "MembershipPaymentFailed",
          "MembershipNeedsAttention",
          "CourtPurchaseConfirmed",
          "CourtPurchaseFailed",
          "CourtPurchaseNeedsAttention",
          "CourtPurchaseCompensated",
          "ClubhouseTabPaid",
          "ClubhouseTabNeedsAttention"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailVariableDto": {
        "required": [
          "name",
          "sampleValue"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The Liquid path, e.g. `member.first_name`.",
            "nullable": true
          },
          "sampleValue": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.GetClubEmailTemplateResult": {
        "required": [
          "languages",
          "type"
        ],
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailType"
          },
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateLanguageDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.GetClubEmailTemplatesResult": {
        "required": [
          "settings",
          "templates"
        ],
        "type": "object",
        "properties": {
          "templates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateSummaryDto"
            },
            "nullable": true
          },
          "settings": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailSettingsDto"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.PreviewClubEmailTemplateResult": {
        "required": [
          "html",
          "subject"
        ],
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "nullable": true
          },
          "html": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailSettingsModel": {
        "type": "object",
        "properties": {
          "websiteUrl": {
            "maxLength": 500,
            "type": "string",
            "nullable": true
          },
          "replyToEmail": {
            "maxLength": 256,
            "type": "string",
            "format": "email",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEmailTemplates.UpdateClubEmailTemplateModel": {
        "required": [
          "languages"
        ],
        "type": "object",
        "properties": {
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEmailTemplates.ClubEmailTemplateContentModel"
            },
            "description": "The customized languages. Languages that are not part of the list use the default template."
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventAnswerDto": {
        "type": "object",
        "properties": {
          "optionId": {
            "type": "integer",
            "format": "int32"
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventCategory": {
        "enum": [
          "Other",
          "WorkEffort",
          "Social",
          "Tournament",
          "Meeting"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventDto": {
        "required": [
          "category",
          "id",
          "isDeadlinePassed",
          "isFull",
          "isOver",
          "isRegistrationOpen",
          "questions",
          "registrationEnabled",
          "registrations",
          "startDate",
          "title",
          "totalHeadCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Markdown, for the editor.",
            "nullable": true
          },
          "descriptionHtml": {
            "type": "string",
            "description": "The description rendered to sanitized html.",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventCategory"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "registrationEnabled": {
            "type": "boolean"
          },
          "maxParticipants": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "registrationDeadline": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "notifyMembers": {
            "type": "boolean"
          },
          "createdByName": {
            "type": "string",
            "nullable": true
          },
          "isRegistrationOpen": {
            "type": "boolean",
            "description": "Registration (or withdrawal) is currently possible: enabled, deadline not passed, event not over. Capacity is reported separately via Bookennis.Shared.Controller.ClubEvents.ClubEventDto.IsFull."
          },
          "isDeadlinePassed": {
            "type": "boolean"
          },
          "isOver": {
            "type": "boolean"
          },
          "isFull": {
            "type": "boolean"
          },
          "totalHeadCount": {
            "type": "integer",
            "format": "int32"
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventQuestionDto"
            },
            "nullable": true
          },
          "registrations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventRegistrationDto"
            },
            "nullable": true
          },
          "myRegistration": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventRegistrationDto"
          },
          "lastDate": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventOptionDto": {
        "required": [
          "id",
          "label",
          "total"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "total": {
            "type": "integer",
            "description": "Sum of the quantities over all registrations (number of registrations for questions without quantities).",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventQuestionDto": {
        "required": [
          "allowQuantities",
          "id",
          "isRequired",
          "limitQuantityToHeadCount",
          "options",
          "selectionMode",
          "text"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "text": {
            "type": "string",
            "nullable": true
          },
          "selectionMode": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventQuestionSelectionMode"
          },
          "isRequired": {
            "type": "boolean"
          },
          "allowQuantities": {
            "type": "boolean"
          },
          "limitQuantityToHeadCount": {
            "type": "boolean",
            "description": "With quantities: a quantity can't exceed the head count, otherwise up to 99."
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventOptionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventQuestionSelectionMode": {
        "enum": [
          "SingleChoice",
          "MultipleChoice"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventRegistrationDto": {
        "required": [
          "answers",
          "firstName",
          "headCount",
          "id",
          "lastName",
          "memberId",
          "registeredAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "headCount": {
            "type": "integer",
            "format": "int32"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "registeredAt": {
            "type": "string",
            "format": "date-time"
          },
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventAnswerDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.ClubEventSummaryDto": {
        "required": [
          "category",
          "id",
          "registrationCount",
          "registrationEnabled",
          "startDate",
          "title",
          "totalHeadCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventCategory"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "registrationEnabled": {
            "type": "boolean"
          },
          "maxParticipants": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "registrationDeadline": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "totalHeadCount": {
            "type": "integer",
            "format": "int32"
          },
          "registrationCount": {
            "type": "integer",
            "format": "int32"
          },
          "myHeadCount": {
            "type": "integer",
            "description": "Head count of the current member's registration, `null` if not registered.",
            "format": "int32",
            "nullable": true
          },
          "lastDate": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.GetClubEventsResult": {
        "required": [
          "events"
        ],
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventSummaryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionModel": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.PreviewClubEventDescriptionResult": {
        "required": [
          "html"
        ],
        "type": "object",
        "properties": {
          "html": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.RegisterForClubEventModel": {
        "type": "object",
        "properties": {
          "headCount": {
            "type": "integer",
            "description": "Number of people coming, including the member.",
            "format": "int32"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventAnswerDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.SaveClubEventModel": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Markdown.",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventCategory"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "registrationEnabled": {
            "type": "boolean"
          },
          "maxParticipants": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "registrationDeadline": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "notifyMembers": {
            "type": "boolean",
            "description": "Tell the club members about the event (when it is published and before the registration deadline)."
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventQuestionModel"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Create and update model of a club event. Questions and options without id are created, missing ones are removed.\nTexts are validated by the domain, so empty texts result in a localized error instead of a generic bad request."
      },
      "Bookennis.Shared.Controller.ClubEvents.SaveClubEventOptionModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubEvents.SaveClubEventQuestionModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "text": {
            "type": "string",
            "nullable": true
          },
          "selectionMode": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.ClubEventQuestionSelectionMode"
          },
          "isRequired": {
            "type": "boolean"
          },
          "allowQuantities": {
            "type": "boolean"
          },
          "limitQuantityToHeadCount": {
            "type": "boolean"
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.ClubEvents.SaveClubEventOptionModel"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubProfile.GetBookingOptionsResult": {
        "type": "object",
        "properties": {
          "isAllowedToBook": {
            "type": "boolean"
          },
          "isBookingOnlyForChildren": {
            "type": "boolean"
          },
          "eligibleChildMemberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "isActiveMember": {
            "type": "boolean",
            "description": "See `GetClubProfileResult.IsActiveMember`. Members who are not active may buy court time (`CourtSales/options`)."
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.ClubProfile.GetClubProfileResult": {
        "required": [
          "clubName",
          "memberId",
          "role"
        ],
        "type": "object",
        "properties": {
          "clubName": {
            "type": "string",
            "nullable": true
          },
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "role": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          },
          "isSupportMode": {
            "type": "boolean",
            "description": "An application administrator who is not a member of the club: Bookennis.Shared.Controller.ClubProfile.GetClubProfileResult.MemberId is 0 and everything that\nbelongs to a member (own bookings, statistics, registrations) is not available."
          },
          "isActiveMember": {
            "type": "boolean",
            "description": "The member may see the other members: enrolled in the active season, a parent of an enrolled child, a staff role (anything but\nUser), or support mode. Members who are not active see the booking calendar anonymized and have no leaderboard,\nstatistics, season review, subscription planner or profiles and trophy cases of others; they can buy court time."
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.CourtBlockings.CourtBlockingConflictDto": {
        "required": [
          "bookingId",
          "courtName",
          "interval",
          "players"
        ],
        "type": "object",
        "properties": {
          "bookingId": {
            "type": "integer",
            "format": "int32"
          },
          "courtName": {
            "type": "string",
            "nullable": true
          },
          "interval": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "An upcoming booking that would be deleted by a court blocking."
      },
      "Bookennis.Shared.Controller.CourtBlockings.CourtBlockingDto": {
        "required": [
          "courtIds",
          "endDate",
          "endTime",
          "id",
          "nextOccurrence",
          "occurrenceCount",
          "recurrenceEndDate",
          "recurrenceIntervalWeeks",
          "startDate",
          "startTime",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "courtIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "type": "string",
            "description": "Local start time of day; `null` for all day. See Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel for why it is no System.TimeOnly.",
            "format": "date-span",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "date-span",
            "nullable": true
          },
          "recurrenceIntervalWeeks": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "recurrenceEndDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "occurrenceCount": {
            "type": "integer",
            "format": "int32"
          },
          "nextOccurrence": {
            "type": "string",
            "description": "Start of the running or next blocked time window; `null` when the blocking is over.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A court blocking as it was entered, for the management page."
      },
      "Bookennis.Shared.Controller.CourtBlockings.CourtBlockingOccurrenceDto": {
        "required": [
          "courtBlockingId",
          "courtIds",
          "interval",
          "isRecurring",
          "title"
        ],
        "type": "object",
        "properties": {
          "courtBlockingId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "courtIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "interval": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.DateTimeOffsetInterval"
          },
          "isRecurring": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "A blocked time window for the booking grid."
      },
      "Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingConflictsResult": {
        "required": [
          "bookings"
        ],
        "type": "object",
        "properties": {
          "bookings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.CourtBlockingConflictDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingOccurrencesResult": {
        "required": [
          "occurrences"
        ],
        "type": "object",
        "properties": {
          "occurrences": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.CourtBlockingOccurrenceDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.CourtBlockings.GetCourtBlockingsResult": {
        "required": [
          "blockings"
        ],
        "type": "object",
        "properties": {
          "blockings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.CourtBlockings.CourtBlockingDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "courtIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "type": "string",
            "format": "date-span",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "date-span",
            "nullable": true
          },
          "timeZoneInfoId": {
            "type": "string",
            "nullable": true
          },
          "recurrenceIntervalWeeks": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "recurrenceEndDate": {
            "type": "string",
            "description": "Last day on which a repetition may start.",
            "format": "date",
            "nullable": true
          },
          "deleteConflictingBookings": {
            "type": "boolean",
            "description": "Confirms that the upcoming bookings in the blocked time are deleted and their players are notified."
          }
        },
        "additionalProperties": false,
        "description": "Create and update model of a court blocking. The blocking lasts from the start date and time until the end date and time\n(local times in Bookennis.Shared.Controller.CourtBlockings.SaveCourtBlockingModel.TimeZoneInfoId, both times `null` for all day) and is optionally repeated every n weeks.\nTexts are validated by the domain, so empty texts result in a localized error instead of a generic bad request.\nThe times are System.TimeSpans on purpose: the client serializes System.TimeOnly as UTC time of day, but these are local times."
      },
      "Bookennis.Shared.Controller.Families.AddChildRequest": {
        "type": "object",
        "properties": {
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.AddNewChildRequest": {
        "type": "object",
        "properties": {
          "birthday": {
            "type": "string",
            "format": "date"
          },
          "gender": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.AddParentRequest": {
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.CreateFamilyRequest": {
        "type": "object",
        "properties": {
          "parentContractUserIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "childrenUserContractIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "newChildUsers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.AddNewChildRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.FamilyChildDto": {
        "required": [
          "birthday",
          "firstName",
          "gender",
          "isOwnedAccount",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "isOwnedAccount": {
            "type": "boolean"
          },
          "birthday": {
            "type": "string",
            "format": "date"
          },
          "gender": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.FamilyDto": {
        "required": [
          "children",
          "familyId",
          "parents"
        ],
        "type": "object",
        "properties": {
          "familyId": {
            "type": "integer",
            "format": "int32"
          },
          "parents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyParentDto"
            },
            "nullable": true
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyChildDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.FamilyMemberDto": {
        "required": [
          "firstName",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.FamilyParentDto": {
        "required": [
          "firstName",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.GetAvailableFamilyMembersResult": {
        "required": [
          "availableMembers"
        ],
        "type": "object",
        "properties": {
          "availableMembers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyMemberDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.GetFamiliesResult": {
        "required": [
          "families"
        ],
        "type": "object",
        "properties": {
          "families": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.GetFamilyResult": {
        "required": [
          "children",
          "familyId",
          "parents"
        ],
        "type": "object",
        "properties": {
          "familyId": {
            "type": "integer",
            "format": "int32"
          },
          "parents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyParentDto"
            },
            "nullable": true
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Families.FamilyChildDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Families.UpdateOwnedChildRequest": {
        "type": "object",
        "properties": {
          "birthday": {
            "type": "string",
            "format": "date"
          },
          "gender": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Leaderboards.GetLeaderboardResult": {
        "required": [
          "allTime",
          "seasonLeaderboards"
        ],
        "type": "object",
        "properties": {
          "seasonLeaderboards": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.SeasonLeaderboardResult"
            },
            "nullable": true
          },
          "allTime": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.LeaderboardData"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Leaderboards.LeaderboardData": {
        "required": [
          "currentMemberDuration",
          "currentMemberRank",
          "entries"
        ],
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.LeaderboardEntry"
            },
            "nullable": true
          },
          "currentMemberRank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "currentMemberDuration": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "currentMemberEntry": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.LeaderboardEntry"
          },
          "hoursToNextRank": {
            "type": "number",
            "description": "Hours the current member is behind the player one rank above (null for rank 1 or unranked).",
            "format": "double",
            "nullable": true
          },
          "totalPlayers": {
            "type": "integer",
            "format": "int32"
          },
          "totalHours": {
            "type": "number",
            "format": "double"
          },
          "totalMatches": {
            "type": "integer",
            "description": "Number of played bookings (not participations).",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Leaderboards.LeaderboardEntry": {
        "required": [
          "firstName",
          "isCurrentMember",
          "lastName",
          "memberId",
          "rank",
          "totalHours"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "format": "int32"
          },
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "totalHours": {
            "type": "number",
            "format": "double"
          },
          "matches": {
            "type": "integer",
            "format": "int32"
          },
          "rankChange": {
            "type": "integer",
            "description": "Places gained (positive) or lost (negative) in the last 7 days, null for new entries.",
            "format": "int32",
            "nullable": true
          },
          "isCurrentMember": {
            "type": "boolean"
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeImageUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeLevel": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Leaderboards.SeasonLeaderboardResult": {
        "required": [
          "data",
          "endDate",
          "isOptedOut",
          "seasonId",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isOptedOut": {
            "type": "boolean"
          },
          "data": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Leaderboards.LeaderboardData"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Leaderboards.ToggleLeaderboardOptOutRequest": {
        "required": [
          "seasonId"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.ClubTrophiesDto": {
        "required": [
          "clubId",
          "clubName",
          "seasons"
        ],
        "type": "object",
        "properties": {
          "clubId": {
            "type": "integer",
            "format": "int32"
          },
          "clubName": {
            "type": "string",
            "nullable": true
          },
          "seasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.SeasonTrophiesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.EarnedBadgeDto": {
        "required": [
          "badgeTierId",
          "description",
          "earnedAt",
          "imageUrl",
          "level",
          "memberBadgeId",
          "name",
          "seasonFrom",
          "seasonId",
          "seasonLabel"
        ],
        "type": "object",
        "properties": {
          "memberBadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "badgeTierId": {
            "type": "integer",
            "format": "int32"
          },
          "level": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "earnedAt": {
            "type": "string",
            "format": "date-time"
          },
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "seasonFrom": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.GetMemberBadgeProgressResult": {
        "required": [
          "currentBadgeImageUrl",
          "currentBadgeLevel",
          "currentBadgeName",
          "currentBadgeTierId",
          "displayBadgeId",
          "displayOneTimeBadgeId",
          "earnedBadges",
          "matchCount",
          "nextBadgeImageUrl",
          "nextBadgeLevel",
          "nextBadgeMatchesRequired",
          "nextBadgeName",
          "nextBadgeTierId",
          "oneTimeBadges",
          "trophyCasePublic"
        ],
        "type": "object",
        "properties": {
          "matchCount": {
            "type": "integer",
            "format": "int32"
          },
          "currentBadgeTierId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "currentBadgeName": {
            "type": "string",
            "nullable": true
          },
          "currentBadgeLevel": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "currentBadgeImageUrl": {
            "type": "string",
            "nullable": true
          },
          "nextBadgeTierId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "nextBadgeName": {
            "type": "string",
            "nullable": true
          },
          "nextBadgeMatchesRequired": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "nextBadgeLevel": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "nextBadgeImageUrl": {
            "type": "string",
            "nullable": true
          },
          "earnedBadges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.EarnedBadgeDto"
            },
            "nullable": true
          },
          "oneTimeBadges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardDto"
            },
            "nullable": true
          },
          "displayBadgeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "displayOneTimeBadgeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "trophyCasePublic": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.GetMemberBadgesResult": {
        "required": [
          "badges",
          "oneTimeBadges"
        ],
        "type": "object",
        "properties": {
          "badges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.EarnedBadgeDto"
            },
            "nullable": true
          },
          "oneTimeBadges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.GetTrophyCaseResult": {
        "required": [
          "clubs",
          "isOwnProfile",
          "isPublic"
        ],
        "type": "object",
        "properties": {
          "isOwnProfile": {
            "type": "boolean"
          },
          "isPublic": {
            "type": "boolean"
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeImageUrl": {
            "type": "string",
            "nullable": true
          },
          "displayBadgeLevel": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "clubs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.ClubTrophiesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.SeasonTrophiesDto": {
        "required": [
          "badges",
          "oneTimeBadges",
          "seasonFrom",
          "seasonId",
          "seasonLabel"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "seasonFrom": {
            "type": "string",
            "format": "date"
          },
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "badges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.MemberBadges.EarnedBadgeDto"
            },
            "nullable": true
          },
          "oneTimeBadges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.MemberBadges.UpdateMemberBadgeSettingsModel": {
        "required": [
          "trophyCasePublic"
        ],
        "type": "object",
        "properties": {
          "displayBadgeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "displayOneTimeBadgeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "trophyCasePublic": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.AgeGroup": {
        "enum": [
          "Kids",
          "Teenagers",
          "Adults",
          "Seniors"
        ],
        "type": "string",
        "description": "Age groups as used in the club statistics."
      },
      "Bookennis.Shared.Controller.Members.GetMemberBookingHistoryResult": {
        "required": [
          "bookings"
        ],
        "type": "object",
        "properties": {
          "bookings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.BookingResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.GetMemberEmailsResult": {
        "required": [
          "emails"
        ],
        "type": "object",
        "properties": {
          "emails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.GetMemberOverviewResult": {
        "required": [
          "firstPlayed",
          "lastPlayed",
          "seasons",
          "totalBookings",
          "totalHours",
          "upcomingBookings"
        ],
        "type": "object",
        "properties": {
          "totalBookings": {
            "type": "integer",
            "format": "int32"
          },
          "totalHours": {
            "type": "number",
            "format": "double"
          },
          "firstPlayed": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastPlayed": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "upcomingBookings": {
            "type": "integer",
            "format": "int32"
          },
          "seasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.MemberSeasonOverview"
            },
            "description": "All seasons of the club, newest first.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.GetMembersResult": {
        "required": [
          "entities",
          "page",
          "total"
        ],
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "entities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.MemberResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.GetMembersSummaryResult": {
        "required": [
          "activeSeasonId",
          "activeSeasonMembers",
          "lapsedMembers",
          "newMembers",
          "previousSeasonId",
          "totalMembers",
          "withoutEmail"
        ],
        "type": "object",
        "properties": {
          "totalMembers": {
            "type": "integer",
            "format": "int32"
          },
          "activeSeasonId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "previousSeasonId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "activeSeasonMembers": {
            "type": "integer",
            "description": "Members enrolled in the active season.",
            "format": "int32"
          },
          "newMembers": {
            "type": "integer",
            "description": "Members of the active season that were not enrolled in the previous season.",
            "format": "int32"
          },
          "lapsedMembers": {
            "type": "integer",
            "description": "Members of the previous season that are not enrolled in the active season.",
            "format": "int32"
          },
          "withoutEmail": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.MemberProfileResult": {
        "required": [
          "firstName",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "What every member may know about another player: who it is. Nothing else (email, birthday, roles, seasons) is part of it,\nthat is only in Bookennis.Shared.Controller.Members.MembersDetailResult for the member themself and for those who manage the members."
      },
      "Bookennis.Shared.Controller.Members.MemberResult": {
        "required": [
          "allowedSeasonIds",
          "birthday",
          "bookingsPerWeek",
          "email",
          "familyId",
          "firstName",
          "fullName",
          "gender",
          "lastName",
          "memberId",
          "roles"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "familyId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "fullName": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "gender": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
          },
          "birthday": {
            "type": "string",
            "format": "date"
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          },
          "allowedSeasonIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "paidSeasonIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "The seasons the member was enrolled in by a membership order (paid online, marked as paid or a free plan), not by hand.",
            "nullable": true
          },
          "bookingsPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "maxBookingsPerWeek": {
            "type": "integer",
            "description": "The most bookings per week the club allows (the server refuses more).",
            "format": "int32"
          },
          "contactEmail": {
            "type": "string",
            "description": "The member's email or, for children without an email, the email of a parent.",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "lastPlayed": {
            "type": "string",
            "description": "Start of the last booking that already took place.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.MemberSeasonEnrollment": {
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "source": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipEnrollmentSource"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.MemberSeasonOverview": {
        "required": [
          "badges",
          "bookings",
          "endDate",
          "hours",
          "isEnrolled",
          "seasonId",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isEnrolled": {
            "type": "boolean"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "badges": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.MembersDetailResult": {
        "required": [
          "allowedSeasonIds",
          "birthday",
          "bookingsPerWeek",
          "email",
          "familyId",
          "firstName",
          "fullName",
          "gender",
          "lastName",
          "memberId",
          "roles"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "familyId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "fullName": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "gender": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.Gender"
          },
          "birthday": {
            "type": "string",
            "format": "date"
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          },
          "allowedSeasonIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "paidSeasonIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "The seasons the member was enrolled in by a membership order (paid online, marked as paid or a free plan), not by hand.",
            "nullable": true
          },
          "bookingsPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "maxBookingsPerWeek": {
            "type": "integer",
            "description": "The most bookings per week the club allows (the server refuses more).",
            "format": "int32"
          },
          "contactEmail": {
            "type": "string",
            "description": "The member's email or, for children without an email, the email of a parent.",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "lastPlayed": {
            "type": "string",
            "description": "Start of the last booking that already took place.",
            "format": "date-time",
            "nullable": true
          },
          "seasonEnrollments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Members.MemberSeasonEnrollment"
            },
            "description": "How the member got into each season they are enrolled in.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.UpdateMemberBookingOptionsRequest": {
        "type": "object",
        "properties": {
          "allowedSeasonIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "bookingsPerWeek": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Members.UpdateMemberRolesRequest": {
        "required": [
          "roles"
        ],
        "type": "object",
        "properties": {
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Shared.MemberRole"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.ApproveMembershipOrderModel": {
        "type": "object",
        "properties": {
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Who the order covers from now on; `null` leaves the members as the member chose them.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.CopyMembershipPlansModel": {
        "type": "object",
        "properties": {
          "sourceSeasonId": {
            "type": "integer",
            "format": "int32"
          },
          "targetSeasonId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Copies all plans of a season into another one. Birth years and dates move by the difference of the season years."
      },
      "Bookennis.Shared.Controller.Memberships.CreateMembershipOrderModel": {
        "type": "object",
        "properties": {
          "membershipPlanId": {
            "type": "integer",
            "format": "int32"
          },
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "The members the order covers: the caller, or members of the family the caller is a parent of.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.GetMembershipOptionsResult": {
        "required": [
          "onlinePaymentAvailable",
          "orders",
          "people",
          "plans",
          "seasonEnd",
          "seasonId",
          "seasonStart"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "description": "`null` when the club has no running or upcoming season; the lists are empty then.",
            "format": "int32",
            "nullable": true
          },
          "seasonStart": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "seasonEnd": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "onlinePaymentAvailable": {
            "type": "boolean",
            "description": "The club takes online payments. Otherwise the fee is paid to the club directly and the treasurer records it."
          },
          "people": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPersonDto"
            },
            "description": "The caller and, for a parent, the members of the family: the people an order can cover.",
            "nullable": true
          },
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPlanOptionDto"
            },
            "nullable": true
          },
          "orders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderDto"
            },
            "description": "The orders of the season that cover or were paid by one of the Bookennis.Shared.Controller.Memberships.GetMembershipOptionsResult.People, newest first.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "What a member can choose for a season: the plans, for whom, and the orders that already exist."
      },
      "Bookennis.Shared.Controller.Memberships.GetMembershipPaymentsResult": {
        "required": [
          "members",
          "orders",
          "seasonId"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentMemberDto"
            },
            "nullable": true
          },
          "orders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentOrderDto"
            },
            "description": "The orders of the season, newest first. With a status filter only the orders in that status.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The treasurer's view of a season: every member of the club and every membership order.\nIt is the only list of members a treasurer gets, so it carries names, plan and payment and nothing else about a person."
      },
      "Bookennis.Shared.Controller.Memberships.GetMembershipPaymentsSummaryResult": {
        "required": [
          "currency",
          "membersEnrolled",
          "membersPaid",
          "membersTotal",
          "openCents",
          "ordersByStatus",
          "processingCents",
          "receivedCents"
        ],
        "type": "object",
        "properties": {
          "receivedCents": {
            "type": "integer",
            "description": "The sum of the paid orders in cents.",
            "format": "int64"
          },
          "processingCents": {
            "type": "integer",
            "description": "The sum of the orders with a debit on its way.",
            "format": "int64"
          },
          "openCents": {
            "type": "integer",
            "description": "The sum of the orders that wait for a confirmation or a payment, or whose payment failed.",
            "format": "int64"
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "membersPaid": {
            "type": "integer",
            "description": "Members covered by an order that is paid or being paid.",
            "format": "int32"
          },
          "membersEnrolled": {
            "type": "integer",
            "format": "int32"
          },
          "membersTotal": {
            "type": "integer",
            "format": "int32"
          },
          "ordersByStatus": {
            "type": "object",
            "properties": {
              "AwaitingApproval": {
                "type": "integer",
                "format": "int32"
              },
              "AwaitingPayment": {
                "type": "integer",
                "format": "int32"
              },
              "Processing": {
                "type": "integer",
                "format": "int32"
              },
              "Paid": {
                "type": "integer",
                "format": "int32"
              },
              "Failed": {
                "type": "integer",
                "format": "int32"
              },
              "Cancelled": {
                "type": "integer",
                "format": "int32"
              },
              "Refunded": {
                "type": "integer",
                "format": "int32"
              },
              "Disputed": {
                "type": "integer",
                "format": "int32"
              }
            },
            "additionalProperties": false,
            "description": "The number of orders per status.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.GetMembershipPlansResult": {
        "required": [
          "plans"
        ],
        "type": "object",
        "properties": {
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPlanDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MarkMembershipOrderPaidModel": {
        "type": "object",
        "properties": {
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Who the order covers from now on; `null` leaves the members as the member chose them.",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentMethod"
          },
          "paidOn": {
            "type": "string",
            "format": "date"
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipEnrollmentSource": {
        "enum": [
          "NotEnrolled",
          "ByHand",
          "PaidOnline",
          "MarkedAsPaid"
        ],
        "type": "string",
        "description": "How a member got into the season."
      },
      "Bookennis.Shared.Controller.Memberships.MembershipOrderDto": {
        "required": [
          "amountCents",
          "approvedAt",
          "canCancel",
          "canPay",
          "createdAt",
          "currency",
          "grantsSeasonEnrollment",
          "id",
          "members",
          "membershipPlanId",
          "paidAt",
          "payerMemberId",
          "payerName",
          "paymentMethod",
          "planName",
          "seasonId",
          "status"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "membershipPlanId": {
            "type": "integer",
            "format": "int32"
          },
          "planName": {
            "type": "string",
            "nullable": true
          },
          "amountCents": {
            "type": "integer",
            "format": "int32"
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderStatus"
          },
          "paymentMethod": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentMethod"
          },
          "payerMemberId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "payerName": {
            "type": "string",
            "nullable": true
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderMemberDto"
            },
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "approvedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "grantsSeasonEnrollment": {
            "type": "boolean",
            "description": "`false` for passive memberships: paying does not enroll in the season."
          },
          "canPay": {
            "type": "boolean",
            "description": "The order waits for its payment (or the last attempt failed) and can be paid or, when free, confirmed."
          },
          "canCancel": {
            "type": "boolean",
            "description": "Nothing was paid yet, so the member can withdraw the order."
          },
          "isFree": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipOrderMemberDto": {
        "required": [
          "firstName",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipOrderStatus": {
        "enum": [
          "AwaitingApproval",
          "AwaitingPayment",
          "Processing",
          "Paid",
          "Failed",
          "Cancelled",
          "Refunded",
          "Disputed"
        ],
        "type": "string",
        "description": "Keep in sync with `Bookennis.Domain.Memberships.MembershipOrderStatus`."
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPaymentMemberDto": {
        "required": [
          "enrollment",
          "familyId",
          "firstName",
          "isChild",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "familyId": {
            "type": "integer",
            "description": "The family of the member, to record a payment for a couple or a family.",
            "format": "int32",
            "nullable": true
          },
          "isChild": {
            "type": "boolean"
          },
          "enrollment": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipEnrollmentSource"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPaymentMethod": {
        "enum": [
          "Online",
          "BankTransfer",
          "Cash",
          "Other"
        ],
        "type": "string",
        "description": "Keep in sync with `Bookennis.Domain.Memberships.MembershipPaymentMethod`."
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPaymentOrderDto": {
        "required": [
          "amountCents",
          "createdAt",
          "currency",
          "id",
          "memberIds",
          "membershipPlanId",
          "note",
          "paidAt",
          "payerMemberId",
          "paymentMethod",
          "planName",
          "status"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "membershipPlanId": {
            "type": "integer",
            "format": "int32"
          },
          "planName": {
            "type": "string",
            "nullable": true
          },
          "amountCents": {
            "type": "integer",
            "format": "int32"
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipOrderStatus"
          },
          "paymentMethod": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentMethod"
          },
          "payerMemberId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "note": {
            "type": "string",
            "description": "Written by the treasurers, never shown to the member.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPersonDto": {
        "required": [
          "firstName",
          "hasMembership",
          "isChild",
          "isEnrolled",
          "isMe",
          "lastName",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "isMe": {
            "type": "boolean"
          },
          "isChild": {
            "type": "boolean"
          },
          "isEnrolled": {
            "type": "boolean",
            "description": "Enrolled in the season, by an order or by hand."
          },
          "hasMembership": {
            "type": "boolean",
            "description": "Covered by an order of the season that is not cancelled, failed or refunded."
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPlanChoiceDto": {
        "required": [
          "isEligible",
          "memberIds",
          "reasons"
        ],
        "type": "object",
        "properties": {
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "isEligible": {
            "type": "boolean"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Why the plan can't be chosen (error codes, e.g. `BirthYearOutOfRange`); empty when it can.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPlanDto": {
        "required": [
          "availableFrom",
          "availableUntil",
          "birthYearFrom",
          "birthYearTo",
          "currency",
          "description",
          "grantsSeasonEnrollment",
          "id",
          "includesChildren",
          "isSelfService",
          "maxAdults",
          "name",
          "newMembersOnly",
          "orderCount",
          "priceCents",
          "requiresApproval",
          "requiresEnrolledFamilyAdult",
          "seasonId",
          "sortOrder"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Plain text.",
            "nullable": true
          },
          "priceCents": {
            "type": "integer",
            "description": "The price of one order in cents, however many members it covers. 0 is a free plan.",
            "format": "int32"
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "maxAdults": {
            "type": "integer",
            "description": "1 or 2. Together with Bookennis.Shared.Controller.Memberships.MembershipPlanDto.IncludesChildren: 1 / false = one member, 2 / false = a couple, otherwise a family.",
            "format": "int32"
          },
          "includesChildren": {
            "type": "boolean"
          },
          "birthYearFrom": {
            "type": "integer",
            "description": "Oldest birth year the plan is for (inclusive). For couples and families it applies to the adults.",
            "format": "int32",
            "nullable": true
          },
          "birthYearTo": {
            "type": "integer",
            "description": "Youngest birth year the plan is for (inclusive).",
            "format": "int32",
            "nullable": true
          },
          "requiresApproval": {
            "type": "boolean",
            "description": "The treasurer confirms the order before the member can pay."
          },
          "newMembersOnly": {
            "type": "boolean"
          },
          "requiresEnrolledFamilyAdult": {
            "type": "boolean",
            "description": "Only when another adult of the member's family has a membership in the season."
          },
          "grantsSeasonEnrollment": {
            "type": "boolean",
            "description": "`false` for passive members: paying does not enroll in the season."
          },
          "availableFrom": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "availableUntil": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "isSelfService": {
            "type": "boolean",
            "description": "Members choose the plan themselves. Switched off, only the treasurer assigns it."
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "orderCount": {
            "type": "integer",
            "description": "The number of orders of the plan; only filled for treasurers. A plan with orders can't be deleted.",
            "format": "int32"
          },
          "isGroupPlan": {
            "type": "boolean"
          },
          "isFree": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "A line of the club's price list for one season."
      },
      "Bookennis.Shared.Controller.Memberships.MembershipPlanOptionDto": {
        "required": [
          "choices",
          "plan"
        ],
        "type": "object",
        "properties": {
          "plan": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPlanDto"
          },
          "choices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPlanChoiceDto"
            },
            "description": "For whom the plan could be ordered: one choice per person for a plan for one member,\none choice with the whole family for a couple or family plan.",
            "nullable": true
          },
          "isEligible": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Memberships.PaymentAccountDto": {
        "required": [
          "chargesEnabled",
          "connectedAt",
          "detailsSubmitted",
          "isAvailable",
          "isConnected",
          "payoutsEnabled"
        ],
        "type": "object",
        "properties": {
          "isAvailable": {
            "type": "boolean"
          },
          "isConnected": {
            "type": "boolean"
          },
          "chargesEnabled": {
            "type": "boolean"
          },
          "payoutsEnabled": {
            "type": "boolean"
          },
          "detailsSubmitted": {
            "type": "boolean",
            "description": "The club went through Stripe's onboarding form. Stripe may still be checking the details."
          },
          "connectedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The Stripe account of the club."
      },
      "Bookennis.Shared.Controller.Memberships.PaymentConfigurationResult": {
        "required": [
          "canAcceptPayments",
          "isAvailable",
          "isConnected"
        ],
        "type": "object",
        "properties": {
          "isAvailable": {
            "type": "boolean",
            "description": "The installation has Stripe keys. Without them the online part is switched off everywhere."
          },
          "isConnected": {
            "type": "boolean",
            "description": "The club has connected a Stripe account."
          },
          "canAcceptPayments": {
            "type": "boolean",
            "description": "The connected account finished its onboarding and can take payments."
          }
        },
        "additionalProperties": false,
        "description": "Whether membership fees can be paid online in this club."
      },
      "Bookennis.Shared.Controller.Memberships.RecordMembershipPaymentModel": {
        "type": "object",
        "properties": {
          "membershipPlanId": {
            "type": "integer",
            "format": "int32"
          },
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "payerMemberId": {
            "type": "integer",
            "description": "Who paid; one of the members by default.",
            "format": "int32",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Memberships.MembershipPaymentMethod"
          },
          "paidOn": {
            "type": "string",
            "format": "date"
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A fee the treasurer received outside of Clubnetz (bank transfer, cash): creates a paid order and enrolls the members."
      },
      "Bookennis.Shared.Controller.Memberships.SaveMembershipPlanModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "priceCents": {
            "type": "integer",
            "format": "int32"
          },
          "maxAdults": {
            "type": "integer",
            "format": "int32"
          },
          "includesChildren": {
            "type": "boolean"
          },
          "birthYearFrom": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "birthYearTo": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "requiresApproval": {
            "type": "boolean"
          },
          "newMembersOnly": {
            "type": "boolean"
          },
          "requiresEnrolledFamilyAdult": {
            "type": "boolean"
          },
          "grantsSeasonEnrollment": {
            "type": "boolean"
          },
          "availableFrom": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "availableUntil": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "isSelfService": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Create and update model of a membership plan. Texts and numbers are validated by the domain,\nso invalid values result in a localized error instead of a generic bad request."
      },
      "Bookennis.Shared.Controller.Memberships.SortMembershipPlansModel": {
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "planIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The ids of the plans of a season in the order members should see them."
      },
      "Bookennis.Shared.Controller.Memberships.StartMembershipCheckoutResult": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The address of the payment page the member is sent to."
      },
      "Bookennis.Shared.Controller.OneTimeBadges.AwardOneTimeBadgeModel": {
        "type": "object",
        "properties": {
          "memberIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.CopyOneTimeBadgesModel": {
        "type": "object",
        "properties": {
          "sourceSeasonId": {
            "type": "integer",
            "format": "int32"
          },
          "targetSeasonId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.CreateOneTimeBadgeModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.GetOneTimeBadgesResult": {
        "required": [
          "badges"
        ],
        "type": "object",
        "properties": {
          "badges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.GetSeasonClubMembersResult": {
        "type": "object",
        "properties": {
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Booking.Shared.PlayerResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardDto": {
        "required": [
          "awardedAt",
          "description",
          "imageUrl",
          "memberOneTimeBadgeId",
          "name",
          "oneTimeBadgeId",
          "seasonFrom",
          "seasonId",
          "seasonLabel"
        ],
        "type": "object",
        "properties": {
          "memberOneTimeBadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "oneTimeBadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "awardedAt": {
            "type": "string",
            "format": "date-time"
          },
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "seasonFrom": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardeeDto": {
        "required": [
          "awardedAt",
          "firstName",
          "lastName",
          "memberId",
          "memberOneTimeBadgeId"
        ],
        "type": "object",
        "properties": {
          "memberOneTimeBadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "awardedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeDto": {
        "required": [
          "awardees",
          "description",
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "awardees": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.OneTimeBadges.OneTimeBadgeAwardeeDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.OneTimeBadges.UpdateOneTimeBadgeModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Shared.Gender": {
        "enum": [
          "Male",
          "Female",
          "Diverse"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Shared.Language": {
        "enum": [
          "German",
          "English"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Shared.MemberRole": {
        "enum": [
          "User",
          "Maintainer",
          "Admin",
          "SportsDirector",
          "YouthSportsDirector",
          "Trainer",
          "Guest",
          "Treasurer",
          "ClubhouseHost"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Shared.PrimeTimeSettingsDto": {
        "required": [
          "applicableWeekdays",
          "childAgeThreshold",
          "isEnabled",
          "primeTimeHours",
          "restrictChildren",
          "restrictGuests"
        ],
        "type": "object",
        "properties": {
          "isEnabled": {
            "type": "boolean"
          },
          "primeTimeHours": {
            "$ref": "#/components/schemas/Bookennis.Global.Intervals.TimeOnlyInterval"
          },
          "applicableWeekdays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/System.DayOfWeek"
            },
            "nullable": true
          },
          "restrictChildren": {
            "type": "boolean"
          },
          "restrictGuests": {
            "type": "boolean"
          },
          "childAgeThreshold": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ActivityBucket": {
        "required": [
          "category",
          "members"
        ],
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ActivityBucketCategory"
          },
          "members": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ActivityBucketCategory": {
        "enum": [
          "None",
          "One",
          "TwoToFive",
          "SixToTen",
          "ElevenToTwenty",
          "MoreThanTwenty"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Statistics.BusiestDayEntry": {
        "required": [
          "bookings",
          "date",
          "hours"
        ],
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ChartEntry": {
        "required": [
          "label",
          "value"
        ],
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubAllTimeStatisticsResult": {
        "required": [
          "bookingBehavior",
          "matchBookingBehavior",
          "occupancy",
          "playModeUsage",
          "seasons",
          "topMatchPlayers",
          "topPlayers",
          "totals",
          "weekdayActivity"
        ],
        "type": "object",
        "properties": {
          "totals": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubAllTimeTotals"
          },
          "occupancy": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubOccupancyResult"
          },
          "seasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubSeasonSummary"
            },
            "description": "One entry per season, oldest first.",
            "nullable": true
          },
          "playModeUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PlayModeUsageEntry"
            },
            "nullable": true
          },
          "weekdayActivity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeekdayActivityEntry"
            },
            "nullable": true
          },
          "topPlayers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.TopPlayerEntry"
            },
            "nullable": true
          },
          "topMatchPlayers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.TopPlayerEntry"
            },
            "description": "Top players counting only bookings of play modes that count as match.",
            "nullable": true
          },
          "bookingBehavior": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubBookingBehaviorResult"
          },
          "matchBookingBehavior": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubBookingBehaviorResult"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubAllTimeTotals": {
        "required": [
          "averagePlayersPerBooking",
          "bookings",
          "distinctMembers",
          "distinctPlayers",
          "firstSeasonStart",
          "hours",
          "seasons"
        ],
        "type": "object",
        "properties": {
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "distinctPlayers": {
            "type": "integer",
            "format": "int32"
          },
          "distinctMembers": {
            "type": "integer",
            "format": "int32"
          },
          "seasons": {
            "type": "integer",
            "format": "int32"
          },
          "firstSeasonStart": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "averagePlayersPerBooking": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubBookingBehaviorResult": {
        "required": [
          "bookings",
          "leadTimes",
          "primeTimeHoursShare",
          "recurringBookings"
        ],
        "type": "object",
        "properties": {
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "recurringBookings": {
            "type": "integer",
            "format": "int32"
          },
          "primeTimeHoursShare": {
            "type": "number",
            "description": "Share of played hours in prime time (0-100), null if prime time is disabled.",
            "format": "double",
            "nullable": true
          },
          "leadTimes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.LeadTimeBucket"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubComparison": {
        "required": [
          "betterThanPercentage",
          "clubAverageBookings",
          "enrolledMembers"
        ],
        "type": "object",
        "properties": {
          "clubAverageBookings": {
            "type": "number",
            "description": "Average bookings of all club members enrolled in the season (including the member).",
            "format": "double"
          },
          "betterThanPercentage": {
            "type": "integer",
            "description": "Share (0–100) of the other enrolled members who played fewer bookings than the member.",
            "format": "int32"
          },
          "enrolledMembers": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubMemberActivityResult": {
        "required": [
          "activationRate",
          "activePlayers",
          "bookingsPerPlayer",
          "enrolledMembers",
          "guestPlayers",
          "lapsedMembers",
          "newMembers",
          "returningMembers",
          "topMatchPlayers",
          "topPlayers"
        ],
        "type": "object",
        "properties": {
          "enrolledMembers": {
            "type": "integer",
            "format": "int32"
          },
          "activePlayers": {
            "type": "integer",
            "description": "Enrolled club members with at least one played booking.",
            "format": "int32"
          },
          "activationRate": {
            "type": "number",
            "description": "Share of enrolled members that played at least once (0-100).",
            "format": "double"
          },
          "guestPlayers": {
            "type": "integer",
            "format": "int32"
          },
          "returningMembers": {
            "type": "integer",
            "format": "int32"
          },
          "newMembers": {
            "type": "integer",
            "format": "int32"
          },
          "lapsedMembers": {
            "type": "integer",
            "description": "Members of the previous season that are not enrolled in this season.",
            "format": "int32"
          },
          "bookingsPerPlayer": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ActivityBucket"
            },
            "nullable": true
          },
          "topPlayers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.TopPlayerEntry"
            },
            "nullable": true
          },
          "topMatchPlayers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.TopPlayerEntry"
            },
            "description": "Top players counting only bookings of play modes that count as match.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubOccupancyResult": {
        "required": [
          "courtHeatmaps",
          "days",
          "overallPercentage",
          "primeTimePercentage",
          "weekdayHeatmaps"
        ],
        "type": "object",
        "properties": {
          "days": {
            "type": "integer",
            "description": "Number of days the occupancy is based on.",
            "format": "int32"
          },
          "overallPercentage": {
            "type": "number",
            "description": "Occupancy of all courts during the opening hours.",
            "format": "double"
          },
          "primeTimePercentage": {
            "type": "number",
            "description": "Occupancy of all courts during prime time, null if prime time is disabled.",
            "format": "double",
            "nullable": true
          },
          "courtHeatmaps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.CourtHeatmapResult"
            },
            "nullable": true
          },
          "weekdayHeatmaps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeekdayHeatmapResult"
            },
            "description": "Occupancy of all courts per weekday and hour, Monday first.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubPlayStatsResult": {
        "required": [
          "averageHoursPerDay",
          "averagePlayersPerBooking",
          "bookingBehavior",
          "busiestDay",
          "days3To5Hours",
          "days5To10Hours",
          "daysOver10Hours",
          "daysUnder3Hours",
          "daysWithoutBookings",
          "matchBookingBehavior",
          "playModeUsage",
          "recurringBookings",
          "totalBookings",
          "totalPlaytimeHours",
          "upcomingBookings",
          "weekdayActivity",
          "weeklyActivity"
        ],
        "type": "object",
        "properties": {
          "totalBookings": {
            "type": "integer",
            "description": "Bookings that already took place (up to today).",
            "format": "int32"
          },
          "totalPlaytimeHours": {
            "type": "number",
            "format": "double"
          },
          "upcomingBookings": {
            "type": "integer",
            "description": "Bookings of the season after today.",
            "format": "int32"
          },
          "recurringBookings": {
            "type": "integer",
            "format": "int32"
          },
          "averagePlayersPerBooking": {
            "type": "number",
            "format": "double"
          },
          "averageHoursPerDay": {
            "type": "number",
            "format": "double"
          },
          "busiestDay": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.BusiestDayEntry"
          },
          "daysWithoutBookings": {
            "type": "integer",
            "format": "int32"
          },
          "daysUnder3Hours": {
            "type": "integer",
            "format": "int32"
          },
          "days3To5Hours": {
            "type": "integer",
            "format": "int32"
          },
          "days5To10Hours": {
            "type": "integer",
            "format": "int32"
          },
          "daysOver10Hours": {
            "type": "integer",
            "format": "int32"
          },
          "playModeUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PlayModeUsageEntry"
            },
            "nullable": true
          },
          "weekdayActivity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeekdayActivityEntry"
            },
            "nullable": true
          },
          "weeklyActivity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeeklyActivityEntry"
            },
            "nullable": true
          },
          "bookingBehavior": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubBookingBehaviorResult"
          },
          "matchBookingBehavior": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubBookingBehaviorResult"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubPrimeTimeInfo": {
        "required": [
          "fromHour",
          "toHour",
          "weekdays"
        ],
        "type": "object",
        "properties": {
          "fromHour": {
            "type": "integer",
            "format": "int32"
          },
          "toHour": {
            "type": "integer",
            "format": "int32"
          },
          "weekdays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/System.DayOfWeek"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubSeasonStatisticsResult": {
        "required": [
          "elapsedDays",
          "endDate",
          "memberActivity",
          "memberDemographics",
          "occupancy",
          "playStats",
          "previousSeasonPace",
          "seasonId",
          "seasonLabel",
          "seasonLengthDays",
          "startDate",
          "state"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.SeasonState"
          },
          "seasonLengthDays": {
            "type": "integer",
            "description": "Total length of the season in days.",
            "format": "int32"
          },
          "elapsedDays": {
            "type": "integer",
            "description": "Days of the season up to and including today. Occupancy and day statistics are based on these days.",
            "format": "int32"
          },
          "occupancy": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubOccupancyResult"
          },
          "memberDemographics": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.MemberDemographicsResult"
          },
          "playStats": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubPlayStatsResult"
          },
          "memberActivity": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubMemberActivityResult"
          },
          "previousSeasonPace": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.SeasonPaceComparison"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.ClubSeasonSummary": {
        "required": [
          "activationRate",
          "activePlayers",
          "bookings",
          "demographics",
          "enrolledMembers",
          "hours",
          "lapsedMembers",
          "newMembers",
          "occupancyPercentage",
          "returningMembers",
          "seasonId",
          "seasonLabel",
          "state"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.SeasonState"
          },
          "enrolledMembers": {
            "type": "integer",
            "format": "int32"
          },
          "activePlayers": {
            "type": "integer",
            "format": "int32"
          },
          "activationRate": {
            "type": "number",
            "format": "double"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "occupancyPercentage": {
            "type": "number",
            "format": "double"
          },
          "newMembers": {
            "type": "integer",
            "format": "int32"
          },
          "returningMembers": {
            "type": "integer",
            "format": "int32"
          },
          "lapsedMembers": {
            "type": "integer",
            "format": "int32"
          },
          "demographics": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.MemberDemographicsResult"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.CourtHeatmapResult": {
        "required": [
          "bookedHours",
          "courtName",
          "courtSortOrder",
          "hours",
          "occupancyPercentage"
        ],
        "type": "object",
        "properties": {
          "courtName": {
            "type": "string",
            "nullable": true
          },
          "courtSortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "occupancyPercentage": {
            "type": "number",
            "format": "double"
          },
          "bookedHours": {
            "type": "number",
            "format": "double"
          },
          "hours": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.HeatmapHourResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.DayActivity": {
        "required": [
          "count",
          "date"
        ],
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.GetClubStatisticsResult": {
        "required": [
          "allTime",
          "openingHourFrom",
          "openingHourTo",
          "primeTime",
          "seasonStatistics",
          "today"
        ],
        "type": "object",
        "properties": {
          "seasonStatistics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubSeasonStatisticsResult"
            },
            "description": "Seasons, newest first.",
            "nullable": true
          },
          "allTime": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubAllTimeStatisticsResult"
          },
          "today": {
            "type": "string",
            "description": "The date the statistics were calculated for. Days after it are not counted yet.",
            "format": "date"
          },
          "openingHourFrom": {
            "type": "integer",
            "format": "int32"
          },
          "openingHourTo": {
            "type": "integer",
            "format": "int32"
          },
          "primeTime": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubPrimeTimeInfo"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.GetMemberStatisticsResult": {
        "required": [
          "allTime",
          "seasonStatistics"
        ],
        "type": "object",
        "properties": {
          "seasonStatistics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.SeasonStatisticsResult"
            },
            "nullable": true
          },
          "allTime": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.StatisticsData"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.HeatmapHourResult": {
        "required": [
          "bookedHours",
          "hour",
          "occupancyPercentage"
        ],
        "type": "object",
        "properties": {
          "hour": {
            "type": "integer",
            "format": "int32"
          },
          "occupancyPercentage": {
            "type": "number",
            "format": "double"
          },
          "bookedHours": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.LeadTimeBucket": {
        "required": [
          "bookings",
          "category"
        ],
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.LeadTimeCategory"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.LeadTimeCategory": {
        "enum": [
          "LessThanADay",
          "OneToTwoDays",
          "ThreeToSevenDays",
          "MoreThanAWeek"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Statistics.MemberDemographicsResult": {
        "required": [
          "averageAge",
          "femaleKids",
          "femaleMembers",
          "femaleSeniors",
          "femaleTeenagers",
          "maleKids",
          "maleMembers",
          "maleSeniors",
          "maleTeenagers",
          "newMembers"
        ],
        "type": "object",
        "properties": {
          "maleKids": {
            "type": "integer",
            "format": "int32"
          },
          "femaleKids": {
            "type": "integer",
            "format": "int32"
          },
          "maleTeenagers": {
            "type": "integer",
            "format": "int32"
          },
          "femaleTeenagers": {
            "type": "integer",
            "format": "int32"
          },
          "maleMembers": {
            "type": "integer",
            "format": "int32"
          },
          "femaleMembers": {
            "type": "integer",
            "format": "int32"
          },
          "maleSeniors": {
            "type": "integer",
            "format": "int32"
          },
          "femaleSeniors": {
            "type": "integer",
            "format": "int32"
          },
          "newMembers": {
            "type": "integer",
            "format": "int32"
          },
          "averageAge": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "totalMembers": {
            "type": "integer",
            "format": "int32"
          },
          "totalMale": {
            "type": "integer",
            "format": "int32"
          },
          "totalFemale": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.MonthRecord": {
        "required": [
          "count",
          "month",
          "year"
        ],
        "type": "object",
        "properties": {
          "year": {
            "type": "integer",
            "format": "int32"
          },
          "month": {
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.PartnerEntry": {
        "required": [
          "count",
          "firstName",
          "lastName",
          "memberId",
          "profilePictureUrl"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.PlayModeQuotaEntry": {
        "required": [
          "maxBookingsPerSeason",
          "playModeName",
          "usedBookings"
        ],
        "type": "object",
        "properties": {
          "playModeName": {
            "type": "string",
            "nullable": true
          },
          "maxBookingsPerSeason": {
            "type": "integer",
            "format": "int32"
          },
          "usedBookings": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.PlayModeUsageEntry": {
        "required": [
          "bookings",
          "color",
          "hours",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.PlayerType": {
        "enum": [
          "EarlyBird",
          "AfternoonAce",
          "NightOwl",
          "WeekendWarrior",
          "AllRounder"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Statistics.SeasonPaceComparison": {
        "required": [
          "activePlayersAtSamePoint",
          "bookingsAtSamePoint",
          "hoursAtSamePoint",
          "seasonLabel",
          "totalHours"
        ],
        "type": "object",
        "properties": {
          "seasonLabel": {
            "type": "string",
            "nullable": true
          },
          "hoursAtSamePoint": {
            "type": "number",
            "format": "double"
          },
          "bookingsAtSamePoint": {
            "type": "integer",
            "format": "int32"
          },
          "activePlayersAtSamePoint": {
            "type": "integer",
            "format": "int32"
          },
          "totalHours": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.SeasonState": {
        "enum": [
          "Past",
          "Current",
          "Upcoming"
        ],
        "type": "string"
      },
      "Bookennis.Shared.Controller.Statistics.SeasonStatisticsResult": {
        "required": [
          "clubComparison",
          "data",
          "endDate",
          "isActivated",
          "playModeQuotas",
          "seasonId",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isActivated": {
            "type": "boolean"
          },
          "data": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.StatisticsData"
          },
          "playModeQuotas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PlayModeQuotaEntry"
            },
            "nullable": true
          },
          "clubComparison": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ClubComparison"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.StatisticsData": {
        "required": [
          "activityDays",
          "averageOpponentAge",
          "bestWeek",
          "busiestMonth",
          "courtUsage",
          "currentWeekStreak",
          "distinctPartners",
          "firstBooking",
          "hourCounts",
          "lastBooking",
          "longestBreakDays",
          "longestWeekStreak",
          "partnerUsage",
          "playerType",
          "playModeUsage",
          "totalBookings",
          "totalHoursOnCourt",
          "weekdayCounts"
        ],
        "type": "object",
        "properties": {
          "courtUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ChartEntry"
            },
            "nullable": true
          },
          "partnerUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PartnerEntry"
            },
            "nullable": true
          },
          "playModeUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.ChartEntry"
            },
            "nullable": true
          },
          "averageOpponentAge": {
            "type": "number",
            "format": "double"
          },
          "totalBookings": {
            "type": "integer",
            "format": "int32"
          },
          "totalHoursOnCourt": {
            "type": "number",
            "format": "double"
          },
          "distinctPartners": {
            "type": "integer",
            "format": "int32"
          },
          "weekdayCounts": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Bookings per weekday, index 0 = Monday … 6 = Sunday (local time of the booking).",
            "nullable": true
          },
          "hourCounts": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Bookings per start hour, index 0 … 23 (local time of the booking).",
            "nullable": true
          },
          "playerType": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PlayerType"
          },
          "longestWeekStreak": {
            "type": "integer",
            "format": "int32"
          },
          "currentWeekStreak": {
            "type": "integer",
            "format": "int32"
          },
          "longestBreakDays": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "bestWeek": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeekRecord"
          },
          "busiestMonth": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.MonthRecord"
          },
          "firstBooking": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "lastBooking": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "activityDays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.DayActivity"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.TopPlayerEntry": {
        "required": [
          "bookings",
          "firstName",
          "hours",
          "isGuest",
          "lastName",
          "memberId",
          "profilePictureUrl"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "isGuest": {
            "type": "boolean"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.WeekRecord": {
        "required": [
          "count",
          "weekStart"
        ],
        "type": "object",
        "properties": {
          "weekStart": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.WeekdayActivityEntry": {
        "required": [
          "bookings",
          "dayOfWeek",
          "hours"
        ],
        "type": "object",
        "properties": {
          "dayOfWeek": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.WeekdayHeatmapResult": {
        "required": [
          "dayOfWeek",
          "hours",
          "occupancyPercentage"
        ],
        "type": "object",
        "properties": {
          "dayOfWeek": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "occupancyPercentage": {
            "type": "number",
            "format": "double"
          },
          "hours": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.HeatmapHourResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Statistics.WeeklyActivityEntry": {
        "required": [
          "activePlayers",
          "bookings",
          "hours",
          "weekStart"
        ],
        "type": "object",
        "properties": {
          "weekStart": {
            "type": "string",
            "description": "Monday of the week.",
            "format": "date"
          },
          "bookings": {
            "type": "integer",
            "format": "int32"
          },
          "hours": {
            "type": "number",
            "format": "double"
          },
          "activePlayers": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.ComputeSubscriptionScheduleModel": {
        "type": "object",
        "properties": {
          "seed": {
            "type": "integer",
            "description": "Null computes a new (random) variant.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.CreateSubscriptionPlanModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "playersPerWeek": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.GetSubscriptionPlansResult": {
        "required": [
          "plans"
        ],
        "type": "object",
        "properties": {
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanSummaryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPairDto": {
        "required": [
          "count",
          "expected",
          "participantId1",
          "participantId2"
        ],
        "type": "object",
        "properties": {
          "participantId1": {
            "type": "integer",
            "format": "int32"
          },
          "participantId2": {
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "expected": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionParticipantDto": {
        "required": [
          "assigned",
          "colorIndex",
          "id",
          "name",
          "percentage",
          "target",
          "unavailableWeeks"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "percentage": {
            "type": "integer",
            "format": "int32"
          },
          "colorIndex": {
            "type": "integer",
            "format": "int32"
          },
          "unavailableWeeks": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "date"
            },
            "nullable": true
          },
          "assigned": {
            "type": "integer",
            "description": "Number of weeks the participant is scheduled in.",
            "format": "int32"
          },
          "target": {
            "type": "number",
            "description": "Fair number of weeks derived from the percentage and availability.",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionParticipantModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "percentage": {
            "type": "integer",
            "format": "int32"
          },
          "colorIndex": {
            "type": "integer",
            "format": "int32"
          },
          "unavailableWeeks": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "date"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A participant of the plan; `Id` is null for participants that are new."
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanDto": {
        "required": [
          "endDate",
          "hasSchedule",
          "id",
          "name",
          "pairs",
          "participants",
          "playersPerWeek",
          "startDate",
          "weeks"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "playersPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "hasSchedule": {
            "type": "boolean"
          },
          "weeks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionWeekDto"
            },
            "nullable": true
          },
          "participants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionParticipantDto"
            },
            "nullable": true
          },
          "pairs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPairDto"
            },
            "description": "How often each pair of participants shares a week (only pairs with ParticipantId1 < ParticipantId2).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionPlanSummaryDto": {
        "required": [
          "endDate",
          "hasSchedule",
          "id",
          "name",
          "participantCount",
          "playersPerWeek",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "playersPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "participantCount": {
            "type": "integer",
            "format": "int32"
          },
          "hasSchedule": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionWeekAssignmentModel": {
        "type": "object",
        "properties": {
          "monday": {
            "type": "string",
            "format": "date"
          },
          "participantIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionWeekDto": {
        "required": [
          "isExcluded",
          "isUnderstaffed",
          "monday",
          "participantIds",
          "weekNumber",
          "year"
        ],
        "type": "object",
        "properties": {
          "monday": {
            "type": "string",
            "format": "date"
          },
          "weekNumber": {
            "type": "integer",
            "format": "int32"
          },
          "year": {
            "type": "integer",
            "format": "int32"
          },
          "isExcluded": {
            "type": "boolean"
          },
          "isUnderstaffed": {
            "type": "boolean",
            "description": "True when fewer participants than required are available in this week."
          },
          "participantIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sunday": {
            "type": "string",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionPlanModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "playersPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "excludedWeeks": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "date"
            },
            "nullable": true
          },
          "participants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionParticipantModel"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.SubscriptionPlans.UpdateSubscriptionScheduleModel": {
        "type": "object",
        "properties": {
          "weeks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.SubscriptionPlans.SubscriptionWeekAssignmentModel"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.GetWrappedSeasonsResult": {
        "required": [
          "canManage",
          "seasons"
        ],
        "type": "object",
        "properties": {
          "seasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedSeasonDto"
            },
            "description": "Newest first. Members get the released seasons, club admins every season that has started.",
            "nullable": true
          },
          "canManage": {
            "type": "boolean",
            "description": "The caller may release Wrapped and preview the ones that are not released yet."
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.SeasonWrappedResult": {
        "required": [
          "activeWeeks",
          "badges",
          "bestWeek",
          "betterThanPercentage",
          "busiestMonth",
          "club",
          "clubName",
          "courtsPlayed",
          "daysPlayed",
          "distinctPartners",
          "endDate",
          "enrolledMembers",
          "eventsAttended",
          "favouriteCourt",
          "favouriteHour",
          "favouriteWeekday",
          "firstMatch",
          "firstName",
          "hoursOnCourt",
          "isActive",
          "isPublished",
          "lastMatch",
          "longestBreakDays",
          "longestWeekStreak",
          "matches",
          "playerType",
          "rank",
          "recurringMatches",
          "regularSlot",
          "seasonId",
          "startDate",
          "topPartners"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "isPublished": {
            "type": "boolean"
          },
          "clubName": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "matches": {
            "type": "integer",
            "format": "int32"
          },
          "hoursOnCourt": {
            "type": "number",
            "format": "double"
          },
          "firstMatch": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "lastMatch": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "activeWeeks": {
            "type": "integer",
            "format": "int32"
          },
          "daysPlayed": {
            "type": "integer",
            "format": "int32"
          },
          "rank": {
            "type": "integer",
            "description": "Place by matches among the members enrolled in the season (1 = most matches), only when the member played.",
            "format": "int32",
            "nullable": true
          },
          "enrolledMembers": {
            "type": "integer",
            "format": "int32"
          },
          "betterThanPercentage": {
            "type": "integer",
            "description": "Share of the other enrolled members who played fewer matches.",
            "format": "int32",
            "nullable": true
          },
          "topPartners": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedPartnerDto"
            },
            "nullable": true
          },
          "distinctPartners": {
            "type": "integer",
            "format": "int32"
          },
          "playerType": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.PlayerType"
          },
          "favouriteWeekday": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "favouriteHour": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "favouriteCourt": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedCourtDto"
          },
          "courtsPlayed": {
            "type": "integer",
            "format": "int32"
          },
          "busiestMonth": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.MonthRecord"
          },
          "bestWeek": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Statistics.WeekRecord"
          },
          "longestWeekStreak": {
            "type": "integer",
            "format": "int32"
          },
          "longestBreakDays": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "regularSlot": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedRegularSlotDto"
          },
          "recurringMatches": {
            "type": "integer",
            "format": "int32"
          },
          "badges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedBadgeDto"
            },
            "nullable": true
          },
          "eventsAttended": {
            "type": "integer",
            "format": "int32"
          },
          "club": {
            "$ref": "#/components/schemas/Bookennis.Shared.Controller.Wrapped.WrappedClubDto"
          }
        },
        "additionalProperties": false,
        "description": "The season review of the signed-in member. Every part is optional: the FE only shows the slides with data.\nOther members only appear with name and picture (partners)."
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedBadgeDto": {
        "required": [
          "awardedAt",
          "imageUrl",
          "level",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "level": {
            "type": "integer",
            "description": "`null` for one-time badges.",
            "format": "int32",
            "nullable": true
          },
          "awardedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedClubDto": {
        "required": [
          "activePlayers",
          "busiestCourt",
          "busiestWeekday",
          "events",
          "guestPlayers",
          "hoursOnCourt",
          "matches",
          "ownSharePercentage"
        ],
        "type": "object",
        "properties": {
          "matches": {
            "type": "integer",
            "format": "int32"
          },
          "hoursOnCourt": {
            "type": "number",
            "format": "double"
          },
          "activePlayers": {
            "type": "integer",
            "format": "int32"
          },
          "guestPlayers": {
            "type": "integer",
            "format": "int32"
          },
          "busiestCourt": {
            "type": "string",
            "nullable": true
          },
          "busiestWeekday": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "events": {
            "type": "integer",
            "format": "int32"
          },
          "ownSharePercentage": {
            "type": "number",
            "description": "Share of all matches of the club the member took part in.",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Anonymous numbers of the whole club in the season."
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedCourtDto": {
        "required": [
          "matches",
          "name",
          "sharePercentage"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "matches": {
            "type": "integer",
            "format": "int32"
          },
          "sharePercentage": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedPartnerDto": {
        "required": [
          "firstName",
          "lastName",
          "matches",
          "memberId",
          "profilePictureUrl"
        ],
        "type": "object",
        "properties": {
          "memberId": {
            "type": "integer",
            "format": "int32"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "profilePictureUrl": {
            "type": "string",
            "nullable": true
          },
          "matches": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedRegularSlotDto": {
        "required": [
          "courtName",
          "dayOfWeek",
          "matches",
          "startTime"
        ],
        "type": "object",
        "properties": {
          "dayOfWeek": {
            "$ref": "#/components/schemas/System.DayOfWeek"
          },
          "startTime": {
            "type": "string",
            "description": "Local time of day. A System.TimeSpan, because the client converts `TimeOnly` to UTC.",
            "format": "date-span"
          },
          "courtName": {
            "type": "string",
            "nullable": true
          },
          "matches": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Controller.Wrapped.WrappedSeasonDto": {
        "required": [
          "endDate",
          "isActive",
          "matches",
          "publishedAt",
          "seasonId",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "seasonId": {
            "type": "integer",
            "format": "int32"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "matches": {
            "type": "integer",
            "description": "Matches the signed-in member played in the season.",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Bookennis.Shared.Utils.Sorting.SortDirection": {
        "enum": [
          "Ascending",
          "Descending"
        ],
        "type": "string"
      },
      "System.DayOfWeek": {
        "enum": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "type": "string"
      }
    },
    "securitySchemes": {
      "ClubApiKey": {
        "type": "http",
        "description": "A club API key, created in the club administration of the app.",
        "scheme": "bearer",
        "bearerFormat": "cnz_..."
      }
    }
  },
  "security": [
    {
      "ClubApiKey": [ ]
    }
  ],
  "tags": [
    {
      "name": "BadgeTiers"
    },
    {
      "name": "Bookings"
    },
    {
      "name": "ClubAnnouncements",
      "description": "Club news. Club members (not guests) read the announcements;\nSportsDirectors, YouthSportsDirectors and Admins write them and send them as email."
    },
    {
      "name": "ClubEmailTemplates"
    },
    {
      "name": "ClubEvents",
      "description": "Club calendar. Club members (not guests) can read events and register;\nMaintainers, SportsDirectors, YouthSportsDirectors and Admins plan the events."
    },
    {
      "name": "ClubProfile"
    },
    {
      "name": "Clubs"
    },
    {
      "name": "CourtBlockings",
      "description": "Time-based court blockings (tournaments, maintenance, weather). Everybody who sees the booking grid can read the blocked times;\nMaintainers, SportsDirectors and Admins manage the blockings (not YouthSportsDirectors)."
    },
    {
      "name": "Courts"
    },
    {
      "name": "Families",
      "description": "Families of the club. A member manages the own family: only its members read it and only its parents change it\n(Bookennis.Api.Infrastructure.Authorization.AuthorizationPolicies.FamilyMember, Bookennis.Api.Infrastructure.Authorization.AuthorizationPolicies.FamilyParent). Admins and treasurers of the club may do both."
    },
    {
      "name": "Leaderboards"
    },
    {
      "name": "MemberBadges"
    },
    {
      "name": "Members"
    },
    {
      "name": "MembershipPayments",
      "description": "The treasurer's view of the membership fees of a season: who has which plan, who has paid, and recording payments that\narrived outside of the app. For Treasurers and Admins. The lists carry names, plan and payment - no email, birthday or address."
    },
    {
      "name": "MembershipPlans",
      "description": "The price list of the club: membership plans per season. Club members (not guests) read the plans they can choose,\nTreasurers and Admins design them."
    },
    {
      "name": "Memberships",
      "description": "The membership of the signed-in member: choose a plan for oneself or, as a parent, for the family, and pay it.\nAn order is only open to the people it is about (Bookennis.Api.Infrastructure.Authorization.AuthorizationPolicies.OwnsMembershipOrder): its payer,\nthe members it covers and the parents of a covered child. Treasurers manage all orders with `MembershipPayments`."
    },
    {
      "name": "OneTimeBadges"
    },
    {
      "name": "Payments",
      "description": "Online payment of the club: whether it is available and the status of the club's own Stripe account, to which the membership fees\nare paid directly. For Treasurers and Admins. Connecting and disconnecting the account is not part of this API."
    },
    {
      "name": "Players",
      "description": "Players for a booking. Members who are not active only get themselves and the children of their family."
    },
    {
      "name": "PlayModes"
    },
    {
      "name": "Seasons"
    },
    {
      "name": "Statistics"
    },
    {
      "name": "SubscriptionPlans"
    },
    {
      "name": "Wrapped",
      "description": "The season review (\"Wrapped\") of the signed-in member. Club members (not guests) open the seasons the club admins released;\nclub admins release a season's Wrapped (also of past seasons) and preview the ones that are not released yet."
    }
  ]
}