{
  "openapi": "3.0.3",
  "info": {
    "title": "Alrahma Unified API",
    "version": "1.0.0",
    "description": "HTTP endpoints that power the Alrahma platform. Routes are namespaced under /api/v1 unless noted otherwise."
  },
  "servers": [
    {
      "url": "http://localhost:8000",
      "description": "Local development server"
    },
    {
      "url": "https://localhost",
      "description": "Local HTTPS server"
    },
    {
      "url": "{scheme}://{host}",
      "description": "Custom environment",
      "variables": {
        "scheme": {
          "default": "https",
          "enum": [
            "http",
            "https"
          ]
        },
        "host": {
          "default": "localhost:8000"
        }
      }
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": false
          },
          "message": {
            "type": "string",
            "example": "Validation failed"
          },
          "errors": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "Pagination": {
        "type": "object",
        "properties": {
          "current_page": {
            "type": "integer",
            "example": 1
          },
          "per_page": {
            "type": "integer",
            "example": 20
          },
          "total": {
            "type": "integer",
            "example": 250
          },
          "total_pages": {
            "type": "integer",
            "example": 13
          }
        }
      },
      "PaginatedResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "message": {
            "type": "string",
            "example": "Students retrieved successfully"
          },
          "data": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Student"
                }
              },
              "pagination": {
                "$ref": "#/components/schemas/Pagination"
              }
            }
          }
        }
      },
      "Student": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "example": 42
          },
          "school_year": {
            "type": "string"
          },
          "school_id": {
            "type": "string"
          },
          "firstname": {
            "type": "string",
            "example": "Ahmed"
          },
          "lastname": {
            "type": "string",
            "example": "Rahman"
          },
          "dob": {
            "type": "string",
            "format": "date",
            "example": "2013-04-22"
          },
          "age": {
            "type": "integer"
          },
          "gender": {
            "type": "string",
            "enum": [
              "male",
              "female"
            ]
          },
          "is_active": {
            "type": "boolean"
          },
          "registration_grade": {
            "type": "string"
          },
          "is_new": {
            "type": "boolean"
          },
          "photo_consent": {
            "type": "boolean"
          },
          "parent_id": {
            "type": "integer"
          },
          "registration_date": {
            "type": "string",
            "format": "date"
          },
          "tuition_paid": {
            "type": "boolean"
          },
          "semester": {
            "type": "string"
          },
          "year_of_registration": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "cellphone": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "relation": {
            "type": "string"
          },
          "current_class": {
            "type": "object",
            "nullable": true
          }
        }
      },
      "AttendanceRecord": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "example": 321
          },
          "student_id": {
            "type": "integer",
            "example": 42
          },
          "class_section_id": {
            "type": "integer",
            "example": 8
          },
          "date": {
            "type": "string",
            "format": "date",
            "example": "2024-11-01"
          },
          "status": {
            "type": "string",
            "enum": [
              "present",
              "absent",
              "late"
            ]
          },
          "notes": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "Invoice": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "example": 101
          },
          "parent_id": {
            "type": "integer",
            "example": 55
          },
          "status": {
            "type": "string",
            "example": "pending"
          },
          "balance": {
            "type": "number",
            "format": "float",
            "example": 125.5
          },
          "description": {
            "type": "string"
          },
          "school_year": {
            "type": "string",
            "example": "2024-2025"
          },
          "semester": {
            "type": "string",
            "example": "Fall"
          }
        }
      },
      "LoginRequest": {
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "example": "admin@example.com"
          },
          "password": {
            "type": "string",
            "example": "secret"
          }
        }
      },
      "LoginResponse": {
        "type": "object",
        "required": [
          "status",
          "token",
          "access_token",
          "token_type",
          "expires_in",
          "user"
        ],
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "token": {
            "type": "string",
            "example": "eyJ0eXAiOiJKV1QiLCJh..."
          },
          "access_token": {
            "type": "string",
            "example": "eyJ0eXAiOiJKV1QiLCJh..."
          },
          "token_type": {
            "type": "string",
            "example": "bearer"
          },
          "expires_in": {
            "type": "integer",
            "example": 216000
          },
          "user": {
            "type": "object",
            "required": [
              "id",
              "name",
              "roles"
            ],
            "properties": {
              "id": {
                "type": "integer",
                "example": 2
              },
              "name": {
                "type": "string",
                "example": "Amina Teacher"
              },
              "firstname": {
                "type": "string",
                "nullable": true,
                "example": "Amina"
              },
              "lastname": {
                "type": "string",
                "nullable": true,
                "example": "Teacher"
              },
              "email": {
                "type": "string",
                "format": "email",
                "nullable": true,
                "example": "amina.teacher@example.test"
              },
              "roles": {
                "type": "object",
                "additionalProperties": {
                  "type": "boolean"
                },
                "example": {
                  "teacher": true
                }
              },
              "class_section_id": {
                "type": "integer",
                "nullable": true,
                "example": 42
              },
              "class_section_name": {
                "type": "string",
                "nullable": true,
                "example": "Grade 5 - A"
              }
            }
          }
        }
      },
      "RegisterRequest": {
        "type": "object",
        "required": [
          "firstname",
          "lastname",
          "gender",
          "email",
          "confirm_email",
          "cellphone",
          "city",
          "state",
          "zip",
          "accept_school_policy",
          "captcha"
        ],
        "properties": {
          "firstname": {
            "type": "string",
            "example": "Yara"
          },
          "lastname": {
            "type": "string",
            "example": "Khalil"
          },
          "gender": {
            "type": "string",
            "example": "Female"
          },
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@example.com"
          },
          "confirm_email": {
            "type": "string",
            "format": "email",
            "example": "parent@example.com"
          },
          "cellphone": {
            "type": "string",
            "example": "203-555-1234"
          },
          "address_street": {
            "type": "string",
            "example": "123 Main St"
          },
          "apt": {
            "type": "string",
            "example": "Apt 4B"
          },
          "city": {
            "type": "string",
            "example": "New Haven"
          },
          "state": {
            "type": "string",
            "example": "CT"
          },
          "zip": {
            "type": "string",
            "example": "06510"
          },
          "accept_school_policy": {
            "type": "boolean",
            "example": true
          },
          "captcha": {
            "type": "string",
            "example": "A1B2"
          },
          "is_parent": {
            "type": "boolean",
            "example": true
          },
          "no_second_parent_info": {
            "type": "boolean",
            "example": false
          },
          "second_firstname": {
            "type": "string",
            "example": "Omar"
          },
          "second_lastname": {
            "type": "string",
            "example": "Khalil"
          },
          "second_gender": {
            "type": "string",
            "example": "Male"
          },
          "second_email": {
            "type": "string",
            "format": "email",
            "example": "second.parent@example.com"
          },
          "second_cellphone": {
            "type": "string",
            "example": "203-555-4567"
          }
        }
      },
      "UserSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "example": 4321
          },
          "firstname": {
            "type": "string",
            "example": "Yara"
          },
          "lastname": {
            "type": "string",
            "example": "Khalil"
          },
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@example.com"
          },
          "school_id": {
            "type": "string",
            "example": "SID-AB12CD34"
          },
          "status": {
            "type": "string",
            "example": "active"
          }
        }
      },
      "RegisterResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "example": true
          },
          "registration": {
            "type": "object",
            "properties": {
              "user_id": {
                "type": "integer",
                "example": 4321
              },
              "email": {
                "type": "string",
                "format": "email",
                "example": "parent@example.com"
              },
              "firstname": {
                "type": "string",
                "example": "Yara"
              },
              "lastname": {
                "type": "string",
                "example": "Khalil"
              },
              "role": {
                "type": "string",
                "example": "parent"
              },
              "activation_sent": {
                "type": "boolean",
                "example": true
              }
            }
          }
        }
      },
      "ForgotPasswordRequest": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@example.com"
          }
        }
      },
      "PasswordResetRequest": {
        "type": "object",
        "required": [
          "token",
          "password",
          "pass_confirm"
        ],
        "properties": {
          "token": {
            "type": "string",
            "example": "abc123reset"
          },
          "password": {
            "type": "string",
            "example": "Str0ngReset!"
          },
          "pass_confirm": {
            "type": "string",
            "example": "Str0ngReset!"
          }
        }
      },
      "SetPasswordRequest": {
        "type": "object",
        "required": [
          "user_id",
          "token",
          "password",
          "password_confirm"
        ],
        "properties": {
          "user_id": {
            "type": "integer",
            "example": 4321
          },
          "token": {
            "type": "string",
            "example": "def456confirm"
          },
          "password": {
            "type": "string",
            "example": "NewPass123!"
          },
          "password_confirm": {
            "type": "string",
            "example": "NewPass123!"
          }
        }
      },
      "MessageResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "message": {
            "type": "string",
            "example": "Check your inbox for the next steps."
          }
        }
      },
      "LoginActivityRecord": {
        "type": "object",
        "properties": {
          "user_id": {
            "type": "integer",
            "example": 7
          },
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@example.com"
          },
          "login_time": {
            "type": "string",
            "format": "date-time",
            "example": "2025-08-15T08:22:41"
          },
          "logout_time": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "example": null
          },
          "ip_address": {
            "type": "string",
            "example": "192.0.2.55"
          },
          "user_agent": {
            "type": "string",
            "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
          }
        }
      },
      "LoginActivityResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean",
            "example": true
          },
          "data": {
            "type": "object",
            "properties": {
              "activities": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/LoginActivityRecord"
                }
              },
              "pagination": {
                "$ref": "#/components/schemas/Pagination"
              }
            }
          },
          "message": {
            "type": "string",
            "example": "Login activity retrieved"
          }
        }
      },
      "WebRegisterForm": {
        "type": "object",
        "required": [
          "firstname",
          "lastname",
          "gender",
          "email",
          "confirm_email",
          "cellphone",
          "address_street",
          "city",
          "state",
          "zip",
          "accept_school_policy",
          "captcha"
        ],
        "properties": {
          "firstname": {
            "type": "string",
            "example": "Amina"
          },
          "lastname": {
            "type": "string",
            "example": "El-Sayed"
          },
          "gender": {
            "type": "string",
            "enum": [
              "Male",
              "Female"
            ],
            "example": "Female"
          },
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@alrahma.org"
          },
          "confirm_email": {
            "type": "string",
            "format": "email",
            "example": "parent@alrahma.org"
          },
          "cellphone": {
            "type": "string",
            "example": "203-555-0147"
          },
          "address_street": {
            "type": "string",
            "example": "123 Elm Street"
          },
          "apt": {
            "type": "string",
            "example": "Apt 5"
          },
          "city": {
            "type": "string",
            "example": "Hartford"
          },
          "state": {
            "type": "string",
            "enum": [
              "CT",
              "ME",
              "MA",
              "NH",
              "NY",
              "RI",
              "VT"
            ],
            "example": "CT"
          },
          "zip": {
            "type": "string",
            "example": "06106"
          },
          "accept_school_policy": {
            "type": "boolean",
            "example": true
          },
          "captcha": {
            "type": "string",
            "example": "7F3Z"
          },
          "is_parent": {
            "type": "boolean",
            "example": true
          },
          "no_second_parent_info": {
            "type": "boolean",
            "example": false
          },
          "second_firstname": {
            "type": "string",
            "example": "Maya"
          },
          "second_lastname": {
            "type": "string",
            "example": "El-Sayed"
          },
          "second_gender": {
            "type": "string",
            "enum": [
              "Male",
              "Female"
            ],
            "example": "Female"
          },
          "second_email": {
            "type": "string",
            "format": "email",
            "example": "co-parent@alrahma.org"
          },
          "second_cellphone": {
            "type": "string",
            "example": "203-555-0189"
          }
        }
      },
      "WebLoginForm": {
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@alrahma.org"
          },
          "password": {
            "type": "string",
            "example": "SecurePass123!"
          }
        }
      },
      "WebForgotPasswordForm": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "example": "parent@alrahma.org"
          }
        }
      },
      "WebResetPasswordForm": {
        "type": "object",
        "required": [
          "token",
          "password",
          "pass_confirm"
        ],
        "properties": {
          "token": {
            "type": "string",
            "example": "abc123reset"
          },
          "password": {
            "type": "string",
            "example": "Str0ngReset!"
          },
          "pass_confirm": {
            "type": "string",
            "example": "Str0ngReset!"
          }
        }
      },
      "WebSetPasswordForm": {
        "type": "object",
        "required": [
          "user_id",
          "token",
          "password",
          "password_confirm"
        ],
        "properties": {
          "user_id": {
            "type": "integer",
            "example": 4321
          },
          "token": {
            "type": "string",
            "example": "def456confirm"
          },
          "password": {
            "type": "string",
            "example": "NewPass123!"
          },
          "password_confirm": {
            "type": "string",
            "example": "NewPass123!"
          }
        }
      }
    },
    "responses": {
      "UnauthorizedError": {
        "description": "Missing or invalid bearer token",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "x-controllers": [
    {
      "name": "AdministratorController",
      "class": "App\\Http\\Controllers\\Api\\AdministratorController",
      "path": "app/Http/Controllers/Api/AdministratorController.php"
    },
    {
      "name": "AssignmentController",
      "class": "App\\Http\\Controllers\\Api\\AssignmentController",
      "path": "app/Http/Controllers/Api/AssignmentController.php"
    },
    {
      "name": "AttendanceController",
      "class": "App\\Http\\Controllers\\Api\\AttendanceController",
      "path": "app/Http/Controllers/Api/AttendanceController.php"
    },
    {
      "name": "AttendanceTrackingController",
      "class": "App\\Http\\Controllers\\Api\\AttendanceTrackingController",
      "path": "app/Http/Controllers/Api/AttendanceTrackingController.php"
    },
    {
      "name": "AuthorizedUsersController",
      "class": "App\\Http\\Controllers\\Api\\AuthorizedUsersController",
      "path": "app/Http/Controllers/Api/AuthorizedUsersController.php"
    },
    {
      "name": "BaseApiController",
      "class": "App\\Http\\Controllers\\Api\\Core\\BaseApiController",
      "path": "app/Http/Controllers/Api/Core/BaseApiController.php"
    },
    {
      "name": "BroadcastEmailController",
      "class": "App\\Http\\Controllers\\Api\\BroadcastEmailController",
      "path": "app/Http/Controllers/Api/BroadcastEmailController.php"
    },
    {
      "name": "CalendarController",
      "class": "App\\Http\\Controllers\\Api\\CalendarController",
      "path": "app/Http/Controllers/Api/CalendarController.php"
    },
    {
      "name": "request adapter",
      "class": "App\\Http\\Controllers\\Api\\Core\\request adapter",
      "path": "app/Http/Controllers/Api/Core/request adapter.php"
    },
    {
      "name": "ClassController",
      "class": "App\\Http\\Controllers\\Api\\ClassController",
      "path": "app/Http/Controllers/Api/ClassController.php"
    },
    {
      "name": "ClassPreparationController",
      "class": "App\\Http\\Controllers\\Api\\ClassPreparationController",
      "path": "app/Http/Controllers/Api/ClassPreparationController.php"
    },
    {
      "name": "CommunicationController",
      "class": "App\\Http\\Controllers\\Api\\CommunicationController",
      "path": "app/Http/Controllers/Api/CommunicationController.php"
    },
    {
      "name": "ConfigurationController",
      "class": "App\\Http\\Controllers\\Api\\ConfigurationController",
      "path": "app/Http/Controllers/Api/ConfigurationController.php"
    },
    {
      "name": "ContactController",
      "class": "App\\Http\\Controllers\\Api\\ContactController",
      "path": "app/Http/Controllers/Api/ContactController.php"
    },
    {
      "name": "DiscountController",
      "class": "App\\Http\\Controllers\\Api\\DiscountController",
      "path": "app/Http/Controllers/Api/DiscountController.php"
    },
    {
      "name": "EmailController",
      "class": "App\\Http\\Controllers\\Api\\EmailController",
      "path": "app/Http/Controllers/Api/EmailController.php"
    },
    {
      "name": "EmailExtractorController",
      "class": "App\\Http\\Controllers\\Api\\EmailExtractorController",
      "path": "app/Http/Controllers/Api/EmailExtractorController.php"
    },
    {
      "name": "EmergencyContactController",
      "class": "App\\Http\\Controllers\\Api\\EmergencyContactController",
      "path": "app/Http/Controllers/Api/EmergencyContactController.php"
    },
    {
      "name": "EventController",
      "class": "App\\Http\\Controllers\\Api\\EventController",
      "path": "app/Http/Controllers/Api/EventController.php"
    },
    {
      "name": "ExpenseController",
      "class": "App\\Http\\Controllers\\Api\\ExpenseController",
      "path": "app/Http/Controllers/Api/ExpenseController.php"
    },
    {
      "name": "ExtraChargesController",
      "class": "App\\Http\\Controllers\\Api\\ExtraChargesController",
      "path": "app/Http/Controllers/Api/ExtraChargesController.php"
    },
    {
      "name": "FamilyAdminController",
      "class": "App\\Http\\Controllers\\Api\\FamilyAdminController",
      "path": "app/Http/Controllers/Api/FamilyAdminController.php"
    },
    {
      "name": "FamilyController",
      "class": "App\\Http\\Controllers\\Api\\FamilyController",
      "path": "app/Http/Controllers/Api/FamilyController.php"
    },
    {
      "name": "FilesController",
      "class": "App\\Http\\Controllers\\Api\\FilesController",
      "path": "app/Http/Controllers/Api/FilesController.php"
    },
    {
      "name": "FinalController",
      "class": "App\\Http\\Controllers\\Api\\FinalController",
      "path": "app/Http/Controllers/Api/FinalController.php"
    },
    {
      "name": "FinancialController",
      "class": "App\\Http\\Controllers\\Api\\FinancialController",
      "path": "app/Http/Controllers/Api/FinancialController.php"
    },
    {
      "name": "FlagController",
      "class": "App\\Http\\Controllers\\Api\\FlagController",
      "path": "app/Http/Controllers/Api/FlagController.php"
    },
    {
      "name": "FrontendController",
      "class": "App\\Http\\Controllers\\Api\\FrontendController",
      "path": "app/Http/Controllers/Api/FrontendController.php"
    },
    {
      "name": "GradingController",
      "class": "App\\Http\\Controllers\\Api\\GradingController",
      "path": "app/Http/Controllers/Api/GradingController.php"
    },
    {
      "name": "HealthController",
      "class": "App\\Http\\Controllers\\Api\\HealthController",
      "path": "app/Http/Controllers/Api/HealthController.php"
    },
    {
      "name": "HomeworkController",
      "class": "App\\Http\\Controllers\\Api\\HomeworkController",
      "path": "app/Http/Controllers/Api/HomeworkController.php"
    },
    {
      "name": "HomeworkTrackingController",
      "class": "App\\Http\\Controllers\\Api\\HomeworkTrackingController",
      "path": "app/Http/Controllers/Api/HomeworkTrackingController.php"
    },
    {
      "name": "InventoryController",
      "class": "App\\Http\\Controllers\\Api\\InventoryController",
      "path": "app/Http/Controllers/Api/InventoryController.php"
    },
    {
      "name": "InvoiceController",
      "class": "App\\Http\\Controllers\\Api\\InvoiceController",
      "path": "app/Http/Controllers/Api/InvoiceController.php"
    },
    {
      "name": "IpBanController",
      "class": "App\\Http\\Controllers\\Api\\IpBanController",
      "path": "app/Http/Controllers/Api/IpBanController.php"
    },
    {
      "name": "LandingPageController",
      "class": "App\\Http\\Controllers\\Api\\LandingPageController",
      "path": "app/Http/Controllers/Api/LandingPageController.php"
    },
    {
      "name": "LateSlipLogsController",
      "class": "App\\Http\\Controllers\\Api\\LateSlipLogsController",
      "path": "app/Http/Controllers/Api/LateSlipLogsController.php"
    },
    {
      "name": "MessageController",
      "class": "App\\Http\\Controllers\\Api\\MessageController",
      "path": "app/Http/Controllers/Api/MessageController.php"
    },
    {
      "name": "MessagesController",
      "class": "App\\Http\\Controllers\\Api\\MessagesController",
      "path": "app/Http/Controllers/Api/MessagesController.php"
    },
    {
      "name": "MessagingController",
      "class": "App\\Http\\Controllers\\Api\\MessagingController",
      "path": "app/Http/Controllers/Api/MessagingController.php"
    },
    {
      "name": "NavBuilderController",
      "class": "App\\Http\\Controllers\\Api\\NavBuilderController",
      "path": "app/Http/Controllers/Api/NavBuilderController.php"
    },
    {
      "name": "NotificationController",
      "class": "App\\Http\\Controllers\\Api\\NotificationController",
      "path": "app/Http/Controllers/Api/NotificationController.php"
    },
    {
      "name": "NotificationsController",
      "class": "App\\Http\\Controllers\\Api\\NotificationsController",
      "path": "app/Http/Controllers/Api/NotificationsController.php"
    },
    {
      "name": "PageController",
      "class": "App\\Http\\Controllers\\Api\\PageController",
      "path": "app/Http/Controllers/Api/PageController.php"
    },
    {
      "name": "ParentAttendanceReportController",
      "class": "App\\Http\\Controllers\\Api\\ParentAttendanceReportController",
      "path": "app/Http/Controllers/Api/ParentAttendanceReportController.php"
    },
    {
      "name": "ParentController",
      "class": "App\\Http\\Controllers\\Api\\ParentController",
      "path": "app/Http/Controllers/Api/ParentController.php"
    },
    {
      "name": "ParticipationController",
      "class": "App\\Http\\Controllers\\Api\\ParticipationController",
      "path": "app/Http/Controllers/Api/ParticipationController.php"
    },
    {
      "name": "PaymentController",
      "class": "App\\Http\\Controllers\\Api\\PaymentController",
      "path": "app/Http/Controllers/Api/PaymentController.php"
    },
    {
      "name": "PaymentNotificationController",
      "class": "App\\Http\\Controllers\\Api\\PaymentNotificationController",
      "path": "app/Http/Controllers/Api/PaymentNotificationController.php"
    },
    {
      "name": "PaymentTransactionController",
      "class": "App\\Http\\Controllers\\Api\\PaymentTransactionController",
      "path": "app/Http/Controllers/Api/PaymentTransactionController.php"
    },
    {
      "name": "PaypalTransactionsController",
      "class": "App\\Http\\Controllers\\Api\\PaypalTransactionsController",
      "path": "app/Http/Controllers/Api/PaypalTransactionsController.php"
    },
    {
      "name": "PaypalWebhook",
      "class": "App\\Http\\Controllers\\Api\\PaypalWebhook",
      "path": "app/Http/Controllers/Api/PaypalWebhook.php"
    },
    {
      "name": "PolicyController",
      "class": "App\\Http\\Controllers\\Api\\PolicyController",
      "path": "app/Http/Controllers/Api/PolicyController.php"
    },
    {
      "name": "PreferencesController",
      "class": "App\\Http\\Controllers\\Api\\PreferencesController",
      "path": "app/Http/Controllers/Api/PreferencesController.php"
    },
    {
      "name": "PrintablesReportsController",
      "class": "App\\Http\\Controllers\\Api\\PrintablesReportsController",
      "path": "app/Http/Controllers/Api/PrintablesReportsController.php"
    },
    {
      "name": "ProjectController",
      "class": "App\\Http\\Controllers\\Api\\ProjectController",
      "path": "app/Http/Controllers/Api/ProjectController.php"
    },
    {
      "name": "PurchaseOrderController",
      "class": "App\\Http\\Controllers\\Api\\PurchaseOrderController",
      "path": "app/Http/Controllers/Api/PurchaseOrderController.php"
    },
    {
      "name": "QuizController",
      "class": "App\\Http\\Controllers\\Api\\QuizController",
      "path": "app/Http/Controllers/Api/QuizController.php"
    },
    {
      "name": "BadgeScanController",
      "class": "App\\Http\\Controllers\\Api\\BadgeScan\\BadgeScanController",
      "path": "app/Http/Controllers/Api/BadgeScan/BadgeScanController.php"
    },
    {
      "name": "RefundController",
      "class": "App\\Http\\Controllers\\Api\\RefundController",
      "path": "app/Http/Controllers/Api/RefundController.php"
    },
    {
      "name": "RegisterController",
      "class": "App\\Http\\Controllers\\Api\\RegisterController",
      "path": "app/Http/Controllers/Api/RegisterController.php"
    },
    {
      "name": "ReimbursementController",
      "class": "App\\Http\\Controllers\\Api\\ReimbursementController",
      "path": "app/Http/Controllers/Api/ReimbursementController.php"
    },
    {
      "name": "RolePermissionController",
      "class": "App\\Http\\Controllers\\Api\\Auth\\RolePermissionController",
      "path": "app/Http/Controllers/Api/Auth/RolePermissionController.php"
    },
    {
      "name": "RoleSwitcherController",
      "class": "App\\Http\\Controllers\\Api\\Auth\\RoleSwitcherController",
      "path": "app/Http/Controllers/Api/Auth/RoleSwitcherController.php"
    },
    {
      "name": "SchoolCalendarController",
      "class": "App\\Http\\Controllers\\Api\\SchoolCalendarController",
      "path": "app/Http/Controllers/Api/SchoolCalendarController.php"
    },
    {
      "name": "ScoreCommentController",
      "class": "App\\Http\\Controllers\\Api\\ScoreCommentController",
      "path": "app/Http/Controllers/Api/ScoreCommentController.php"
    },
    {
      "name": "ScoreController",
      "class": "App\\Http\\Controllers\\Api\\ScoreController",
      "path": "app/Http/Controllers/Api/ScoreController.php"
    },
    {
      "name": "ScorePredictorController",
      "class": "App\\Http\\Controllers\\Api\\ScorePredictorController",
      "path": "app/Http/Controllers/Api/ScorePredictorController.php"
    },
    {
      "name": "SendSMSController",
      "class": "App\\Http\\Controllers\\Api\\SendSMSController",
      "path": "app/Http/Controllers/Api/SendSMSController.php"
    },
    {
      "name": "SessionController",
      "class": "App\\Http\\Controllers\\Api\\SessionController",
      "path": "app/Http/Controllers/Api/SessionController.php"
    },
    {
      "name": "SessionTimeoutController",
      "class": "App\\Http\\Controllers\\Api\\SessionTimeoutController",
      "path": "app/Http/Controllers/Api/SessionTimeoutController.php"
    },
    {
      "name": "SettingsController",
      "class": "App\\Http\\Controllers\\Api\\SettingsController",
      "path": "app/Http/Controllers/Api/SettingsController.php"
    },
    {
      "name": "SlipPrinterController",
      "class": "App\\Http\\Controllers\\Api\\SlipPrinterController",
      "path": "app/Http/Controllers/Api/SlipPrinterController.php"
    },
    {
      "name": "StaffController",
      "class": "App\\Http\\Controllers\\Api\\StaffController",
      "path": "app/Http/Controllers/Api/StaffController.php"
    },
    {
      "name": "StatsController",
      "class": "App\\Http\\Controllers\\Api\\System\\StatsController",
      "path": "app/Http/Controllers/Api/System/StatsController.php"
    },
    {
      "name": "StudentController",
      "class": "App\\Http\\Controllers\\Api\\StudentController",
      "path": "app/Http/Controllers/Api/StudentController.php"
    },
    {
      "name": "SupplierController",
      "class": "App\\Http\\Controllers\\Api\\SupplierController",
      "path": "app/Http/Controllers/Api/SupplierController.php"
    },
    {
      "name": "SupplyCategoryController",
      "class": "App\\Http\\Controllers\\Api\\SupplyCategoryController",
      "path": "app/Http/Controllers/Api/SupplyCategoryController.php"
    },
    {
      "name": "SupportController",
      "class": "App\\Http\\Controllers\\Api\\SupportController",
      "path": "app/Http/Controllers/Api/SupportController.php"
    },
    {
      "name": "TeacherController",
      "class": "App\\Http\\Controllers\\Api\\TeacherController",
      "path": "app/Http/Controllers/Api/TeacherController.php"
    },
    {
      "name": "TestDBController",
      "class": "App\\Http\\Controllers\\Api\\TestDBController",
      "path": "app/Http/Controllers/Api/TestDBController.php"
    },
    {
      "name": "TimeController",
      "class": "App\\Http\\Controllers\\Api\\TimeController",
      "path": "app/Http/Controllers/Api/TimeController.php"
    },
    {
      "name": "UiController",
      "class": "App\\Http\\Controllers\\Api\\UiController",
      "path": "app/Http/Controllers/Api/UiController.php"
    },
    {
      "name": "UserController",
      "class": "App\\Http\\Controllers\\Api\\Users\\UserController",
      "path": "app/Http/Controllers/Api/Users/UserController.php"
    },
    {
      "name": "WhatsappController",
      "class": "App\\Http\\Controllers\\Api\\WhatsappController",
      "path": "app/Http/Controllers/Api/WhatsappController.php"
    },
    {
      "name": "AuthController",
      "class": "App\\Http\\Controllers\\Api\\Auth\\AuthController",
      "path": "app/Http/Controllers/Api/Auth/AuthController.php"
    }
  ],
  "paths": {
    "/api/v1/auth/register": {
      "post": {
        "operationId": "register",
        "tags": [
          "Auth"
        ],
        "summary": "Create a parent account and trigger email verification",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Parent account created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegisterResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/forgot-password": {
      "post": {
        "operationId": "forgotPassword",
        "tags": [
          "Auth"
        ],
        "summary": "Request a password reset link",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Email sent (or queued)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/reset-password": {
      "post": {
        "operationId": "resetPassword",
        "tags": [
          "Auth"
        ],
        "summary": "Submit a new password using the reset token received via email",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasswordResetRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Password changed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation or token error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/set-password": {
      "post": {
        "operationId": "setPassword",
        "tags": [
          "Auth"
        ],
        "summary": "Complete account setup by choosing a new password after email confirmation",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Password saved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "operationId": "login",
        "tags": [
          "Auth"
        ],
        "summary": "Issue a JWT for a valid user",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Authentication successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LoginResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid credentials",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/v1/auth/me": {
      "get": {
        "operationId": "getCurrentUser",
        "tags": [
          "Auth"
        ],
        "summary": "Return the authenticated user's profile",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Profile data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/auth/logout": {
      "post": {
        "operationId": "logout",
        "tags": [
          "Auth"
        ],
        "summary": "Revoke the active token",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "Token revoked"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/users/login-activity": {
      "get": {
        "operationId": "getUserLoginActivity",
        "tags": [
          "Users"
        ],
        "summary": "Get paginated login history",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Login activity"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/users": {
      "get": {
        "operationId": "listUsers",
        "tags": [
          "Users"
        ],
        "summary": "List users",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "id",
                "firstname",
                "lastname",
                "email",
                "role"
              ]
            }
          },
          {
            "name": "order",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated user list"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createUser",
        "tags": [
          "Users"
        ],
        "summary": "Create a new user",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstname",
                  "lastname",
                  "email",
                  "password",
                  "cellphone",
                  "address_street",
                  "city",
                  "state",
                  "zip",
                  "accept_school_policy",
                  "role_id"
                ],
                "properties": {
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "password": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "address_street": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "accept_school_policy": {
                    "type": "boolean"
                  },
                  "role_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "User created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/students": {
      "get": {
        "operationId": "listStudentsByYear",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "parent_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "parent_ids[]",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createStudent",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::store",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "school_year",
                  "firstname",
                  "lastname"
                ],
                "properties": {
                  "school_year": {
                    "type": "string"
                  },
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "dob": {
                    "type": "string",
                    "format": "date"
                  },
                  "age": {
                    "type": "integer"
                  },
                  "gender": {
                    "type": "string"
                  },
                  "is_active": {
                    "type": "boolean"
                  },
                  "registration_grade": {
                    "type": "string"
                  },
                  "is_new": {
                    "type": "boolean"
                  },
                  "photo_consent": {
                    "type": "boolean"
                  },
                  "parent_id": {
                    "type": "integer"
                  },
                  "registration_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "tuition_paid": {
                    "type": "boolean"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "year_of_registration": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/students/{id}": {
      "get": {
        "operationId": "getStudent",
        "tags": [
          "Students"
        ],
        "summary": "Retrieve a single student",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Student details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Student"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateStudent",
        "tags": [
          "Students"
        ],
        "summary": "Update a student",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "school_id": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "dob": {
                    "type": "string",
                    "format": "date"
                  },
                  "age": {
                    "type": "integer"
                  },
                  "gender": {
                    "type": "string"
                  },
                  "is_active": {
                    "type": "boolean"
                  },
                  "registration_grade": {
                    "type": "string"
                  },
                  "is_new": {
                    "type": "boolean"
                  },
                  "photo_consent": {
                    "type": "boolean"
                  },
                  "parent_id": {
                    "type": "integer"
                  },
                  "registration_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "tuition_paid": {
                    "type": "boolean"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "year_of_registration": {
                    "type": "integer"
                  },
                  "name": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "relation": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Student updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteStudent",
        "tags": [
          "Students"
        ],
        "summary": "Delete a student",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Student deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/attendance": {
      "get": {
        "operationId": "listAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "List attendance records",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "student_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated attendance records",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Create an attendance record",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AttendanceRecord"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Record created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "409": {
            "description": "Duplicate for student/date"
          }
        }
      }
    },
    "/api/v1/invoices": {
      "get": {
        "operationId": "listInvoices",
        "tags": [
          "Invoices"
        ],
        "summary": "List invoices",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "parent_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated invoices",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createInvoice",
        "tags": [
          "Invoices"
        ],
        "summary": "Create an invoice",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Invoice"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Invoice created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/invoices/{id}": {
      "get": {
        "operationId": "getInvoice",
        "tags": [
          "Invoices"
        ],
        "summary": "Show a single invoice",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Invoice details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Invoice"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateInvoice",
        "tags": [
          "Invoices"
        ],
        "summary": "Update invoice attributes",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Invoice"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Invoice updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteInvoice",
        "tags": [
          "Invoices"
        ],
        "summary": "Delete an invoice",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Invoice deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/register": {
      "post": {
        "operationId": "webRegister",
        "tags": [
          "Web"
        ],
        "summary": "Submit the legacy parent registration form",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebRegisterForm"
              }
            }
          }
        },
        "responses": {
          "302": {
            "description": "Redirects to /register/success when registration completes."
          },
          "422": {
            "description": "Validation issues cause a redirect back to the form with flash errors."
          }
        }
      }
    },
    "/user/login": {
      "post": {
        "operationId": "webLogin",
        "tags": [
          "Web"
        ],
        "summary": "Submit the legacy login form",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebLoginForm"
              }
            }
          }
        },
        "responses": {
          "302": {
            "description": "Redirects to the dashboard when authentication succeeds."
          },
          "401": {
            "description": "Invalid credentials or suspended account results in a redirect back with flash information."
          }
        }
      }
    },
    "/processForgotPassword": {
      "post": {
        "operationId": "webForgotPassword",
        "tags": [
          "Web"
        ],
        "summary": "Request a password reset link via the legacy form",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebForgotPasswordForm"
              }
            }
          }
        },
        "responses": {
          "302": {
            "description": "Always redirects back to the form; success is indicated via flash data."
          }
        }
      }
    },
    "/user/processResetPassword": {
      "post": {
        "operationId": "webResetPassword",
        "tags": [
          "Web"
        ],
        "summary": "Submit a new password using the reset token from the email",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebResetPasswordForm"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Renders the 'password_set_success' view when the token is valid."
          },
          "302": {
            "description": "Invalid token or validation errors redirect to the home page or form."
          }
        }
      }
    },
    "/user/save_password": {
      "post": {
        "operationId": "webSetPassword",
        "tags": [
          "Web"
        ],
        "summary": "Save the password after confirming the email address",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebSetPasswordForm"
              }
            }
          }
        },
        "responses": {
          "302": {
            "description": "Redirects to /user/password_set_success on success or back on failure."
          }
        }
      }
    },
    "/api/v1/administrator/dashboard": {
      "get": {
        "operationId": "getAdministratorDashboard",
        "tags": [
          "Administrator"
        ],
        "summary": "Returns counts for students, staff roles, and parents plus the four most recent login activities",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Dashboard data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/administrator/absence": {
      "get": {
        "operationId": "getAdministratorAbsence",
        "tags": [
          "Administrator"
        ],
        "summary": "Get absence form data",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Absence form data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "submitAdministratorAbsence",
        "tags": [
          "Administrator"
        ],
        "summary": "Submit absence request",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "dates",
                  "reason"
                ],
                "properties": {
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "date"
                    }
                  },
                  "reason_type": {
                    "type": "string"
                  },
                  "reason": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Absence submitted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/administrator/search": {
      "get": {
        "operationId": "searchAdministrator",
        "tags": [
          "Administrator"
        ],
        "summary": "Search across users, students, parents, staff, and emergency contacts",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/assignments": {
      "get": {
        "operationId": "listAssignments",
        "tags": [
          "Assignments"
        ],
        "summary": "List assignments",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "teacher_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "student_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated assignments"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createAssignment",
        "tags": [
          "Assignments"
        ],
        "summary": "Create an assignment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "due_date",
                  "class_id",
                  "teacher_id"
                ],
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "due_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "class_id": {
                    "type": "integer"
                  },
                  "teacher_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Assignment created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/assignments/{id}": {
      "get": {
        "operationId": "getAssignment",
        "tags": [
          "Assignments"
        ],
        "summary": "Get a single assignment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Assignment details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateAssignment",
        "tags": [
          "Assignments"
        ],
        "summary": "Update an assignment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "due_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "class_id": {
                    "type": "integer"
                  },
                  "teacher_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Assignment updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteAssignment",
        "tags": [
          "Assignments"
        ],
        "summary": "Delete an assignment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Assignment deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/attendance/{id}": {
      "get": {
        "operationId": "getAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Get a single attendance record",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Attendance record"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Update an attendance record",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "present",
                      "absent",
                      "late"
                    ]
                  },
                  "notes": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Attendance record updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Delete an attendance record",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Attendance record deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/attendance/class/{class_section_id}": {
      "get": {
        "operationId": "getClassAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Get class roster with attendance status",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Class roster with attendance"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/attendance/class/{class_section_id}/record": {
      "post": {
        "operationId": "recordClassAttendance",
        "tags": [
          "Attendance"
        ],
        "summary": "Record attendance for multiple students in a class",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "date",
                  "records"
                ],
                "properties": {
                  "date": {
                    "type": "string",
                    "format": "date"
                  },
                  "records": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "student_id",
                        "status"
                      ],
                      "properties": {
                        "student_id": {
                          "type": "integer"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "present",
                            "absent",
                            "late"
                          ]
                        },
                        "reason": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Attendance recorded"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/classes": {
      "get": {
        "operationId": "listClasses",
        "tags": [
          "Classes"
        ],
        "summary": "List classes",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "grade",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "teacher_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated classes"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/classes/{id}": {
      "get": {
        "operationId": "getClass",
        "tags": [
          "Classes"
        ],
        "summary": "Get a single class",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Class details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/classes/{id}/students": {
      "get": {
        "operationId": "getClassStudents",
        "tags": [
          "Classes"
        ],
        "summary": "Get students in a class",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of students"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/calendar": {
      "get": {
        "operationId": "listCalendarEvents",
        "tags": [
          "Calendar"
        ],
        "summary": "List calendar events",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "month",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "year",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated calendar events"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createCalendarEvent",
        "tags": [
          "Calendar"
        ],
        "summary": "Create a calendar event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "start_date"
                ],
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "start_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "description": {
                    "type": "string"
                  },
                  "end_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "location": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Event created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/calendar/{id}": {
      "get": {
        "operationId": "getCalendarEvent",
        "tags": [
          "Calendar"
        ],
        "summary": "Get a single calendar event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Event details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateCalendarEvent",
        "tags": [
          "Calendar"
        ],
        "summary": "Update a calendar event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "start_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "description": {
                    "type": "string"
                  },
                  "end_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "location": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Event updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteCalendarEvent",
        "tags": [
          "Calendar"
        ],
        "summary": "Delete a calendar event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Event deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/contact": {
      "post": {
        "operationId": "submitContact",
        "tags": [
          "Contact"
        ],
        "summary": "Submit contact form",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "email",
                  "subject",
                  "message"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "subject": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Contact form submitted"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error"
          }
        },
        "security": []
      }
    },
    "/api/v1/payments": {
      "get": {
        "operationId": "listPayments",
        "tags": [
          "Payments"
        ],
        "summary": "List payments with optional filters",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "parent_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated payments"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createPayment",
        "tags": [
          "Payments"
        ],
        "summary": "Create a new payment plan",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "parent_id",
                  "total_amount",
                  "payment_date"
                ],
                "properties": {
                  "parent_id": {
                    "type": "integer"
                  },
                  "total_amount": {
                    "type": "number"
                  },
                  "payment_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "number_of_installments": {
                    "type": "integer"
                  },
                  "payment_type": {
                    "type": "string"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Payment created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/payments/{id}": {
      "get": {
        "operationId": "getPayment",
        "tags": [
          "Payments"
        ],
        "summary": "Get a single payment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Payment details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updatePayment",
        "tags": [
          "Payments"
        ],
        "summary": "Update payment fields",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "paid_amount": {
                    "type": "number"
                  },
                  "balance": {
                    "type": "number"
                  },
                  "status": {
                    "type": "string"
                  },
                  "payment_method": {
                    "type": "string"
                  },
                  "payment_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "check_number": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Payment updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deletePayment",
        "tags": [
          "Payments"
        ],
        "summary": "Delete a payment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Payment deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/payments/parent/{id}": {
      "get": {
        "operationId": "getPaymentsByParent",
        "tags": [
          "Payments"
        ],
        "summary": "Get all payments for a specific parent",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Parent payments"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/payments/manual-pay-search": {
      "get": {
        "operationId": "searchManualPayment",
        "tags": [
          "Payments"
        ],
        "summary": "Search for parent by email or phone and retrieve payment data",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "search_term",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Payment search results"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/payments/manual-pay-update": {
      "post": {
        "operationId": "updateManualPayment",
        "tags": [
          "Payments"
        ],
        "summary": "Record a manual payment",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "invoice_id",
                  "amount",
                  "payment_method"
                ],
                "properties": {
                  "invoice_id": {
                    "type": "integer"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "payment_method": {
                    "type": "string",
                    "enum": [
                      "cash",
                      "check",
                      "card"
                    ]
                  },
                  "check_number": {
                    "type": "string"
                  },
                  "payment_date": {
                    "type": "string",
                    "format": "date"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Payment recorded"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users/with-roles": {
      "get": {
        "operationId": "listUsersWithRoles",
        "tags": [
          "Users"
        ],
        "summary": "List users with their roles",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Users with roles"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/users/{id}": {
      "patch": {
        "operationId": "updateUser",
        "tags": [
          "Users"
        ],
        "summary": "Update user account/profile",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "address_street": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteUser",
        "tags": [
          "Users"
        ],
        "summary": "Delete a user",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/users/select-role": {
      "post": {
        "operationId": "selectUserRole",
        "tags": [
          "Users"
        ],
        "summary": "Select and update the logged-in user's role",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "role"
                ],
                "properties": {
                  "role": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Role selected"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/user/profile": {
      "get": {
        "operationId": "getUserProfile",
        "tags": [
          "Users"
        ],
        "summary": "Get the signed-in user's profile",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "User profile"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "patch": {
        "operationId": "updateUserProfile",
        "tags": [
          "Users"
        ],
        "summary": "Update user profile",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "address_street": {
                    "type": "string"
                  },
                  "apt": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "gender": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "password": {
                    "type": "string"
                  },
                  "current_password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Profile updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/teachers": {
      "get": {
        "operationId": "listTeachers",
        "tags": [
          "Teachers"
        ],
        "summary": "List teachers and teacher assistants",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated teachers"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/teachers/{id}": {
      "get": {
        "operationId": "getTeacher",
        "tags": [
          "Teachers"
        ],
        "summary": "Get teacher details with class assignments",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Teacher details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/teachers/{id}/classes": {
      "get": {
        "operationId": "getTeacherClasses",
        "tags": [
          "Teachers"
        ],
        "summary": "Get class sections assigned to a teacher",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Teacher classes"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/teachers/class-view": {
      "get": {
        "operationId": "getTeacherClassView",
        "tags": [
          "Teachers"
        ],
        "summary": "Get comprehensive class view data for logged-in teacher",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Class view data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/teachers/absence-form": {
      "get": {
        "operationId": "getTeacherAbsenceForm",
        "tags": [
          "Teachers"
        ],
        "summary": "Get absence form data for logged-in teacher",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Absence form data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/teachers/absence": {
      "post": {
        "operationId": "submitTeacherAbsence",
        "tags": [
          "Teachers"
        ],
        "summary": "Submit an absence/vacation request",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "dates",
                  "reason"
                ],
                "properties": {
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "date"
                    }
                  },
                  "reason": {
                    "type": "string"
                  },
                  "reason_type": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Absence submitted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/whatsapp": {
      "get": {
        "operationId": "getWhatsAppData",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Get initial data for WhatsApp management page",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "WhatsApp management data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/whatsapp/links": {
      "get": {
        "operationId": "listWhatsAppLinks",
        "tags": [
          "WhatsApp"
        ],
        "summary": "List WhatsApp invite links",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "WhatsApp links"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "saveWhatsAppLink",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Create or update invite link for a class section",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "class_section_id",
                  "invite_link"
                ],
                "properties": {
                  "class_section_id": {
                    "type": "integer"
                  },
                  "invite_link": {
                    "type": "string"
                  },
                  "active": {
                    "type": "integer",
                    "enum": [
                      0,
                      1
                    ]
                  },
                  "class_section_name": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Link saved"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/whatsapp/send-invites": {
      "post": {
        "operationId": "sendWhatsAppInvites",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Send WhatsApp invites in three modes",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "mode"
                ],
                "properties": {
                  "mode": {
                    "type": "string",
                    "enum": [
                      "parents",
                      "class",
                      "all"
                    ]
                  },
                  "parent_ids": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    }
                  },
                  "class_section_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Invites sent"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/whatsapp/parent-contacts": {
      "get": {
        "operationId": "getWhatsAppParentContacts",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Get flat list of all parent contacts",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Parent contacts"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/whatsapp/parent-contacts-by-class": {
      "get": {
        "operationId": "getWhatsAppParentContactsByClass",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Get parent contacts grouped by class section",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Parent contacts by class"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/whatsapp/memberships": {
      "post": {
        "operationId": "updateWhatsAppMembership",
        "tags": [
          "WhatsApp"
        ],
        "summary": "Update WhatsApp group membership flags",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "class_section_id"
                ],
                "properties": {
                  "class_section_id": {
                    "type": "integer"
                  },
                  "primary_id": {
                    "type": "integer"
                  },
                  "second_id": {
                    "type": "integer"
                  },
                  "primary_member": {
                    "type": [
                      "string",
                      "integer"
                    ]
                  },
                  "second_member": {
                    "type": [
                      "string",
                      "integer"
                    ]
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "semester": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Membership updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/health": {
      "get": {
        "operationId": "healthCheck",
        "tags": [
          "Health"
        ],
        "summary": "Health check endpoint",
        "responses": {
          "200": {
            "description": "Health status"
          },
          "503": {
            "description": "Service unavailable"
          }
        },
        "security": []
      }
    },
    "/api/v1/landing": {
      "get": {
        "operationId": "getLandingPage",
        "tags": [
          "Landing"
        ],
        "summary": "Get role-based dashboard data",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Landing page data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/landing/data": {
      "get": {
        "operationId": "getLandingPageData",
        "tags": [
          "Landing"
        ],
        "summary": "Get basic landing page bootstrap data",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Landing page data"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/staff": {
      "get": {
        "operationId": "listStaff",
        "tags": [
          "Staff"
        ],
        "summary": "List staff members",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "role",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated staff"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createStaff",
        "tags": [
          "Staff"
        ],
        "summary": "Create a new staff member",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstname",
                  "lastname",
                  "email",
                  "role_name"
                ],
                "properties": {
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "phone": {
                    "type": "string"
                  },
                  "role_name": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Staff created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/staff/{id}": {
      "get": {
        "operationId": "getStaff",
        "tags": [
          "Staff"
        ],
        "summary": "Get a single staff member",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Staff details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateStaff",
        "tags": [
          "Staff"
        ],
        "summary": "Update a staff member",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "phone": {
                    "type": "string"
                  },
                  "role_name": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Staff updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteStaff",
        "tags": [
          "Staff"
        ],
        "summary": "Delete a staff member",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Staff deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/suppliers": {
      "get": {
        "operationId": "listSuppliers",
        "tags": [
          "Suppliers"
        ],
        "summary": "List suppliers",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated suppliers"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createSupplier",
        "tags": [
          "Suppliers"
        ],
        "summary": "Create a new supplier",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "phone": {
                    "type": "string"
                  },
                  "address": {
                    "type": "string"
                  },
                  "notes": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Supplier created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/suppliers/{id}": {
      "get": {
        "operationId": "getSupplier",
        "tags": [
          "Suppliers"
        ],
        "summary": "Get a single supplier",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Supplier details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateSupplier",
        "tags": [
          "Suppliers"
        ],
        "summary": "Update a supplier",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "phone": {
                    "type": "string"
                  },
                  "address": {
                    "type": "string"
                  },
                  "notes": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Supplier updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteSupplier",
        "tags": [
          "Suppliers"
        ],
        "summary": "Delete a supplier",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Supplier deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/communications": {
      "get": {
        "operationId": "listCommunications",
        "tags": [
          "Communications"
        ],
        "summary": "List communications",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sender_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "receiver_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated communications"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "sendCommunication",
        "tags": [
          "Communications"
        ],
        "summary": "Send a communication",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "sender_id",
                  "receiver_id",
                  "subject",
                  "message"
                ],
                "properties": {
                  "sender_id": {
                    "type": "integer"
                  },
                  "receiver_id": {
                    "type": "integer"
                  },
                  "subject": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Communication sent"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/communications/{id}": {
      "delete": {
        "operationId": "deleteCommunication",
        "tags": [
          "Communications"
        ],
        "summary": "Delete a communication",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Communication deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/configuration": {
      "get": {
        "operationId": "listConfiguration",
        "tags": [
          "Configuration"
        ],
        "summary": "List configuration entries",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated configuration"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createConfiguration",
        "tags": [
          "Configuration"
        ],
        "summary": "Create a configuration entry",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "config_key",
                  "config_value"
                ],
                "properties": {
                  "config_key": {
                    "type": "string"
                  },
                  "config_value": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Configuration created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/configuration/{id}": {
      "get": {
        "operationId": "getConfiguration",
        "tags": [
          "Configuration"
        ],
        "summary": "Get a configuration entry",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateConfiguration",
        "tags": [
          "Configuration"
        ],
        "summary": "Update a configuration entry",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "config_key": {
                    "type": "string"
                  },
                  "config_value": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Configuration updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteConfiguration",
        "tags": [
          "Configuration"
        ],
        "summary": "Delete a configuration entry",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/configuration/key/{config_key}": {
      "get": {
        "operationId": "getConfigurationByKey",
        "tags": [
          "Configuration"
        ],
        "summary": "Get configuration by key",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "config_key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration value"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/discounts": {
      "get": {
        "operationId": "listDiscounts",
        "tags": [
          "Discounts"
        ],
        "summary": "List discount vouchers",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "active",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of discounts"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/discounts/{code}": {
      "get": {
        "operationId": "getDiscountByCode",
        "tags": [
          "Discounts"
        ],
        "summary": "Get discount by code",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Discount details"
          },
          "400": {
            "description": "Max usage reached"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found or inactive"
          }
        }
      }
    },
    "/api/v1/discounts/apply": {
      "post": {
        "operationId": "applyDiscount",
        "tags": [
          "Discounts"
        ],
        "summary": "Apply a discount code to an invoice",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "code",
                  "invoice_id"
                ],
                "properties": {
                  "code": {
                    "type": "string"
                  },
                  "invoice_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Discount applied"
          },
          "400": {
            "description": "Invalid discount or already applied"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/emergency-contacts": {
      "get": {
        "operationId": "listEmergencyContacts",
        "tags": [
          "Emergency Contacts"
        ],
        "summary": "List emergency contacts",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "parent_id",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated emergency contacts"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createEmergencyContact",
        "tags": [
          "Emergency Contacts"
        ],
        "summary": "Create an emergency contact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "parent_id",
                  "emergency_contact_name",
                  "cellphone",
                  "relation"
                ],
                "properties": {
                  "parent_id": {
                    "type": "integer"
                  },
                  "emergency_contact_name": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "relation": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Emergency contact created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/emergency-contacts/{id}": {
      "get": {
        "operationId": "getEmergencyContact",
        "tags": [
          "Emergency Contacts"
        ],
        "summary": "Get a single emergency contact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Emergency contact details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateEmergencyContact",
        "tags": [
          "Emergency Contacts"
        ],
        "summary": "Update an emergency contact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "emergency_contact_name": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "relation": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Emergency contact updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteEmergencyContact",
        "tags": [
          "Emergency Contacts"
        ],
        "summary": "Delete an emergency contact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Emergency contact deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/events": {
      "get": {
        "operationId": "listEvents",
        "tags": [
          "Events"
        ],
        "summary": "List events",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "upcoming",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of events"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createEvent",
        "tags": [
          "Events"
        ],
        "summary": "Create a new event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "event_name",
                  "amount",
                  "expiration_date"
                ],
                "properties": {
                  "event_name": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "expiration_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "description": {
                    "type": "string"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Event created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/events/{id}": {
      "get": {
        "operationId": "getEvent",
        "tags": [
          "Events"
        ],
        "summary": "Get a single event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Event details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateEvent",
        "tags": [
          "Events"
        ],
        "summary": "Update an event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "event_name": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "expiration_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Event updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteEvent",
        "tags": [
          "Events"
        ],
        "summary": "Delete an event",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Event deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/expenses": {
      "get": {
        "operationId": "listExpenses",
        "tags": [
          "Expenses"
        ],
        "summary": "List expenses",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated expenses"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createExpense",
        "tags": [
          "Expenses"
        ],
        "summary": "Create an expense",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "category",
                  "amount",
                  "description",
                  "date_of_purchase"
                ],
                "properties": {
                  "category": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "description": {
                    "type": "string"
                  },
                  "date_of_purchase": {
                    "type": "string",
                    "format": "date"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Expense created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/expenses/{id}": {
      "get": {
        "operationId": "getExpense",
        "tags": [
          "Expenses"
        ],
        "summary": "Get a single expense",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Expense details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateExpense",
        "tags": [
          "Expenses"
        ],
        "summary": "Update an expense",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "category": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "description": {
                    "type": "string"
                  },
                  "date_of_purchase": {
                    "type": "string",
                    "format": "date"
                  },
                  "status": {
                    "type": "string"
                  },
                  "status_reason": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Expense updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteExpense",
        "tags": [
          "Expenses"
        ],
        "summary": "Delete an expense",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Expense deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/extra-charges": {
      "get": {
        "operationId": "listExtraCharges",
        "tags": [
          "Extra Charges"
        ],
        "summary": "List extra charges",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated extra charges"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "createExtraCharge",
        "tags": [
          "Extra Charges"
        ],
        "summary": "Create an extra charge",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "parent_id",
                  "title",
                  "amount",
                  "charge_type"
                ],
                "properties": {
                  "parent_id": {
                    "type": "integer"
                  },
                  "title": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "charge_type": {
                    "type": "string",
                    "enum": [
                      "add",
                      "deduct"
                    ]
                  },
                  "due_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "invoice_id": {
                    "type": "integer"
                  },
                  "description": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "semester": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Extra charge created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/extra-charges/{id}": {
      "get": {
        "operationId": "getExtraCharge",
        "tags": [
          "Extra Charges"
        ],
        "summary": "Get a single extra charge",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Extra charge details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateExtraCharge",
        "tags": [
          "Extra Charges"
        ],
        "summary": "Update an extra charge",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "due_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "charge_type": {
                    "type": "string",
                    "enum": [
                      "add",
                      "deduct"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Extra charge updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "delete": {
        "operationId": "deleteExtraCharge",
        "tags": [
          "Extra Charges"
        ],
        "summary": "Delete an extra charge",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Extra charge deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/messages": {
      "get": {
        "operationId": "listMessages",
        "tags": [
          "Messages"
        ],
        "summary": "List messages",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "sent",
                "inbox"
              ]
            }
          },
          {
            "name": "read",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Messages"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "sendMessage",
        "tags": [
          "Messages"
        ],
        "summary": "Send a message",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "subject",
                  "message"
                ],
                "properties": {
                  "recipient_id": {
                    "type": "integer"
                  },
                  "recipient_role": {
                    "type": "string"
                  },
                  "subject": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "normal",
                      "high",
                      "low"
                    ]
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "sent",
                      "draft"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Message sent"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/messages/{id}": {
      "get": {
        "operationId": "getMessage",
        "tags": [
          "Messages"
        ],
        "summary": "Get a single message",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Message details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/messages/inbox": {
      "get": {
        "operationId": "getInboxMessages",
        "tags": [
          "Messages"
        ],
        "summary": "Get inbox messages",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Inbox messages"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/messages/sent": {
      "get": {
        "operationId": "getSentMessages",
        "tags": [
          "Messages"
        ],
        "summary": "Get sent messages",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Sent messages"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/notifications": {
      "get": {
        "operationId": "listNotifications",
        "tags": [
          "Notifications"
        ],
        "summary": "List notifications",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "read",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated notifications"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/notifications/{id}": {
      "get": {
        "operationId": "getNotification",
        "tags": [
          "Notifications"
        ],
        "summary": "Get a single notification",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Notification details"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/notifications/{id}/read": {
      "post": {
        "operationId": "markNotificationRead",
        "tags": [
          "Notifications"
        ],
        "summary": "Mark a notification as read",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Notification marked as read"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/settings": {
      "get": {
        "operationId": "getSettings",
        "tags": [
          "Settings"
        ],
        "summary": "Get grouped configuration values",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Settings"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "patch": {
        "operationId": "updateSettings",
        "tags": [
          "Settings"
        ],
        "summary": "Update settings",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "school_id": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  },
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "dob": {
                    "type": "string",
                    "format": "date"
                  },
                  "age": {
                    "type": "integer"
                  },
                  "gender": {
                    "type": "string"
                  },
                  "is_active": {
                    "type": "boolean"
                  },
                  "registration_grade": {
                    "type": "string"
                  },
                  "is_new": {
                    "type": "boolean"
                  },
                  "photo_consent": {
                    "type": "boolean"
                  },
                  "parent_id": {
                    "type": "integer"
                  },
                  "registration_date": {
                    "type": "string",
                    "format": "date"
                  },
                  "tuition_paid": {
                    "type": "boolean"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "year_of_registration": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Settings updated"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/scores/homework": {
      "get": {
        "operationId": "getHomeworkScores",
        "tags": [
          "Scores"
        ],
        "summary": "HomeworkController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/comments": {
      "get": {
        "operationId": "getScoreComments",
        "tags": [
          "Scores"
        ],
        "summary": "ScoreCommentController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/projects": {
      "get": {
        "operationId": "getProjectScores",
        "tags": [
          "Scores"
        ],
        "summary": "ProjectController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/quizzes": {
      "get": {
        "operationId": "getQuizScores",
        "tags": [
          "Scores"
        ],
        "summary": "QuizController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/midterm": {
      "get": {
        "operationId": "getMidtermScores",
        "tags": [
          "Scores"
        ],
        "summary": "MidtermController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/final": {
      "get": {
        "operationId": "getFinalScores",
        "tags": [
          "Scores"
        ],
        "summary": "FinalController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/participation": {
      "get": {
        "operationId": "getParticipationScores",
        "tags": [
          "Scores"
        ],
        "summary": "ParticipationController::index",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "class_section_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/projects/by-year": {
      "get": {
        "operationId": "getProjectScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "ProjectController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/quizzes/by-year": {
      "get": {
        "operationId": "getQuizScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "QuizController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/homework/by-year": {
      "get": {
        "operationId": "getHomeworkScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "HomeworkController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/midterm/by-year": {
      "get": {
        "operationId": "getMidtermScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "MidtermController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/final/by-year": {
      "get": {
        "operationId": "getFinalScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "FinalController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/scores/participation/by-year": {
      "get": {
        "operationId": "getParticipationScoresByYear",
        "tags": [
          "Scores"
        ],
        "summary": "ParticipationController::bySchoolYear",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "school_year",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/students/{studentId}": {
      "get": {
        "operationId": "getStudent",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::show",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "patch": {
        "operationId": "updateStudent",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::update",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deactivateStudent",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::destroy",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/classes": {
      "get": {
        "operationId": "getStudentClasses",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::classes",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "assignStudentClasses",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::assignClassForStudent",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "student_id",
                  "class_section_id"
                ],
                "properties": {
                  "student_id": {
                    "type": "integer"
                  },
                  "class_section_id": {
                    "type": "integer"
                  },
                  "class_section_ids": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    }
                  },
                  "is_event_only": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/classes/{classSectionId}": {
      "delete": {
        "operationId": "removeStudentClass",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::removeClassForStudent",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "classSectionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/promote": {
      "post": {
        "operationId": "promoteStudent",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::promote",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "cellphone"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "cellphone": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "relation": {
                    "type": "string"
                  },
                  "semester": {
                    "type": "string"
                  },
                  "school_year": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/attendance": {
      "get": {
        "operationId": "getStudentAttendance",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::attendance",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/incidents": {
      "get": {
        "operationId": "getStudentIncidents",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::incidents",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/scores": {
      "get": {
        "operationId": "getStudentScores",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::scores",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "school_year",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "semester",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/notes": {
      "get": {
        "operationId": "getStudentNotes",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::notes",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/parents": {
      "get": {
        "operationId": "getStudentParents",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::parents",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/emergency-contacts": {
      "get": {
        "operationId": "getStudentEmergencyContacts",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::emergencyContacts",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "addStudentEmergencyContact",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::addEmergencyContact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/emergency-contacts/{contactId}": {
      "patch": {
        "operationId": "updateStudentEmergencyContact",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::updateEmergencyContact",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "contactId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/badge_scan": {
      "post": {
        "operationId": "updateStudentBadgeScan",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::updateBadgeScan",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/photo": {
      "get": {
        "operationId": "getStudentPhoto",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::photo",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found"
          }
        }
      },
      "post": {
        "operationId": "uploadStudentPhoto",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::uploadPhoto",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "photo": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/report-card": {
      "get": {
        "operationId": "getStudentReportCard",
        "tags": [
          "Students"
        ],
        "summary": "ReportCardsController::studentReport",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/{studentId}/score-card": {
      "get": {
        "operationId": "getStudentScoreCard",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::scoreCard",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/students/assign-class": {
      "post": {
        "operationId": "assignClass",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::assignClass",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "student_id",
                  "class_section_id"
                ],
                "properties": {
                  "student_id": {
                    "type": "integer"
                  },
                  "class_section_id": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    }
                  },
                  "is_event_only": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/remove-class": {
      "post": {
        "operationId": "removeClass",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::removeClass",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "student_id",
                  "class_section_id"
                ],
                "properties": {
                  "student_id": {
                    "type": "integer"
                  },
                  "class_section_id": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/students/set-active": {
      "post": {
        "operationId": "setActive",
        "tags": [
          "Students"
        ],
        "summary": "StudentController::setActive",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "student_id",
                  "is_active"
                ],
                "properties": {
                  "student_id": {
                    "type": "integer"
                  },
                  "is_active": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "422": {
            "description": "Validation error"
          }
        }
      }
    },
    "/api/v1/time": {
      "get": {
        "operationId": "getServerTime",
        "tags": [
          "Time"
        ],
        "summary": "Get server timestamp and timezone",
        "responses": {
          "200": {
            "description": "Server time information"
          }
        },
        "security": []
      }
    }
  }
}
