11540 lines
283 KiB
JSON
11540 lines
283 KiB
JSON
{
|
|
"openapi": "3.0.0",
|
|
"paths": {
|
|
"/api/v1/rbac/roles": {
|
|
"get": {
|
|
"operationId": "RbacController_getRoles",
|
|
"summary": "Get all available roles with descriptions",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/RoleInfoDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/permissions": {
|
|
"get": {
|
|
"operationId": "RbacController_getPermissions",
|
|
"summary": "Get all available permissions",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/my-permissions": {
|
|
"get": {
|
|
"operationId": "RbacController_getMyPermissions",
|
|
"summary": "Get current user permissions",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/creatable-roles": {
|
|
"get": {
|
|
"operationId": "RbacController_getCreatableRoles",
|
|
"summary": "Get roles that current user can create",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/manageable-roles": {
|
|
"get": {
|
|
"operationId": "RbacController_getManageableRoles",
|
|
"summary": "Get roles that current user can manage",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/role/{role}/permissions": {
|
|
"get": {
|
|
"operationId": "RbacController_getRolePermissions",
|
|
"summary": "Get permissions for a specific role",
|
|
"parameters": [
|
|
{
|
|
"name": "role",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/user/{userId}/change-role": {
|
|
"post": {
|
|
"operationId": "RbacController_changeUserRole",
|
|
"summary": "Change user role",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChangeUserRoleDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
},
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/check-permission/{permission}": {
|
|
"get": {
|
|
"operationId": "RbacController_checkPermission",
|
|
"summary": "Check if current user has a specific permission",
|
|
"parameters": [
|
|
{
|
|
"name": "permission",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/can-create-role/{role}": {
|
|
"get": {
|
|
"operationId": "RbacController_canCreateRole",
|
|
"summary": "Check if current user can create a user with specific role",
|
|
"parameters": [
|
|
{
|
|
"name": "role",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/rbac/can-manage-role/{role}": {
|
|
"get": {
|
|
"operationId": "RbacController_canManageRole",
|
|
"summary": "Check if current user can manage users with specific role",
|
|
"parameters": [
|
|
{
|
|
"name": "role",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"RBAC"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/me": {
|
|
"get": {
|
|
"operationId": "UserController_getProfile",
|
|
"summary": "Get current user profile",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "UserController_updateProfile",
|
|
"summary": "Update current user profile",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users": {
|
|
"get": {
|
|
"operationId": "UserController_findAll",
|
|
"summary": "Get users that current user can manage",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/created-by-me": {
|
|
"get": {
|
|
"operationId": "UserController_getMyCreatedUsers",
|
|
"summary": "Get users created by current user",
|
|
"description": "Returns all users that were created by the currently authenticated user. Business Owners can see employees, accountants, and customer service users they created.",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "List of users created by current user",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/{id}": {
|
|
"get": {
|
|
"operationId": "UserController_findOne",
|
|
"summary": "Get user by ID (if user can manage them)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Cannot manage this user"
|
|
},
|
|
"404": {
|
|
"description": "User not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/{id}/deactivate": {
|
|
"patch": {
|
|
"operationId": "UserController_deactivate",
|
|
"summary": "Deactivate user (if user can manage them)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Cannot manage this user"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/{id}/activate": {
|
|
"patch": {
|
|
"operationId": "UserController_activate",
|
|
"summary": "Activate user (if user can manage them)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Cannot manage this user"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/users/{id}/change-role": {
|
|
"patch": {
|
|
"operationId": "UserController_changeRole",
|
|
"summary": "Change user role (if user can manage them)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChangeUserRoleDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Cannot manage this user or assign this role"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/register": {
|
|
"post": {
|
|
"operationId": "AuthController_register",
|
|
"summary": "Register a new user with role-based authorization",
|
|
"description": "Register a new user with conditional access control.\n\n**IMPORTANT: Role field is REQUIRED in request body**\n\n**Authorization Requirements:**\n- VIEWER: No token required (can be created by anyone)\n- EMPLOYEE, ACCOUNTANT, CUSTOMER_SERVICE: Business Owner or Admin token required\n- BUSINESS_OWNER: Admin token only\n- ADMIN, AUDITOR: Admin token only\n\n**Example Request Bodies:**\n\nFor VIEWER (no token needed):\n```json\n{\n \"email\": \"viewer@example.com\",\n \"phone\": \"+1234567890\",\n \"password\": \"Password@123\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"role\": \"VIEWER\"\n}\n```\n\nFor EMPLOYEE (Business Owner token required):\n```json\n{\n \"email\": \"employee@example.com\",\n \"phone\": \"+1234567891\",\n \"password\": \"Password@123\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Smith\",\n \"role\": \"EMPLOYEE\"\n}\n```\n\n**Note: Both email and phone number are required for all registrations. For public registration, simply use role \"VIEWER\" without any authorization token.**",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "User successfully registered",
|
|
"example": {
|
|
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
"user": {
|
|
"id": "uuid-string",
|
|
"email": "employee@example.com",
|
|
"firstName": "Jane",
|
|
"lastName": "Smith",
|
|
"role": "EMPLOYEE"
|
|
}
|
|
},
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AuthResponseDto"
|
|
},
|
|
"example": {
|
|
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
"user": {
|
|
"id": "uuid-string",
|
|
"email": "employee@example.com",
|
|
"firstName": "Jane",
|
|
"lastName": "Smith",
|
|
"role": "EMPLOYEE"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid role specified",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 400,
|
|
"message": [
|
|
"Role must be a valid UserRole"
|
|
],
|
|
"error": "Bad Request"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required for this role",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 401,
|
|
"message": "Authentication required to create user with role: EMPLOYEE.",
|
|
"error": "Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Insufficient permissions to create user with this role",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 403,
|
|
"message": "Insufficient permissions. EMPLOYEE cannot create users with role: BUSINESS_OWNER",
|
|
"error": "Forbidden"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "User already exists",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 409,
|
|
"message": "User with this email already exists",
|
|
"error": "Conflict"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/login": {
|
|
"post": {
|
|
"operationId": "AuthController_login",
|
|
"summary": "Login user with email or phone number",
|
|
"description": "Login using either email address or phone number along with password.\n\n**Login Options:**\n- Email + Password\n- Phone Number + Password\n\n**Example Request Bodies:**\n\nLogin with email:\n```json\n{\n \"email\": \"user@example.com\",\n \"password\": \"Password@123\"\n}\n```\n\nLogin with phone:\n```json\n{\n \"phone\": \"+1234567890\",\n \"password\": \"Password@123\"\n}\n```\n\n**Note: Provide either email OR phone number, not both.**",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "User successfully logged in",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AuthResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Invalid credentials"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/refresh": {
|
|
"post": {
|
|
"operationId": "AuthController_refresh",
|
|
"summary": "Refresh access token",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshTokenDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Token successfully refreshed"
|
|
},
|
|
"401": {
|
|
"description": "Invalid refresh token"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/profile": {
|
|
"get": {
|
|
"operationId": "AuthController_getProfile",
|
|
"summary": "Get current user profile with permissions",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "User profile with permissions retrieved successfully"
|
|
},
|
|
"404": {
|
|
"description": "User not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/logout": {
|
|
"post": {
|
|
"operationId": "AuthController_logout",
|
|
"summary": "Logout user",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "User successfully logged out"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/google": {
|
|
"get": {
|
|
"operationId": "AuthController_googleAuth",
|
|
"summary": "Initiate Google OAuth login",
|
|
"description": "Redirects to Google OAuth consent screen",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
},
|
|
"302": {
|
|
"description": "Redirects to Google OAuth"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/auth/google/callback": {
|
|
"get": {
|
|
"operationId": "AuthController_googleAuthRedirect",
|
|
"summary": "Google OAuth callback",
|
|
"description": "Handles Google OAuth callback and returns JWT tokens",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "User successfully authenticated with Google",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AuthResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Authentication"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices": {
|
|
"post": {
|
|
"operationId": "InvoiceController_create",
|
|
"summary": "Create a new invoice",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateInvoiceDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Invoice successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Invoice number already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "InvoiceController_findAll",
|
|
"summary": "Get all invoices with filtering and pagination",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "status",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DRAFT",
|
|
"PENDING",
|
|
"PAID",
|
|
"OVERDUE",
|
|
"CANCELLED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-01-01",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-12-31",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "customerName",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "Acme",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "invoiceNumber",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "INV-2024",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "search term",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/InvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/stats": {
|
|
"get": {
|
|
"operationId": "InvoiceController_getStats",
|
|
"summary": "Get invoice statistics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Invoice statistics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": {
|
|
"type": "number"
|
|
},
|
|
"paid": {
|
|
"type": "number"
|
|
},
|
|
"pending": {
|
|
"type": "number"
|
|
},
|
|
"overdue": {
|
|
"type": "number"
|
|
},
|
|
"totalRevenue": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/share/email": {
|
|
"post": {
|
|
"operationId": "InvoiceController_shareViaEmail",
|
|
"summary": "Share invoice via email",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendShareEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Invoice shared via email successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/share/link": {
|
|
"post": {
|
|
"operationId": "InvoiceController_shareViaLink",
|
|
"summary": "Generate shareable link for invoice",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateShareLinkDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Share link created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/{id}": {
|
|
"get": {
|
|
"operationId": "InvoiceController_findOne",
|
|
"summary": "Get invoice by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "InvoiceController_update",
|
|
"summary": "Update invoice",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateInvoiceDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "InvoiceController_delete",
|
|
"summary": "Delete invoice",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Invoice successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/{id}/pdf": {
|
|
"get": {
|
|
"operationId": "InvoiceController_downloadPDF",
|
|
"summary": "Download invoice as PDF",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "PDF file"
|
|
},
|
|
"404": {
|
|
"description": "Invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/invoices/{id}/status": {
|
|
"patch": {
|
|
"operationId": "InvoiceController_updateStatus",
|
|
"summary": "Update invoice status",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Invoices"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/share": {
|
|
"post": {
|
|
"operationId": "ShareController_create",
|
|
"summary": "Create a shareable link for an invoice",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateShareLinkDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Share link successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "ShareController_findAll",
|
|
"summary": "Get all share links",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/share/email": {
|
|
"post": {
|
|
"operationId": "ShareController_sendEmail",
|
|
"summary": "Create share link and send via email",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendShareEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Share link created and email sent",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/share/view/{token}": {
|
|
"get": {
|
|
"operationId": "ShareController_viewShared",
|
|
"summary": "View shared invoice by token (public)",
|
|
"parameters": [
|
|
{
|
|
"name": "token",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Invoice data"
|
|
},
|
|
"403": {
|
|
"description": "Share link expired or inactive"
|
|
},
|
|
"404": {
|
|
"description": "Share link not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/share/{id}/deactivate": {
|
|
"patch": {
|
|
"operationId": "ShareController_deactivate",
|
|
"summary": "Deactivate a share link",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ShareLinkResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/share/{id}": {
|
|
"delete": {
|
|
"operationId": "ShareController_delete",
|
|
"summary": "Delete a share link",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Share link successfully deleted"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Share"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/reports/generate": {
|
|
"post": {
|
|
"operationId": "ReportController_generate",
|
|
"summary": "Generate report (monthly/quarterly/annual)",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/GenerateReportDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Report successfully generated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReportResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/reports/latest": {
|
|
"get": {
|
|
"operationId": "ReportController_getLatest",
|
|
"summary": "Get latest generated report",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReportResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "No reports found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/reports": {
|
|
"get": {
|
|
"operationId": "ReportController_findAll",
|
|
"summary": "Get all reports (with optional pagination)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReportResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/reports/{id}": {
|
|
"get": {
|
|
"operationId": "ReportController_findOne",
|
|
"summary": "Get report by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReportResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Report not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "ReportController_delete",
|
|
"summary": "Delete report",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Report successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Report not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/reports/{id}/download": {
|
|
"get": {
|
|
"operationId": "ReportController_downloadPDF",
|
|
"summary": "Download report PDF",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "PDF file"
|
|
},
|
|
"404": {
|
|
"description": "Report or PDF not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Reports"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications/subscribe": {
|
|
"post": {
|
|
"operationId": "NotificationController_subscribe",
|
|
"summary": "Subscribe to push notifications",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SubscribeDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully subscribed"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications/unsubscribe/{endpoint}": {
|
|
"delete": {
|
|
"operationId": "NotificationController_unsubscribe",
|
|
"summary": "Unsubscribe from push notifications",
|
|
"parameters": [
|
|
{
|
|
"name": "endpoint",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully unsubscribed"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications/send": {
|
|
"post": {
|
|
"operationId": "NotificationController_send",
|
|
"summary": "Send push notification (Admin only)",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendNotificationDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Notification sent successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/NotificationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications": {
|
|
"get": {
|
|
"operationId": "NotificationController_findAll",
|
|
"summary": "Get all notifications for current user",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/NotificationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications/settings": {
|
|
"get": {
|
|
"operationId": "NotificationController_getSettings",
|
|
"summary": "Get user notification settings",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Notification settings retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"invoiceReminders": {
|
|
"type": "boolean"
|
|
},
|
|
"daysBeforeDueDate": {
|
|
"type": "number"
|
|
},
|
|
"newsAlerts": {
|
|
"type": "boolean"
|
|
},
|
|
"reportReady": {
|
|
"type": "boolean"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "NotificationController_updateSettings",
|
|
"summary": "Update user notification settings",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateNotificationSettingsDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Notification settings updated successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"invoiceReminders": {
|
|
"type": "boolean"
|
|
},
|
|
"daysBeforeDueDate": {
|
|
"type": "number"
|
|
},
|
|
"newsAlerts": {
|
|
"type": "boolean"
|
|
},
|
|
"reportReady": {
|
|
"type": "boolean"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/notifications/invoice/{id}/reminder": {
|
|
"post": {
|
|
"operationId": "NotificationController_sendInvoiceReminder",
|
|
"summary": "Send invoice due reminder",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Reminder sent successfully"
|
|
},
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Notifications"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/news": {
|
|
"get": {
|
|
"operationId": "NewsController_findAll",
|
|
"summary": "Get all news/announcements (public)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "isPublished",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"default": true,
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
{
|
|
"name": "category",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"ANNOUNCEMENT",
|
|
"UPDATE",
|
|
"MAINTENANCE",
|
|
"NEWS"
|
|
],
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
]
|
|
},
|
|
"post": {
|
|
"operationId": "NewsController_create",
|
|
"summary": "Create news article (Admin only)",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateNewsDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/news/latest": {
|
|
"get": {
|
|
"operationId": "NewsController_getLatest",
|
|
"summary": "Get latest news items (public)",
|
|
"parameters": [
|
|
{
|
|
"name": "limit",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/news/{id}": {
|
|
"get": {
|
|
"operationId": "NewsController_findOne",
|
|
"summary": "Get news by ID (public)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "News not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "NewsController_update",
|
|
"summary": "Update news article (Admin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateNewsDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "NewsController_delete",
|
|
"summary": "Delete news (Admin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "News successfully deleted"
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/news/{id}/read": {
|
|
"post": {
|
|
"operationId": "NewsController_markAsRead",
|
|
"summary": "Mark news item as read",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "News marked as read"
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/news/{id}/toggle-publish": {
|
|
"patch": {
|
|
"operationId": "NewsController_togglePublish",
|
|
"summary": "Toggle news publish status (Admin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/NewsResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"News"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/upload": {
|
|
"post": {
|
|
"operationId": "DocumentController_upload",
|
|
"summary": "Upload a document",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"format": "binary"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"PDF",
|
|
"EXCEL",
|
|
"IMAGE",
|
|
"OTHER"
|
|
]
|
|
},
|
|
"invoiceId": {
|
|
"type": "string"
|
|
},
|
|
"isPublic": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"file",
|
|
"type"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Document successfully uploaded",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DocumentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid file or request"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents": {
|
|
"get": {
|
|
"operationId": "DocumentController_findAll",
|
|
"summary": "Get all documents (filterable by category)",
|
|
"parameters": [
|
|
{
|
|
"name": "category",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DocumentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/storage-usage": {
|
|
"get": {
|
|
"operationId": "DocumentController_getStorageUsage",
|
|
"summary": "Get user storage usage statistics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Storage usage statistics"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/{id}/preview": {
|
|
"get": {
|
|
"operationId": "DocumentController_getPreview",
|
|
"summary": "Get document preview URL",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Document preview URL",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"previewUrl": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/{id}": {
|
|
"get": {
|
|
"operationId": "DocumentController_findOne",
|
|
"summary": "Get document metadata by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DocumentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Document not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "DocumentController_delete",
|
|
"summary": "Delete document",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Document successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Document not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/{id}/download": {
|
|
"get": {
|
|
"operationId": "DocumentController_download",
|
|
"summary": "Download document file",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "File stream"
|
|
},
|
|
"404": {
|
|
"description": "Document not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/documents/public/{id}/download": {
|
|
"get": {
|
|
"operationId": "DocumentController_downloadPublic",
|
|
"summary": "Download public document file (no auth required)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "File stream"
|
|
},
|
|
"404": {
|
|
"description": "Document not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Documents"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma": {
|
|
"post": {
|
|
"operationId": "ProformaController_create",
|
|
"summary": "Create a new proforma invoice",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateProformaDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Proforma successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Proforma number already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "ProformaController_findAll",
|
|
"summary": "Get all proforma invoices with filtering and pagination",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-01-01",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-12-31",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "customerName",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "Acme",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "proformaNumber",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "PROF-2024",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "search term",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma/{id}": {
|
|
"get": {
|
|
"operationId": "ProformaController_findOne",
|
|
"summary": "Get proforma invoice by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Proforma not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "ProformaController_update",
|
|
"summary": "Update proforma invoice",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateProformaDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Proforma not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "ProformaController_delete",
|
|
"summary": "Delete proforma invoice",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Proforma successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Proforma not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma/{id}/pdf": {
|
|
"get": {
|
|
"operationId": "ProformaController_downloadPDF",
|
|
"summary": "Download proforma invoice as PDF",
|
|
"description": "Generate and download proforma invoice as PDF. \n \n**Company Information Priority:**\n1. **Override**: Use companyName query parameter if provided\n2. **Database**: Fetch from your company profile if exists\n3. **Fallback**: Use default company name from configuration\n\n**Company Profile Data Included (if available):**\n- Company name, address, city, state, zip code, country\n- Phone, email, website, TIN (Tax Identification Number)\n- Company logo (if uploaded)\n\n**Usage Examples:**\n- Default: `GET /proforma/123/pdf`\n- With override: `GET /proforma/123/pdf?companyName=Custom Company Ltd.`",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "companyName",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Override company name for this PDF (max 100 characters)",
|
|
"schema": {
|
|
"example": "Custom Company Name Ltd.",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "PDF file generated successfully",
|
|
"headers": {
|
|
"Content-Type": {
|
|
"description": "application/pdf"
|
|
},
|
|
"Content-Disposition": {
|
|
"description": "attachment; filename=\"proforma_[number]_[id].pdf\""
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Proforma not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma/company/info": {
|
|
"get": {
|
|
"operationId": "ProformaController_getCompanyInfo",
|
|
"summary": "Get company information for proforma generation",
|
|
"description": "Get current company information that will be used in proforma PDFs",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Company information retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"hasCompanyInfo": true,
|
|
"companyName": "My Company Ltd.",
|
|
"address": "123 Business St, City, State 12345",
|
|
"contact": "Phone: +1234567890 | Email: info@company.com",
|
|
"tin": "TIN123456789"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/payments": {
|
|
"post": {
|
|
"operationId": "PaymentController_create",
|
|
"summary": "Create a new payment record",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreatePaymentDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Payment successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Transaction ID already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "PaymentController_findAll",
|
|
"summary": "Get all payments (filterable by invoiceId)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "invoiceId",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "invoice-123-id",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/payments/{id}": {
|
|
"get": {
|
|
"operationId": "PaymentController_findOne",
|
|
"summary": "Get payment details by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Payment not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "PaymentController_update",
|
|
"summary": "Update payment record",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdatePaymentDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Payment not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "PaymentController_delete",
|
|
"summary": "Delete payment record",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Payment successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Payment not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/payments/{id}/flag": {
|
|
"post": {
|
|
"operationId": "PaymentController_flag",
|
|
"summary": "Flag payment as fake/scam/other",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FlagPaymentDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Payment not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/payments/{paymentId}/associate": {
|
|
"post": {
|
|
"operationId": "PaymentController_associate",
|
|
"summary": "Associate payment with invoice",
|
|
"parameters": [
|
|
{
|
|
"name": "paymentId",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AssociatePaymentDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Payment or invoice not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Payments"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/metrics": {
|
|
"get": {
|
|
"operationId": "DashboardController_getMetrics",
|
|
"summary": "Get dashboard metrics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Dashboard metrics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DashboardMetricsDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/invoice-trends": {
|
|
"get": {
|
|
"operationId": "DashboardController_getInvoiceTrends",
|
|
"summary": "Get invoice trends",
|
|
"parameters": [
|
|
{
|
|
"name": "period",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Invoice trends retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"date": {
|
|
"type": "string"
|
|
},
|
|
"count": {
|
|
"type": "number"
|
|
},
|
|
"revenue": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/revenue-trends": {
|
|
"get": {
|
|
"operationId": "DashboardController_getRevenueTrends",
|
|
"summary": "Get revenue trends",
|
|
"parameters": [
|
|
{
|
|
"name": "period",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Revenue trends retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"date": {
|
|
"type": "string"
|
|
},
|
|
"revenue": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/invoice-status": {
|
|
"get": {
|
|
"operationId": "DashboardController_getInvoiceStatus",
|
|
"summary": "Get invoice status breakdown",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Invoice status breakdown retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"count": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/sales-purchase": {
|
|
"get": {
|
|
"operationId": "DashboardController_getSalesPurchaseComparison",
|
|
"summary": "Get sales vs purchase comparison",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Sales vs purchase comparison retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sales": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"count": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"purchases": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"count": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/dashboard/scanned-invoices": {
|
|
"get": {
|
|
"operationId": "DashboardController_getScannedInvoices",
|
|
"summary": "Get scanned invoices pending verification",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Scanned invoices retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"invoiceNumber": {
|
|
"type": "string"
|
|
},
|
|
"customerName": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
},
|
|
"issueDate": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"scannedData": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/company": {
|
|
"get": {
|
|
"operationId": "CompanyController_getCompany",
|
|
"summary": "Get company information",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Company information retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CompanyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Company not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Company"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "CompanyController_updateCompany",
|
|
"summary": "Update company information",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateCompanyDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Company information updated successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CompanyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Company"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/company/logo": {
|
|
"post": {
|
|
"operationId": "CompanyController_uploadLogo",
|
|
"summary": "Upload company logo",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"format": "binary"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Logo uploaded successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CompanyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CompanyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Company"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/team": {
|
|
"get": {
|
|
"operationId": "TeamController_findAll",
|
|
"summary": "List team members (paginated)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TeamMemberResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Team"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"post": {
|
|
"operationId": "TeamController_create",
|
|
"summary": "Add team member",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateTeamMemberDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Team member successfully added",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TeamMemberResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Team member already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Team"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/team/{id}": {
|
|
"put": {
|
|
"operationId": "TeamController_update",
|
|
"summary": "Update team member",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateTeamMemberDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Team member successfully updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TeamMemberResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Team member not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Team"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "TeamController_delete",
|
|
"summary": "Delete team member",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Team member successfully deleted"
|
|
},
|
|
"404": {
|
|
"description": "Team member not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Team"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/team/invite": {
|
|
"post": {
|
|
"operationId": "TeamController_invite",
|
|
"summary": "Invite team member via email",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InviteTeamMemberDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Team member invitation sent",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TeamMemberResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Team member already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Team"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/integration/endpoints": {
|
|
"get": {
|
|
"operationId": "IntegrationController_getEndpoints",
|
|
"summary": "Get available API endpoints documentation",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "API endpoints documentation"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Integration"
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/integration/keys": {
|
|
"get": {
|
|
"operationId": "IntegrationController_findAll",
|
|
"summary": "List API keys",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "API keys retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ApiKeyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Integration"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"post": {
|
|
"operationId": "IntegrationController_create",
|
|
"summary": "Create new API key",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateApiKeyDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "API key successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ApiKeyResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Integration"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/integration/keys/{id}": {
|
|
"delete": {
|
|
"operationId": "IntegrationController_delete",
|
|
"summary": "Delete API key",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "API key successfully deleted"
|
|
},
|
|
"404": {
|
|
"description": "API key not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Integration"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/scan/invoice": {
|
|
"post": {
|
|
"operationId": "ScanController_scanInvoice",
|
|
"summary": "Scan invoice image and extract data",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"format": "binary"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Invoice scanned successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanInvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanInvoiceResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid file"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Scan"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/scan/payment-receipt": {
|
|
"post": {
|
|
"operationId": "ScanController_scanPaymentReceipt",
|
|
"summary": "Scan payment receipt image and extract data",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"format": "binary"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Payment receipt scanned successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanPaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanPaymentResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid file"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Scan"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/scan/images/invoice/{invoiceId}": {
|
|
"get": {
|
|
"operationId": "ScanImageController_getInvoiceImage",
|
|
"summary": "Get scanned invoice image",
|
|
"parameters": [
|
|
{
|
|
"name": "invoiceId",
|
|
"required": true,
|
|
"in": "path",
|
|
"description": "Invoice ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Image file returned"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Invoice or image not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Scan Images"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/scan/images/payment/{paymentId}": {
|
|
"get": {
|
|
"operationId": "ScanImageController_getPaymentImage",
|
|
"summary": "Get scanned payment receipt image",
|
|
"parameters": [
|
|
{
|
|
"name": "paymentId",
|
|
"required": true,
|
|
"in": "path",
|
|
"description": "Payment ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Image file returned"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Payment or image not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Scan Images"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs": {
|
|
"get": {
|
|
"operationId": "AdminController_getLogs",
|
|
"summary": "Get application logs",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "level",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DEBUG",
|
|
"INFO",
|
|
"WARN",
|
|
"ERROR",
|
|
"FATAL"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"APPLICATION",
|
|
"ACCESS",
|
|
"ERROR",
|
|
"DATABASE",
|
|
"EMAIL",
|
|
"NOTIFICATION",
|
|
"AUDIT"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "userId",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "minDuration",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 0,
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/errors": {
|
|
"get": {
|
|
"operationId": "AdminController_getErrorLogs",
|
|
"summary": "Get error logs only",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "level",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DEBUG",
|
|
"INFO",
|
|
"WARN",
|
|
"ERROR",
|
|
"FATAL"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"APPLICATION",
|
|
"ACCESS",
|
|
"ERROR",
|
|
"DATABASE",
|
|
"EMAIL",
|
|
"NOTIFICATION",
|
|
"AUDIT"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "userId",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "minDuration",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 0,
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/access": {
|
|
"get": {
|
|
"operationId": "AdminController_getAccessLogs",
|
|
"summary": "Get access logs",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "level",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DEBUG",
|
|
"INFO",
|
|
"WARN",
|
|
"ERROR",
|
|
"FATAL"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"APPLICATION",
|
|
"ACCESS",
|
|
"ERROR",
|
|
"DATABASE",
|
|
"EMAIL",
|
|
"NOTIFICATION",
|
|
"AUDIT"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "userId",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "minDuration",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 0,
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/{id}": {
|
|
"get": {
|
|
"operationId": "AdminController_getLogById",
|
|
"summary": "Get log by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/stats/summary": {
|
|
"get": {
|
|
"operationId": "AdminController_getLogStats",
|
|
"summary": "Get log statistics",
|
|
"parameters": [
|
|
{
|
|
"name": "startDate",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/export": {
|
|
"post": {
|
|
"operationId": "AdminController_exportLogs",
|
|
"summary": "Export logs",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "level",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DEBUG",
|
|
"INFO",
|
|
"WARN",
|
|
"ERROR",
|
|
"FATAL"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"APPLICATION",
|
|
"ACCESS",
|
|
"ERROR",
|
|
"DATABASE",
|
|
"EMAIL",
|
|
"NOTIFICATION",
|
|
"AUDIT"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "userId",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "startDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "minDuration",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 0,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "format",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/logs/cleanup": {
|
|
"post": {
|
|
"operationId": "AdminController_cleanupLogs",
|
|
"summary": "Cleanup old logs",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/system/health": {
|
|
"get": {
|
|
"operationId": "AdminController_getSystemHealth",
|
|
"summary": "Get system health status",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/system/info": {
|
|
"get": {
|
|
"operationId": "AdminController_getSystemInfo",
|
|
"summary": "Get system information",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/system/settings": {
|
|
"get": {
|
|
"operationId": "AdminController_getSettings",
|
|
"summary": "Get system settings",
|
|
"parameters": [
|
|
{
|
|
"name": "category",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"post": {
|
|
"operationId": "AdminController_createSetting",
|
|
"summary": "Create system setting",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateSystemSettingDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/system/settings/{key}": {
|
|
"get": {
|
|
"operationId": "AdminController_getSetting",
|
|
"summary": "Get specific setting",
|
|
"parameters": [
|
|
{
|
|
"name": "key",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "AdminController_updateSetting",
|
|
"summary": "Update system setting",
|
|
"parameters": [
|
|
{
|
|
"name": "key",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSystemSettingDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "AdminController_deleteSetting",
|
|
"summary": "Delete system setting",
|
|
"parameters": [
|
|
{
|
|
"name": "key",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/maintenance": {
|
|
"get": {
|
|
"operationId": "AdminController_getMaintenanceStatus",
|
|
"summary": "Get maintenance mode status",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/maintenance/enable": {
|
|
"post": {
|
|
"operationId": "AdminController_enableMaintenance",
|
|
"summary": "Enable maintenance mode",
|
|
"parameters": [],
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/maintenance/disable": {
|
|
"post": {
|
|
"operationId": "AdminController_disableMaintenance",
|
|
"summary": "Disable maintenance mode",
|
|
"parameters": [],
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/announcements": {
|
|
"get": {
|
|
"operationId": "AdminController_getAnnouncements",
|
|
"summary": "Get all announcements",
|
|
"parameters": [
|
|
{
|
|
"name": "activeOnly",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"post": {
|
|
"operationId": "AdminController_createAnnouncement",
|
|
"summary": "Create announcement",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateAnnouncementDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/announcements/{id}": {
|
|
"put": {
|
|
"operationId": "AdminController_updateAnnouncement",
|
|
"summary": "Update announcement",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "AdminController_deleteAnnouncement",
|
|
"summary": "Delete announcement",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/announcements/{id}/toggle": {
|
|
"patch": {
|
|
"operationId": "AdminController_toggleAnnouncement",
|
|
"summary": "Toggle announcement active status",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users": {
|
|
"get": {
|
|
"operationId": "AdminController_getAllUsers",
|
|
"summary": "Get all users with filters",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users/{id}": {
|
|
"get": {
|
|
"operationId": "AdminController_getUserDetails",
|
|
"summary": "Get user details",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "AdminController_updateUser",
|
|
"summary": "Update user",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "AdminController_deleteUser",
|
|
"summary": "Delete user",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "hard",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users/{id}/activity": {
|
|
"get": {
|
|
"operationId": "AdminController_getUserActivity",
|
|
"summary": "Get user activity",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users/export": {
|
|
"post": {
|
|
"operationId": "AdminController_exportUsers",
|
|
"summary": "Export users",
|
|
"parameters": [
|
|
{
|
|
"name": "format",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users/import": {
|
|
"post": {
|
|
"operationId": "AdminController_importUsers",
|
|
"summary": "Bulk import users from CSV",
|
|
"parameters": [],
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/users/{id}/reset-password": {
|
|
"post": {
|
|
"operationId": "AdminController_resetUserPassword",
|
|
"summary": "Reset user password",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/audit/logs": {
|
|
"get": {
|
|
"operationId": "AdminController_getAuditLogs",
|
|
"summary": "Get audit logs",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/audit/users/{userId}": {
|
|
"get": {
|
|
"operationId": "AdminController_getUserAudit",
|
|
"summary": "Get user activity audit log",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/audit/resource/{type}/{id}": {
|
|
"get": {
|
|
"operationId": "AdminController_getResourceHistory",
|
|
"summary": "Get resource change history",
|
|
"parameters": [
|
|
{
|
|
"name": "type",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/audit/stats": {
|
|
"get": {
|
|
"operationId": "AdminController_getAuditStats",
|
|
"summary": "Get audit statistics",
|
|
"parameters": [
|
|
{
|
|
"name": "startDate",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "endDate",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/overview": {
|
|
"get": {
|
|
"operationId": "AdminController_getPlatformOverview",
|
|
"summary": "Get platform overview",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/users/growth": {
|
|
"get": {
|
|
"operationId": "AdminController_getUserGrowth",
|
|
"summary": "Get user growth analytics",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/revenue": {
|
|
"get": {
|
|
"operationId": "AdminController_getRevenueAnalytics",
|
|
"summary": "Get revenue analytics",
|
|
"parameters": [
|
|
{
|
|
"name": "period",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/storage": {
|
|
"get": {
|
|
"operationId": "AdminController_getStorageAnalytics",
|
|
"summary": "Get storage analytics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/api-usage": {
|
|
"get": {
|
|
"operationId": "AdminController_getApiUsage",
|
|
"summary": "Get API usage statistics",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/analytics/error-rate": {
|
|
"get": {
|
|
"operationId": "AdminController_getErrorRate",
|
|
"summary": "Get error rate",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/failed-logins": {
|
|
"get": {
|
|
"operationId": "AdminController_getFailedLogins",
|
|
"summary": "Get failed login attempts",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/suspicious-activity": {
|
|
"get": {
|
|
"operationId": "AdminController_getSuspiciousActivity",
|
|
"summary": "Get suspicious activity",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/api-keys": {
|
|
"get": {
|
|
"operationId": "AdminController_getAllApiKeys",
|
|
"summary": "Get all API keys",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/api-keys/{id}/revoke": {
|
|
"patch": {
|
|
"operationId": "AdminController_revokeApiKey",
|
|
"summary": "Revoke API key",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/rate-limits": {
|
|
"get": {
|
|
"operationId": "AdminController_getRateLimitViolations",
|
|
"summary": "Get rate limit violations",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"required": true,
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/security/sessions": {
|
|
"get": {
|
|
"operationId": "AdminController_getActiveSessions",
|
|
"summary": "Get active sessions",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": ""
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-requests": {
|
|
"get": {
|
|
"operationId": "AdminController_getAllProformaRequests",
|
|
"summary": "Get all proforma requests (admin view)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "status",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DRAFT",
|
|
"OPEN",
|
|
"UNDER_REVIEW",
|
|
"REVISION_REQUESTED",
|
|
"CLOSED",
|
|
"CANCELLED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "category",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"EQUIPMENT",
|
|
"SERVICE",
|
|
"MIXED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "equipment",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "deadlineFrom",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-01-01T00:00:00Z",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "deadlineTo",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-12-31T23:59:59Z",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-requests/{id}": {
|
|
"get": {
|
|
"operationId": "AdminController_getProformaRequest",
|
|
"summary": "Get proforma request details (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-requests/{id}/submissions": {
|
|
"get": {
|
|
"operationId": "AdminController_getProformaRequestSubmissions",
|
|
"summary": "Get all submissions for a proforma request (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-submissions/{id}": {
|
|
"get": {
|
|
"operationId": "AdminController_getProformaSubmission",
|
|
"summary": "Get submission details (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-submissions/{id}/accept": {
|
|
"post": {
|
|
"operationId": "AdminController_acceptProformaSubmission",
|
|
"summary": "Accept a submission (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-submissions/{id}/reject": {
|
|
"post": {
|
|
"operationId": "AdminController_rejectProformaSubmission",
|
|
"summary": "Reject a submission (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/proforma-requests/{id}/comparison-data": {
|
|
"get": {
|
|
"operationId": "AdminController_getProformaComparisonData",
|
|
"summary": "Get comparison data for proforma request (admin)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ComparisonDataDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/bootstrap-admin": {
|
|
"post": {
|
|
"operationId": "AdminController_bootstrapAdmin",
|
|
"summary": "Bootstrap admin creation (No authentication required)",
|
|
"description": "Create initial admin users to bootstrap the system. This endpoint is only available when there are fewer than 2 admins in the system.\n \n**Bootstrap Rules:**\n- Maximum of 2 admins can be created through this endpoint\n- No authentication required for system initialization\n- Once 2 admins exist, this endpoint becomes unavailable\n- Email and phone number must be unique\n- Strong password requirements enforced\n\n**Password Requirements:**\n- Minimum 8 characters\n- Must contain uppercase letter\n- Must contain lowercase letter \n- Must contain number\n- Must contain special character (@$!%*?&)\n\n**Use Case:**\nThis endpoint is designed for initial system setup when no admins exist yet. After creating the first 2 admins, use the regular authenticated admin creation endpoint.",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateAdminDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Bootstrap admin successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"admin": {
|
|
"id": "uuid-string",
|
|
"email": "admin@example.com",
|
|
"phone": "+1234567890",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"role": "ADMIN",
|
|
"isActive": true,
|
|
"createdAt": "2024-01-01T00:00:00.000Z"
|
|
},
|
|
"stats": {
|
|
"totalAdmins": 1,
|
|
"activeAdmins": 1,
|
|
"maxBootstrapAdmins": 2,
|
|
"remainingBootstrapSlots": 1,
|
|
"canCreateMore": true
|
|
},
|
|
"message": "Bootstrap admin successfully created"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Bootstrap limit reached or not available",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 403,
|
|
"message": "Bootstrap admin creation is no longer available. Maximum of 2 bootstrap admins already exist.",
|
|
"error": "Forbidden"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "User already exists",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 409,
|
|
"message": "User with this email already exists",
|
|
"error": "Conflict"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/create-admin": {
|
|
"post": {
|
|
"operationId": "AdminController_createAdmin",
|
|
"summary": "Create a new admin user",
|
|
"description": "Create a new admin user with limited slots available.\n \n**Admin Creation Rules:**\n- Maximum number of admins is configurable (default: 5)\n- Only existing admins can create new admin accounts\n- Email and phone number must be unique\n- Strong password requirements enforced\n- All admin creations are logged for audit purposes\n\n**Password Requirements:**\n- Minimum 8 characters\n- Must contain uppercase letter\n- Must contain lowercase letter \n- Must contain number\n- Must contain special character (@$!%*?&)\n\n**Response includes:**\n- Created admin details\n- Current admin statistics\n- Remaining admin slots available",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateAdminDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Admin successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"admin": {
|
|
"id": "uuid-string",
|
|
"email": "admin@example.com",
|
|
"phone": "+1234567890",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"role": "ADMIN",
|
|
"isActive": true,
|
|
"createdAt": "2024-01-01T00:00:00.000Z"
|
|
},
|
|
"stats": {
|
|
"totalAdmins": 2,
|
|
"activeAdmins": 2,
|
|
"maxAdmins": 5,
|
|
"remainingSlots": 3,
|
|
"canCreateMore": true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid input data",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 400,
|
|
"message": [
|
|
"Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character"
|
|
],
|
|
"error": "Bad Request"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Maximum admin limit reached",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 403,
|
|
"message": "Maximum number of admins (5) has been reached. Cannot create more admin accounts.",
|
|
"error": "Forbidden"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "User already exists",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 409,
|
|
"message": "User with this email already exists",
|
|
"error": "Conflict"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/bootstrap-stats": {
|
|
"get": {
|
|
"operationId": "AdminController_getBootstrapStats",
|
|
"summary": "Get bootstrap admin statistics",
|
|
"description": "Get current bootstrap admin availability and limits (no authentication required)",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Bootstrap statistics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"totalAdmins": 1,
|
|
"activeAdmins": 1,
|
|
"maxBootstrapAdmins": 2,
|
|
"remainingBootstrapSlots": 1,
|
|
"canCreateMore": true,
|
|
"bootstrapAvailable": true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/admin-stats": {
|
|
"get": {
|
|
"operationId": "AdminController_getAdminStats",
|
|
"summary": "Get admin statistics",
|
|
"description": "Get current admin count, limits, and availability information",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Admin statistics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"totalAdmins": 3,
|
|
"activeAdmins": 2,
|
|
"maxAdmins": 5,
|
|
"remainingSlots": 2,
|
|
"canCreateMore": true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/admins": {
|
|
"get": {
|
|
"operationId": "AdminController_getAllAdmins",
|
|
"summary": "Get all admin users",
|
|
"description": "Get list of all admin users with their details and statistics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Admin list retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"admins": [
|
|
{
|
|
"id": "uuid-string",
|
|
"email": "admin1@example.com",
|
|
"phone": "+1234567890",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"role": "ADMIN",
|
|
"isActive": true,
|
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
|
"updatedAt": "2024-01-01T00:00:00.000Z"
|
|
}
|
|
],
|
|
"stats": {
|
|
"totalAdmins": 1,
|
|
"activeAdmins": 1,
|
|
"maxAdmins": 5,
|
|
"remainingSlots": 4,
|
|
"canCreateMore": true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/admins/{id}/deactivate": {
|
|
"patch": {
|
|
"operationId": "AdminController_deactivateAdmin",
|
|
"summary": "Deactivate an admin user",
|
|
"description": "Deactivate an admin user account.\n \n**Deactivation Rules:**\n- Cannot deactivate the last active admin\n- Cannot deactivate your own admin account\n- Deactivation is logged for audit purposes",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Admin successfully deactivated",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"id": "uuid-string",
|
|
"email": "admin@example.com",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"isActive": false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Cannot deactivate admin",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"statusCode": 400,
|
|
"message": "Cannot deactivate the last active admin",
|
|
"error": "Bad Request"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/admin/admins/{id}/reactivate": {
|
|
"patch": {
|
|
"operationId": "AdminController_reactivateAdmin",
|
|
"summary": "Reactivate an admin user",
|
|
"description": "Reactivate a previously deactivated admin user account",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Admin successfully reactivated",
|
|
"content": {
|
|
"application/json": {
|
|
"example": {
|
|
"id": "uuid-string",
|
|
"email": "admin@example.com",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"isActive": true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests": {
|
|
"post": {
|
|
"operationId": "ProformaCollectorController_createRequest",
|
|
"summary": "Create a new proforma request",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateProformaRequestDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Proforma request created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "ProformaCollectorController_listRequests",
|
|
"summary": "List all proforma requests (filtered)",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"default": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "status",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"DRAFT",
|
|
"OPEN",
|
|
"UNDER_REVIEW",
|
|
"REVISION_REQUESTED",
|
|
"CLOSED",
|
|
"CANCELLED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "category",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"enum": [
|
|
"EQUIPMENT",
|
|
"SERVICE",
|
|
"MIXED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "equipment",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "deadlineFrom",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-01-01T00:00:00Z",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "deadlineTo",
|
|
"required": false,
|
|
"in": "query",
|
|
"schema": {
|
|
"example": "2024-12-31T23:59:59Z",
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}": {
|
|
"get": {
|
|
"operationId": "ProformaCollectorController_getRequest",
|
|
"summary": "Get proforma request by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Request not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "ProformaCollectorController_updateRequest",
|
|
"summary": "Update proforma request",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateProformaRequestDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Request not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}/items": {
|
|
"post": {
|
|
"operationId": "ProformaCollectorController_addItem",
|
|
"summary": "Add item to proforma request",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "Item added successfully"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/items/{itemId}": {
|
|
"put": {
|
|
"operationId": "ProformaCollectorController_updateItem",
|
|
"summary": "Update proforma request item",
|
|
"parameters": [
|
|
{
|
|
"name": "itemId",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Item updated successfully"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}/submissions": {
|
|
"post": {
|
|
"operationId": "ProformaCollectorController_createSubmission",
|
|
"summary": "Submit pricing proposal for proforma request",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateProformaSubmissionDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Submission created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "ProformaCollectorController_listSubmissions",
|
|
"summary": "Get all submissions for a proforma request (requester only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/submissions/{id}": {
|
|
"get": {
|
|
"operationId": "ProformaCollectorController_getSubmission",
|
|
"summary": "Get submission by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Submission not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/submissions/{id}/revision-request": {
|
|
"post": {
|
|
"operationId": "ProformaCollectorController_requestRevision",
|
|
"summary": "Request revision for a submission (requester only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateRevisionRequestDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Revision request created successfully"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/submissions/{id}/revise": {
|
|
"post": {
|
|
"operationId": "ProformaCollectorController_reviseSubmission",
|
|
"summary": "Submit revised pricing (respondent only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateProformaSubmissionDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Revised submission created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}/comparison-data": {
|
|
"get": {
|
|
"operationId": "ProformaCollectorController_getComparisonData",
|
|
"summary": "Get comparison data for all submissions (requester only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Comparison data retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ComparisonDataDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}/close": {
|
|
"put": {
|
|
"operationId": "ProformaCollectorController_closeRequest",
|
|
"summary": "Close proforma request (requester or admin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/proforma-requests/{id}/cancel": {
|
|
"put": {
|
|
"operationId": "ProformaCollectorController_cancelRequest",
|
|
"summary": "Cancel proforma request (requester or admin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProformaRequestResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Proforma Collector"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/declarations": {
|
|
"post": {
|
|
"operationId": "DeclarationController_create",
|
|
"summary": "Create a new declaration",
|
|
"parameters": [],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateDeclarationDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Declaration successfully created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeclarationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Declaration number already exists"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"get": {
|
|
"operationId": "DeclarationController_findAll",
|
|
"summary": "Get all declarations with filtering and pagination",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Page number for pagination",
|
|
"schema": {
|
|
"default": 1,
|
|
"example": 1,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Number of items per page",
|
|
"schema": {
|
|
"default": 10,
|
|
"example": 10,
|
|
"type": "number"
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by declaration type",
|
|
"schema": {
|
|
"example": "VAT",
|
|
"enum": [
|
|
"CUSTOMS",
|
|
"TAX",
|
|
"IMPORT",
|
|
"EXPORT",
|
|
"VAT",
|
|
"EXCISE",
|
|
"INCOME_TAX",
|
|
"BUSINESS_LICENSE",
|
|
"OTHER"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "status",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by declaration status",
|
|
"schema": {
|
|
"example": "PENDING_UPLOAD",
|
|
"enum": [
|
|
"PENDING_UPLOAD",
|
|
"UPLOADED",
|
|
"PROCESSING",
|
|
"PROCESSED",
|
|
"OVERDUE",
|
|
"REJECTED",
|
|
"ARCHIVED"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "period",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by declaration period",
|
|
"schema": {
|
|
"example": "MONTHLY",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"SEMI_ANNUAL",
|
|
"ANNUAL",
|
|
"ONE_TIME"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "dueDateFrom",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by due date from",
|
|
"schema": {
|
|
"example": "2024-01-01T00:00:00.000Z",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "dueDateTo",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by due date to",
|
|
"schema": {
|
|
"example": "2024-12-31T23:59:59.999Z",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "isRecurring",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by recurring declarations",
|
|
"schema": {
|
|
"example": true,
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
{
|
|
"name": "isActive",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter by active status",
|
|
"schema": {
|
|
"example": true,
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
{
|
|
"name": "overdue",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Filter overdue declarations",
|
|
"schema": {
|
|
"example": true,
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
{
|
|
"name": "search",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Search by declaration number or title",
|
|
"schema": {
|
|
"example": "VAT-2024",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "sortBy",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Sort field",
|
|
"schema": {
|
|
"default": "createdAt",
|
|
"example": "dueDate",
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "sortOrder",
|
|
"required": false,
|
|
"in": "query",
|
|
"description": "Sort order",
|
|
"schema": {
|
|
"default": "desc",
|
|
"example": "desc",
|
|
"enum": [
|
|
"asc",
|
|
"desc"
|
|
],
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successfully received paginated list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/PaginatedDto"
|
|
},
|
|
{
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DeclarationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/declarations/stats": {
|
|
"get": {
|
|
"operationId": "DeclarationController_getStats",
|
|
"summary": "Get declaration statistics",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Declaration statistics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": {
|
|
"type": "number"
|
|
},
|
|
"pending": {
|
|
"type": "number"
|
|
},
|
|
"uploaded": {
|
|
"type": "number"
|
|
},
|
|
"processed": {
|
|
"type": "number"
|
|
},
|
|
"overdue": {
|
|
"type": "number"
|
|
},
|
|
"upcomingDue": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/declarations/{id}": {
|
|
"get": {
|
|
"operationId": "DeclarationController_findOne",
|
|
"summary": "Get declaration by ID",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeclarationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Declaration not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"operationId": "DeclarationController_update",
|
|
"summary": "Update declaration",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDeclarationDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeclarationResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Declaration not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"operationId": "DeclarationController_delete",
|
|
"summary": "Delete declaration",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Declaration successfully deleted"
|
|
},
|
|
"403": {
|
|
"description": "Access denied"
|
|
},
|
|
"404": {
|
|
"description": "Declaration not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/declarations/{id}/upload": {
|
|
"post": {
|
|
"operationId": "DeclarationController_uploadFile",
|
|
"summary": "Upload declaration PDF file",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"201": {
|
|
"description": "File uploaded successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeclarationUploadResponseDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Invalid file or declaration not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/declarations/{id}/download": {
|
|
"get": {
|
|
"operationId": "DeclarationController_downloadFile",
|
|
"summary": "Download declaration PDF file",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"required": true,
|
|
"in": "path",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "File downloaded successfully"
|
|
},
|
|
"404": {
|
|
"description": "Declaration or file not found"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Declarations"
|
|
],
|
|
"security": [
|
|
{
|
|
"bearer": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/api/v1/health": {
|
|
"get": {
|
|
"operationId": "HealthController_health",
|
|
"summary": "Health check endpoint (public)",
|
|
"parameters": [],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Service is healthy"
|
|
}
|
|
},
|
|
"tags": [
|
|
"Health"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"info": {
|
|
"title": "Yaltopia Invoice System API",
|
|
"description": "\n ## Enterprise-grade Invoice Management System API\n \n This API provides comprehensive invoice management capabilities including:\n \n ### Core Features\n - 🔐 **Authentication**: JWT-based authentication with refresh tokens\n - 📄 **Invoice Management**: Full CRUD operations with filtering and pagination\n - 📊 **Report Generation**: Monthly reports with PDF export\n - 🔗 **Secure Sharing**: Time-limited shareable links with email dispatch\n - 🔔 **PWA Notifications**: Push notifications for calendar reminders\n - 📰 **News Feed**: Integrated news and announcements system\n - 📁 **Document Storage**: Secure file upload/download with validation\n \n ### Quick Start\n 1. Register a new user account via `POST /auth/register`\n 2. Login to get access token via `POST /auth/login`\n 3. Use the access token in the Authorization header: `Bearer <token>`\n 4. Explore the API endpoints below\n \n ### Authentication\n Most endpoints require authentication. Use the **Authorize** button below to set your bearer token.\n \n ### Rate Limiting\n API requests are rate-limited to 100 requests per minute per IP address.\n \n ### Error Handling\n All errors follow a consistent format with appropriate HTTP status codes.\n ",
|
|
"version": "1.0",
|
|
"contact": {}
|
|
},
|
|
"tags": [
|
|
{
|
|
"name": "Authentication",
|
|
"description": "User registration, login, and token management"
|
|
},
|
|
{
|
|
"name": "Users",
|
|
"description": "User profile and management"
|
|
},
|
|
{
|
|
"name": "Invoices",
|
|
"description": "Invoice CRUD operations with filtering"
|
|
},
|
|
{
|
|
"name": "Reports",
|
|
"description": "Monthly report generation and PDF export"
|
|
},
|
|
{
|
|
"name": "Share",
|
|
"description": "Secure invoice sharing with links and email"
|
|
},
|
|
{
|
|
"name": "Notifications",
|
|
"description": "PWA push notifications for reminders"
|
|
},
|
|
{
|
|
"name": "News",
|
|
"description": "News and announcements management"
|
|
},
|
|
{
|
|
"name": "Documents",
|
|
"description": "Secure document storage and management"
|
|
},
|
|
{
|
|
"name": "Proforma Collector",
|
|
"description": "Proforma request and submission management"
|
|
},
|
|
{
|
|
"name": "Admin",
|
|
"description": "Admin panel endpoints for system management"
|
|
}
|
|
],
|
|
"servers": [
|
|
{
|
|
"url": "http://localhost:3001/api/v1",
|
|
"description": "Local Development"
|
|
},
|
|
{
|
|
"url": "https://api.yaltopia.com/api/v1",
|
|
"description": "Production"
|
|
}
|
|
],
|
|
"components": {
|
|
"securitySchemes": {
|
|
"access-token": {
|
|
"scheme": "bearer",
|
|
"bearerFormat": "JWT",
|
|
"type": "http",
|
|
"name": "Authorization",
|
|
"description": "Enter your JWT token",
|
|
"in": "header"
|
|
}
|
|
},
|
|
"schemas": {
|
|
"RoleInfoDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"BUSINESS_OWNER",
|
|
"EMPLOYEE",
|
|
"ACCOUNTANT",
|
|
"CUSTOMER_SERVICE",
|
|
"AUDITOR",
|
|
"VIEWER"
|
|
],
|
|
"description": "Role identifier",
|
|
"example": "EMPLOYEE"
|
|
},
|
|
"displayName": {
|
|
"type": "string",
|
|
"description": "Human-readable role name",
|
|
"example": "Employee"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Role description",
|
|
"example": "Standard employee access for daily operations"
|
|
},
|
|
"permissions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [
|
|
"user:create",
|
|
"user:read",
|
|
"user:update",
|
|
"user:delete",
|
|
"user:activate",
|
|
"user:deactivate",
|
|
"invoice:create",
|
|
"invoice:read",
|
|
"invoice:update",
|
|
"invoice:delete",
|
|
"invoice:approve",
|
|
"invoice:share",
|
|
"invoice:export",
|
|
"payment:create",
|
|
"payment:read",
|
|
"payment:update",
|
|
"payment:delete",
|
|
"payment:verify",
|
|
"payment:flag",
|
|
"company:read",
|
|
"company:update",
|
|
"company:settings",
|
|
"team:create",
|
|
"team:read",
|
|
"team:update",
|
|
"team:delete",
|
|
"team:invite",
|
|
"document:create",
|
|
"document:read",
|
|
"document:update",
|
|
"document:delete",
|
|
"document:share",
|
|
"report:create",
|
|
"report:read",
|
|
"report:delete",
|
|
"report:export",
|
|
"proforma:create",
|
|
"proforma:read",
|
|
"proforma:update",
|
|
"proforma:delete",
|
|
"proforma:approve",
|
|
"proforma_request:create",
|
|
"proforma_request:read",
|
|
"proforma_request:update",
|
|
"proforma_request:delete",
|
|
"proforma_request:approve",
|
|
"proforma_request:submit",
|
|
"dashboard:read",
|
|
"analytics:read",
|
|
"metrics:read",
|
|
"admin:logs",
|
|
"admin:system",
|
|
"admin:settings",
|
|
"admin:maintenance",
|
|
"admin:audit",
|
|
"admin:security",
|
|
"admin:users",
|
|
"admin:analytics",
|
|
"integration:read",
|
|
"integration:manage",
|
|
"api_key:create",
|
|
"api_key:delete",
|
|
"notification:send",
|
|
"notification:manage",
|
|
"news:create",
|
|
"news:read",
|
|
"news:update",
|
|
"news:delete",
|
|
"news:publish",
|
|
"scan:invoice",
|
|
"scan:payment",
|
|
"ocr:process",
|
|
"audit:read",
|
|
"audit:export",
|
|
"compliance:read"
|
|
]
|
|
},
|
|
"description": "List of permissions granted to this role"
|
|
}
|
|
},
|
|
"required": [
|
|
"role",
|
|
"displayName",
|
|
"description",
|
|
"permissions"
|
|
]
|
|
},
|
|
"ChangeUserRoleDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"newRole": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"BUSINESS_OWNER",
|
|
"EMPLOYEE",
|
|
"ACCOUNTANT",
|
|
"CUSTOMER_SERVICE",
|
|
"AUDITOR",
|
|
"VIEWER"
|
|
],
|
|
"description": "New role to assign to the user",
|
|
"example": "EMPLOYEE"
|
|
},
|
|
"reason": {
|
|
"type": "string",
|
|
"description": "Reason for role change",
|
|
"example": "Promoted to team lead"
|
|
}
|
|
},
|
|
"required": [
|
|
"newRole"
|
|
]
|
|
},
|
|
"UserResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string"
|
|
},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"BUSINESS_OWNER",
|
|
"EMPLOYEE",
|
|
"ACCOUNTANT",
|
|
"CUSTOMER_SERVICE",
|
|
"AUDITOR",
|
|
"VIEWER"
|
|
]
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"createdById": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"password": {
|
|
"type": "string"
|
|
},
|
|
"refreshToken": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"email",
|
|
"firstName",
|
|
"lastName",
|
|
"role",
|
|
"isActive",
|
|
"createdAt",
|
|
"updatedAt",
|
|
"password",
|
|
"refreshToken"
|
|
]
|
|
},
|
|
"UpdateUserDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"firstName": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 50
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 50
|
|
}
|
|
}
|
|
},
|
|
"RegisterDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"example": "john.doe@example.com",
|
|
"description": "User email address"
|
|
},
|
|
"phone": {
|
|
"type": "string",
|
|
"pattern": "/^\\+[1-9]\\d{1,14}$/",
|
|
"example": "+1234567890",
|
|
"description": "User phone number"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"maxLength": 50,
|
|
"pattern": "/((?=.*\\d)|(?=.*\\W+))(?![.\\n])(?=.*[A-Z])(?=.*[a-z]).*$/",
|
|
"example": "Password@123",
|
|
"description": "Password must contain uppercase, lowercase, and number/special character"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 50,
|
|
"example": "John",
|
|
"description": "User first name"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 50,
|
|
"example": "Doe",
|
|
"description": "User last name"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"example": "EMPLOYEE",
|
|
"enum": [
|
|
"ADMIN",
|
|
"BUSINESS_OWNER",
|
|
"EMPLOYEE",
|
|
"ACCOUNTANT",
|
|
"CUSTOMER_SERVICE",
|
|
"AUDITOR",
|
|
"VIEWER"
|
|
],
|
|
"description": "User role (optional). Available roles:\n - VIEWER: Basic read-only access (no token required)\n - EMPLOYEE: Daily operations (Business Owner/Admin token required)\n - ACCOUNTANT: Financial management (Business Owner/Admin token required)\n - CUSTOMER_SERVICE: Customer support (Business Owner/Admin token required)\n - BUSINESS_OWNER: Business management (Admin token required)\n - ADMIN: Full system access (Admin token required)\n - AUDITOR: Compliance access (Admin token required)\n \n Defaults to VIEWER if not specified."
|
|
}
|
|
},
|
|
"required": [
|
|
"email",
|
|
"phone",
|
|
"password",
|
|
"firstName",
|
|
"lastName"
|
|
]
|
|
},
|
|
"AuthResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"accessToken": {
|
|
"type": "string"
|
|
},
|
|
"refreshToken": {
|
|
"type": "string"
|
|
},
|
|
"user": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
"firstName": {
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
"role": {
|
|
"required": true,
|
|
"type": "object"
|
|
},
|
|
"avatar": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"provider": {
|
|
"required": false,
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"accessToken",
|
|
"refreshToken",
|
|
"user"
|
|
]
|
|
},
|
|
"LoginDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"example": "john.doe@example.com",
|
|
"description": "User email address (required if phone is not provided)"
|
|
},
|
|
"phone": {
|
|
"type": "string",
|
|
"pattern": "/^\\+[1-9]\\d{1,14}$/",
|
|
"example": "+1234567890",
|
|
"description": "User phone number (required if email is not provided)"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"example": "Password@123"
|
|
}
|
|
},
|
|
"required": [
|
|
"password"
|
|
]
|
|
},
|
|
"RefreshTokenDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"refreshToken": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"refreshToken"
|
|
]
|
|
},
|
|
"InvoiceItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web Development Service"
|
|
},
|
|
"quantity": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 10
|
|
},
|
|
"unitPrice": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 50
|
|
},
|
|
"total": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 500
|
|
}
|
|
},
|
|
"required": [
|
|
"description",
|
|
"quantity",
|
|
"unitPrice",
|
|
"total"
|
|
]
|
|
},
|
|
"CreateInvoiceDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceNumber": {
|
|
"type": "string",
|
|
"example": "INV-2024-001"
|
|
},
|
|
"customerName": {
|
|
"type": "string",
|
|
"example": "Acme Corporation"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string",
|
|
"example": "billing@acme.com"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string",
|
|
"example": "+1234567890"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
],
|
|
"default": "SALES"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"DRAFT",
|
|
"PENDING",
|
|
"PAID",
|
|
"OVERDUE",
|
|
"CANCELLED"
|
|
],
|
|
"default": "DRAFT"
|
|
},
|
|
"issueDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"example": "2024-02-15T00:00:00Z"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web development services for January 2024"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Payment terms: Net 30"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 150,
|
|
"default": 0
|
|
},
|
|
"discountAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 0,
|
|
"default": 0
|
|
},
|
|
"isScanned": {
|
|
"type": "boolean",
|
|
"example": false,
|
|
"default": false
|
|
},
|
|
"scannedData": {
|
|
"type": "object",
|
|
"example": {
|
|
"sellerTIN": "123456",
|
|
"items": []
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/InvoiceItemDto"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"invoiceNumber",
|
|
"customerName",
|
|
"amount",
|
|
"dueDate",
|
|
"items"
|
|
]
|
|
},
|
|
"InvoiceItemResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"quantity": {
|
|
"type": "number"
|
|
},
|
|
"unitPrice": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"description",
|
|
"quantity",
|
|
"unitPrice",
|
|
"total"
|
|
]
|
|
},
|
|
"InvoiceResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"invoiceNumber": {
|
|
"type": "string"
|
|
},
|
|
"customerName": {
|
|
"type": "string"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
},
|
|
"currency": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
]
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"DRAFT",
|
|
"PENDING",
|
|
"PAID",
|
|
"OVERDUE",
|
|
"CANCELLED"
|
|
]
|
|
},
|
|
"issueDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"dueDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"paidDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number"
|
|
},
|
|
"discountAmount": {
|
|
"type": "number"
|
|
},
|
|
"isScanned": {
|
|
"type": "boolean"
|
|
},
|
|
"scannedData": {
|
|
"type": "object"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/InvoiceItemResponseDto"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"invoiceNumber",
|
|
"customerName",
|
|
"amount",
|
|
"currency",
|
|
"type",
|
|
"status",
|
|
"issueDate",
|
|
"dueDate",
|
|
"taxAmount",
|
|
"discountAmount",
|
|
"userId",
|
|
"items",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"PaginationMetaDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": {
|
|
"type": "number"
|
|
},
|
|
"page": {
|
|
"type": "number"
|
|
},
|
|
"limit": {
|
|
"type": "number"
|
|
},
|
|
"totalPages": {
|
|
"type": "number"
|
|
},
|
|
"hasNextPage": {
|
|
"type": "boolean"
|
|
},
|
|
"hasPreviousPage": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"total",
|
|
"page",
|
|
"limit",
|
|
"totalPages",
|
|
"hasNextPage",
|
|
"hasPreviousPage"
|
|
]
|
|
},
|
|
"PaginatedDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "array"
|
|
}
|
|
},
|
|
"meta": {
|
|
"$ref": "#/components/schemas/PaginationMetaDto"
|
|
}
|
|
},
|
|
"required": [
|
|
"data",
|
|
"meta"
|
|
]
|
|
},
|
|
"SendShareEmailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceId": {
|
|
"type": "string",
|
|
"example": "123e4567-e89b-12d3-a456-426614174000"
|
|
},
|
|
"expiresAt": {
|
|
"type": "string",
|
|
"example": "2024-12-31T23:59:59Z"
|
|
},
|
|
"maxAccess": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"example": 10
|
|
},
|
|
"recipientEmail": {
|
|
"type": "string",
|
|
"example": "client@example.com"
|
|
},
|
|
"message": {
|
|
"type": "string",
|
|
"example": "Please review this invoice"
|
|
}
|
|
},
|
|
"required": [
|
|
"invoiceId",
|
|
"expiresAt",
|
|
"recipientEmail"
|
|
]
|
|
},
|
|
"ShareLinkResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"token": {
|
|
"type": "string"
|
|
},
|
|
"shareUrl": {
|
|
"type": "string"
|
|
},
|
|
"expiresAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"accessCount": {
|
|
"type": "number"
|
|
},
|
|
"maxAccess": {
|
|
"type": "number"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"token",
|
|
"shareUrl",
|
|
"expiresAt",
|
|
"isActive",
|
|
"accessCount",
|
|
"invoiceId",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"CreateShareLinkDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceId": {
|
|
"type": "string",
|
|
"example": "123e4567-e89b-12d3-a456-426614174000"
|
|
},
|
|
"expiresAt": {
|
|
"type": "string",
|
|
"example": "2024-12-31T23:59:59Z"
|
|
},
|
|
"maxAccess": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"example": 10
|
|
}
|
|
},
|
|
"required": [
|
|
"invoiceId",
|
|
"expiresAt"
|
|
]
|
|
},
|
|
"UpdateInvoiceDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceNumber": {
|
|
"type": "string",
|
|
"example": "INV-2024-001"
|
|
},
|
|
"customerName": {
|
|
"type": "string",
|
|
"example": "Acme Corporation"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string",
|
|
"example": "billing@acme.com"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string",
|
|
"example": "+1234567890"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
],
|
|
"default": "SALES"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"DRAFT",
|
|
"PENDING",
|
|
"PAID",
|
|
"OVERDUE",
|
|
"CANCELLED"
|
|
],
|
|
"default": "DRAFT"
|
|
},
|
|
"issueDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"example": "2024-02-15T00:00:00Z"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web development services for January 2024"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Payment terms: Net 30"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 150,
|
|
"default": 0
|
|
},
|
|
"discountAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 0,
|
|
"default": 0
|
|
},
|
|
"isScanned": {
|
|
"type": "boolean",
|
|
"example": false,
|
|
"default": false
|
|
},
|
|
"scannedData": {
|
|
"type": "object",
|
|
"example": {
|
|
"sellerTIN": "123456",
|
|
"items": []
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/InvoiceItemDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"GenerateReportDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"year": {
|
|
"type": "number",
|
|
"minimum": 2000,
|
|
"maximum": 2100,
|
|
"example": 2024
|
|
},
|
|
"month": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 12,
|
|
"example": 1
|
|
},
|
|
"quarter": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 4,
|
|
"example": 1
|
|
},
|
|
"periodType": {
|
|
"type": "string",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"ANNUAL"
|
|
],
|
|
"default": "MONTHLY"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
],
|
|
"default": "SALES"
|
|
}
|
|
},
|
|
"required": [
|
|
"year"
|
|
]
|
|
},
|
|
"ReportResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"month": {
|
|
"type": "number"
|
|
},
|
|
"quarter": {
|
|
"type": "number"
|
|
},
|
|
"year": {
|
|
"type": "number"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SALES",
|
|
"PURCHASE"
|
|
]
|
|
},
|
|
"periodType": {
|
|
"type": "string",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"ANNUAL"
|
|
]
|
|
},
|
|
"totalInvoices": {
|
|
"type": "number"
|
|
},
|
|
"totalAmount": {
|
|
"type": "number"
|
|
},
|
|
"paidAmount": {
|
|
"type": "number"
|
|
},
|
|
"pendingAmount": {
|
|
"type": "number"
|
|
},
|
|
"overdueAmount": {
|
|
"type": "number"
|
|
},
|
|
"pdfPath": {
|
|
"type": "string"
|
|
},
|
|
"generatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"title",
|
|
"year",
|
|
"type",
|
|
"periodType",
|
|
"totalInvoices",
|
|
"totalAmount",
|
|
"paidAmount",
|
|
"pendingAmount",
|
|
"overdueAmount",
|
|
"generatedAt",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"SubscribeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"endpoint": {
|
|
"type": "string",
|
|
"example": "https://fcm.googleapis.com/fcm/send/..."
|
|
},
|
|
"keys": {
|
|
"type": "object",
|
|
"properties": {
|
|
"p256dh": {
|
|
"required": true,
|
|
"type": "string"
|
|
},
|
|
"auth": {
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"deviceInfo": {
|
|
"type": "string",
|
|
"example": "Chrome on Windows"
|
|
}
|
|
},
|
|
"required": [
|
|
"endpoint",
|
|
"keys"
|
|
]
|
|
},
|
|
"SendNotificationDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"example": "Invoice Due Reminder"
|
|
},
|
|
"body": {
|
|
"type": "string",
|
|
"example": "Your invoice #INV-001 is due tomorrow"
|
|
},
|
|
"icon": {
|
|
"type": "string",
|
|
"example": "/assets/icon.png"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"example": "/invoices/123"
|
|
},
|
|
"recipientId": {
|
|
"type": "string",
|
|
"example": "user-id-here"
|
|
},
|
|
"scheduledFor": {
|
|
"type": "string",
|
|
"example": "2024-12-31T10:00:00Z"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"example": {
|
|
"invoiceId": "123"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"title",
|
|
"body",
|
|
"recipientId"
|
|
]
|
|
},
|
|
"NotificationResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"body": {
|
|
"type": "string"
|
|
},
|
|
"icon": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"sentAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"scheduledFor": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"isSent": {
|
|
"type": "boolean"
|
|
},
|
|
"recipientId": {
|
|
"type": "string"
|
|
},
|
|
"data": {
|
|
"type": "object"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"title",
|
|
"body",
|
|
"isSent",
|
|
"recipientId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"UpdateNotificationSettingsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceReminders": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"daysBeforeDueDate": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 30,
|
|
"example": 7
|
|
},
|
|
"newsAlerts": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"reportReady": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
},
|
|
"NewsResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"content": {
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ANNOUNCEMENT",
|
|
"UPDATE",
|
|
"MAINTENANCE",
|
|
"NEWS"
|
|
]
|
|
},
|
|
"priority": {
|
|
"type": "string",
|
|
"enum": [
|
|
"LOW",
|
|
"MEDIUM",
|
|
"HIGH"
|
|
]
|
|
},
|
|
"publishedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"isPublished": {
|
|
"type": "boolean"
|
|
},
|
|
"viewCount": {
|
|
"type": "number"
|
|
},
|
|
"isRead": {
|
|
"type": "boolean"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"title",
|
|
"content",
|
|
"category",
|
|
"priority",
|
|
"publishedAt",
|
|
"isPublished",
|
|
"viewCount",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"CreateNewsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"description": "News title"
|
|
},
|
|
"content": {
|
|
"type": "string",
|
|
"description": "News content"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ANNOUNCEMENT",
|
|
"UPDATE",
|
|
"MAINTENANCE",
|
|
"NEWS"
|
|
],
|
|
"description": "News category"
|
|
},
|
|
"priority": {
|
|
"type": "string",
|
|
"enum": [
|
|
"LOW",
|
|
"MEDIUM",
|
|
"HIGH"
|
|
],
|
|
"description": "News priority"
|
|
},
|
|
"publishedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Publication date"
|
|
},
|
|
"isPublished": {
|
|
"type": "boolean",
|
|
"description": "Whether the news is published"
|
|
}
|
|
},
|
|
"required": [
|
|
"title",
|
|
"content"
|
|
]
|
|
},
|
|
"UpdateNewsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"description": "News title"
|
|
},
|
|
"content": {
|
|
"type": "string",
|
|
"description": "News content"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ANNOUNCEMENT",
|
|
"UPDATE",
|
|
"MAINTENANCE",
|
|
"NEWS"
|
|
],
|
|
"description": "News category"
|
|
},
|
|
"priority": {
|
|
"type": "string",
|
|
"enum": [
|
|
"LOW",
|
|
"MEDIUM",
|
|
"HIGH"
|
|
],
|
|
"description": "News priority"
|
|
},
|
|
"publishedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Publication date"
|
|
},
|
|
"isPublished": {
|
|
"type": "boolean",
|
|
"description": "Whether the news is published"
|
|
}
|
|
}
|
|
},
|
|
"DocumentResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"filename": {
|
|
"type": "string"
|
|
},
|
|
"originalName": {
|
|
"type": "string"
|
|
},
|
|
"mimeType": {
|
|
"type": "string"
|
|
},
|
|
"size": {
|
|
"type": "number"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"PDF",
|
|
"EXCEL",
|
|
"IMAGE",
|
|
"OTHER"
|
|
]
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"INVOICE",
|
|
"REPORT",
|
|
"CONTRACT",
|
|
"OTHER"
|
|
]
|
|
},
|
|
"path": {
|
|
"type": "string"
|
|
},
|
|
"previewUrl": {
|
|
"type": "string"
|
|
},
|
|
"isPublic": {
|
|
"type": "boolean"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"filename",
|
|
"originalName",
|
|
"mimeType",
|
|
"size",
|
|
"type",
|
|
"category",
|
|
"path",
|
|
"isPublic",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"ProformaItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web Development Service"
|
|
},
|
|
"quantity": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 10
|
|
},
|
|
"unitPrice": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 50
|
|
},
|
|
"total": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 500
|
|
}
|
|
},
|
|
"required": [
|
|
"description",
|
|
"quantity",
|
|
"unitPrice",
|
|
"total"
|
|
]
|
|
},
|
|
"CreateProformaDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"proformaNumber": {
|
|
"type": "string",
|
|
"example": "PROF-2024-001"
|
|
},
|
|
"customerName": {
|
|
"type": "string",
|
|
"example": "Acme Corporation"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string",
|
|
"example": "billing@acme.com"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string",
|
|
"example": "+1234567890"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"issueDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"example": "2024-02-15T00:00:00Z"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web development services for January 2024"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Payment terms: Net 30"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 150,
|
|
"default": 0
|
|
},
|
|
"discountAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 0,
|
|
"default": 0
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaItemDto"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"proformaNumber",
|
|
"customerName",
|
|
"amount",
|
|
"dueDate",
|
|
"items"
|
|
]
|
|
},
|
|
"ProformaItemResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"quantity": {
|
|
"type": "number"
|
|
},
|
|
"unitPrice": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"description",
|
|
"quantity",
|
|
"unitPrice",
|
|
"total"
|
|
]
|
|
},
|
|
"ProformaResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"proformaNumber": {
|
|
"type": "string"
|
|
},
|
|
"customerName": {
|
|
"type": "string"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
},
|
|
"currency": {
|
|
"type": "string"
|
|
},
|
|
"issueDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"dueDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number"
|
|
},
|
|
"discountAmount": {
|
|
"type": "number"
|
|
},
|
|
"pdfPath": {
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaItemResponseDto"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"proformaNumber",
|
|
"customerName",
|
|
"amount",
|
|
"currency",
|
|
"issueDate",
|
|
"dueDate",
|
|
"taxAmount",
|
|
"discountAmount",
|
|
"userId",
|
|
"items",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"UpdateProformaDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"proformaNumber": {
|
|
"type": "string",
|
|
"example": "PROF-2024-001"
|
|
},
|
|
"customerName": {
|
|
"type": "string",
|
|
"example": "Acme Corporation"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string",
|
|
"example": "billing@acme.com"
|
|
},
|
|
"customerPhone": {
|
|
"type": "string",
|
|
"example": "+1234567890"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"issueDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"example": "2024-02-15T00:00:00Z"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Web development services for January 2024"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Payment terms: Net 30"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 150,
|
|
"default": 0
|
|
},
|
|
"discountAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 0,
|
|
"default": 0
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaItemDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"CreatePaymentDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"transactionId": {
|
|
"type": "string",
|
|
"example": "TXN-2024-001"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"paymentDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"paymentMethod": {
|
|
"type": "string",
|
|
"example": "Credit Card"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Invoice payment"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string",
|
|
"example": "invoice-123-id"
|
|
}
|
|
},
|
|
"required": [
|
|
"transactionId",
|
|
"amount"
|
|
]
|
|
},
|
|
"PaymentResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"transactionId": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
},
|
|
"currency": {
|
|
"type": "string"
|
|
},
|
|
"paymentDate": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"paymentMethod": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
},
|
|
"isFlagged": {
|
|
"type": "boolean"
|
|
},
|
|
"flagReason": {
|
|
"type": "string",
|
|
"enum": [
|
|
"FAKE",
|
|
"SCAM",
|
|
"OTHER"
|
|
]
|
|
},
|
|
"flagNotes": {
|
|
"type": "string"
|
|
},
|
|
"receiptPath": {
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"transactionId",
|
|
"amount",
|
|
"currency",
|
|
"paymentDate",
|
|
"isFlagged",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"UpdatePaymentDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"transactionId": {
|
|
"type": "string",
|
|
"example": "TXN-2024-001"
|
|
},
|
|
"amount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 1500
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"paymentDate": {
|
|
"type": "string",
|
|
"example": "2024-01-15T00:00:00Z"
|
|
},
|
|
"paymentMethod": {
|
|
"type": "string",
|
|
"example": "Credit Card"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "Invoice payment"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string",
|
|
"example": "invoice-123-id"
|
|
}
|
|
}
|
|
},
|
|
"FlagPaymentDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"flagReason": {
|
|
"type": "string",
|
|
"enum": [
|
|
"FAKE",
|
|
"SCAM",
|
|
"OTHER"
|
|
]
|
|
},
|
|
"flagNotes": {
|
|
"type": "string",
|
|
"example": "Additional notes about the flag"
|
|
}
|
|
},
|
|
"required": [
|
|
"flagReason"
|
|
]
|
|
},
|
|
"AssociatePaymentDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"invoiceId": {
|
|
"type": "string",
|
|
"example": "invoice-123-id"
|
|
}
|
|
},
|
|
"required": [
|
|
"invoiceId"
|
|
]
|
|
},
|
|
"DashboardMetricsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"totalInvoices": {
|
|
"type": "number"
|
|
},
|
|
"totalRevenue": {
|
|
"type": "number"
|
|
},
|
|
"totalPayments": {
|
|
"type": "number"
|
|
},
|
|
"pendingInvoices": {
|
|
"type": "number"
|
|
},
|
|
"overdueInvoices": {
|
|
"type": "number"
|
|
},
|
|
"paidInvoices": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": [
|
|
"totalInvoices",
|
|
"totalRevenue",
|
|
"totalPayments",
|
|
"pendingInvoices",
|
|
"overdueInvoices",
|
|
"paidInvoices"
|
|
]
|
|
},
|
|
"CompanyResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"tin": {
|
|
"type": "string"
|
|
},
|
|
"address": {
|
|
"type": "string"
|
|
},
|
|
"city": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string"
|
|
},
|
|
"zipCode": {
|
|
"type": "string"
|
|
},
|
|
"country": {
|
|
"type": "string"
|
|
},
|
|
"phone": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string"
|
|
},
|
|
"website": {
|
|
"type": "string"
|
|
},
|
|
"logoPath": {
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"UpdateCompanyDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"example": "Yaltopia Inc."
|
|
},
|
|
"tin": {
|
|
"type": "string",
|
|
"example": "123456789"
|
|
},
|
|
"address": {
|
|
"type": "string",
|
|
"example": "123 Main Street"
|
|
},
|
|
"city": {
|
|
"type": "string",
|
|
"example": "New York"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"example": "NY"
|
|
},
|
|
"zipCode": {
|
|
"type": "string",
|
|
"example": "10001"
|
|
},
|
|
"country": {
|
|
"type": "string",
|
|
"example": "USA"
|
|
},
|
|
"phone": {
|
|
"type": "string",
|
|
"example": "+1234567890"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"example": "contact@yaltopia.com"
|
|
},
|
|
"website": {
|
|
"type": "string",
|
|
"example": "https://yaltopia.com"
|
|
}
|
|
}
|
|
},
|
|
"TeamMemberResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string"
|
|
},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"MEMBER",
|
|
"VIEWER"
|
|
]
|
|
},
|
|
"avatar": {
|
|
"type": "string"
|
|
},
|
|
"isInvited": {
|
|
"type": "boolean"
|
|
},
|
|
"invitedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"joinedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"email",
|
|
"firstName",
|
|
"lastName",
|
|
"role",
|
|
"isInvited",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"CreateTeamMemberDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"example": "john.doe@example.com"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"example": "Doe"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"MEMBER",
|
|
"VIEWER"
|
|
],
|
|
"default": "MEMBER"
|
|
}
|
|
},
|
|
"required": [
|
|
"email",
|
|
"firstName",
|
|
"lastName"
|
|
]
|
|
},
|
|
"UpdateTeamMemberDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"example": "john.doe@example.com"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"example": "Doe"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ADMIN",
|
|
"MEMBER",
|
|
"VIEWER"
|
|
],
|
|
"default": "MEMBER"
|
|
}
|
|
}
|
|
},
|
|
"InviteTeamMemberDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"example": "john.doe@example.com"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"example": "Doe"
|
|
}
|
|
},
|
|
"required": [
|
|
"email",
|
|
"firstName",
|
|
"lastName"
|
|
]
|
|
},
|
|
"ApiKeyResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"key": {
|
|
"type": "string"
|
|
},
|
|
"lastUsed": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"key",
|
|
"isActive",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"CreateApiKeyDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"example": "My API Key"
|
|
}
|
|
},
|
|
"required": [
|
|
"name"
|
|
]
|
|
},
|
|
"ScanInvoiceItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"quantity": {
|
|
"type": "number"
|
|
},
|
|
"unitPrice": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": [
|
|
"description",
|
|
"quantity",
|
|
"unitPrice",
|
|
"total"
|
|
]
|
|
},
|
|
"ScanInvoiceDataDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sellerTIN": {
|
|
"type": "string"
|
|
},
|
|
"sellerName": {
|
|
"type": "string"
|
|
},
|
|
"invoiceNumber": {
|
|
"type": "string"
|
|
},
|
|
"issueDate": {
|
|
"type": "string"
|
|
},
|
|
"dueDate": {
|
|
"type": "string"
|
|
},
|
|
"totalAmount": {
|
|
"type": "number"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ScanInvoiceItemDto"
|
|
}
|
|
},
|
|
"customerName": {
|
|
"type": "string"
|
|
},
|
|
"customerEmail": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"ScanInvoiceResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"invoiceId": {
|
|
"type": "string"
|
|
},
|
|
"imagePath": {
|
|
"type": "string"
|
|
},
|
|
"data": {
|
|
"$ref": "#/components/schemas/ScanInvoiceDataDto"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"success"
|
|
]
|
|
},
|
|
"MatchedInvoiceDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"invoiceNumber": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"invoiceNumber",
|
|
"amount",
|
|
"status"
|
|
]
|
|
},
|
|
"ScanPaymentResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"paymentId": {
|
|
"type": "string"
|
|
},
|
|
"imagePath": {
|
|
"type": "string"
|
|
},
|
|
"matchedInvoice": {
|
|
"$ref": "#/components/schemas/MatchedInvoiceDto"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"properties": {
|
|
"transactionId": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"required": false,
|
|
"type": "number"
|
|
},
|
|
"paymentDate": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"paymentMethod": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"merchantName": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"referenceNumber": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"provider": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"senderName": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"senderPhone": {
|
|
"required": false,
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"verification": {
|
|
"type": "object",
|
|
"properties": {
|
|
"isVerified": {
|
|
"required": false,
|
|
"type": "boolean"
|
|
},
|
|
"provider": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"verificationStatus": {
|
|
"required": false,
|
|
"type": "string"
|
|
},
|
|
"error": {
|
|
"required": false,
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"success",
|
|
"data",
|
|
"verification"
|
|
]
|
|
},
|
|
"Object": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"CreateSystemSettingDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"isPublic": {
|
|
"type": "boolean"
|
|
},
|
|
"key": {
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"GENERAL",
|
|
"EMAIL",
|
|
"STORAGE",
|
|
"PAYMENT",
|
|
"SECURITY",
|
|
"FEATURES",
|
|
"API"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"value",
|
|
"key",
|
|
"category"
|
|
]
|
|
},
|
|
"UpdateSystemSettingDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"isPublic": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"value"
|
|
]
|
|
},
|
|
"CreateAnnouncementDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"default": "info"
|
|
},
|
|
"priority": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"default": 0
|
|
},
|
|
"targetAudience": {
|
|
"type": "string",
|
|
"default": "all"
|
|
},
|
|
"startsAt": {
|
|
"type": "string"
|
|
},
|
|
"endsAt": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"title",
|
|
"message"
|
|
]
|
|
},
|
|
"ProformaRequestItemResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"itemName": {
|
|
"type": "string"
|
|
},
|
|
"itemDescription": {
|
|
"type": "string"
|
|
},
|
|
"quantity": {
|
|
"type": "number"
|
|
},
|
|
"unitOfMeasure": {
|
|
"type": "string"
|
|
},
|
|
"technicalSpecifications": {
|
|
"type": "object"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"itemName",
|
|
"quantity",
|
|
"unitOfMeasure",
|
|
"createdAt"
|
|
]
|
|
},
|
|
"ProformaRequestResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"requesterId": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"EQUIPMENT",
|
|
"SERVICE",
|
|
"MIXED"
|
|
]
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"DRAFT",
|
|
"OPEN",
|
|
"UNDER_REVIEW",
|
|
"REVISION_REQUESTED",
|
|
"CLOSED",
|
|
"CANCELLED"
|
|
]
|
|
},
|
|
"submissionDeadline": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"allowRevisions": {
|
|
"type": "boolean"
|
|
},
|
|
"paymentTerms": {
|
|
"type": "string"
|
|
},
|
|
"incoterms": {
|
|
"type": "string"
|
|
},
|
|
"taxIncluded": {
|
|
"type": "boolean"
|
|
},
|
|
"discountStructure": {
|
|
"type": "string"
|
|
},
|
|
"validityPeriod": {
|
|
"type": "number"
|
|
},
|
|
"attachments": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaRequestItemResponseDto"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"requesterId",
|
|
"title",
|
|
"category",
|
|
"status",
|
|
"allowRevisions",
|
|
"taxIncluded",
|
|
"items",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"ProformaSubmissionItemResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"proformaRequestItemId": {
|
|
"type": "string"
|
|
},
|
|
"unitPrice": {
|
|
"type": "number"
|
|
},
|
|
"totalPrice": {
|
|
"type": "number"
|
|
},
|
|
"deliveryTime": {
|
|
"type": "number"
|
|
},
|
|
"warrantyOrServiceTerms": {
|
|
"type": "string"
|
|
},
|
|
"remarks": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"proformaRequestItemId",
|
|
"unitPrice",
|
|
"totalPrice",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"ProformaSubmissionResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"proformaRequestId": {
|
|
"type": "string"
|
|
},
|
|
"respondentId": {
|
|
"type": "string"
|
|
},
|
|
"respondentName": {
|
|
"type": "string"
|
|
},
|
|
"version": {
|
|
"type": "number"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"SUBMITTED",
|
|
"REVISION_REQUESTED",
|
|
"REVISED",
|
|
"REJECTED",
|
|
"ACCEPTED"
|
|
]
|
|
},
|
|
"totalPrice": {
|
|
"type": "number"
|
|
},
|
|
"currency": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": "string"
|
|
},
|
|
"autoBusinessSnapshot": {
|
|
"type": "object"
|
|
},
|
|
"autoLicenseSnapshot": {
|
|
"type": "object"
|
|
},
|
|
"paymentTerms": {
|
|
"type": "string"
|
|
},
|
|
"incoterms": {
|
|
"type": "string"
|
|
},
|
|
"taxIncluded": {
|
|
"type": "boolean"
|
|
},
|
|
"discountStructure": {
|
|
"type": "string"
|
|
},
|
|
"validityPeriod": {
|
|
"type": "number"
|
|
},
|
|
"attachments": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"submissionItems": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ProformaSubmissionItemResponseDto"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"proformaRequestId",
|
|
"respondentId",
|
|
"version",
|
|
"status",
|
|
"totalPrice",
|
|
"currency",
|
|
"autoBusinessSnapshot",
|
|
"taxIncluded",
|
|
"submissionItems",
|
|
"createdAt",
|
|
"updatedAt"
|
|
]
|
|
},
|
|
"ComparisonDataItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"itemId": {
|
|
"type": "string"
|
|
},
|
|
"itemName": {
|
|
"type": "string"
|
|
},
|
|
"quantity": {
|
|
"type": "number"
|
|
},
|
|
"unitOfMeasure": {
|
|
"type": "string"
|
|
},
|
|
"submissions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"itemId",
|
|
"itemName",
|
|
"quantity",
|
|
"unitOfMeasure",
|
|
"submissions"
|
|
]
|
|
},
|
|
"ComparisonDataDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"proformaRequestId": {
|
|
"type": "string"
|
|
},
|
|
"requestTitle": {
|
|
"type": "string"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ComparisonDataItemDto"
|
|
}
|
|
},
|
|
"summary": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"proformaRequestId",
|
|
"requestTitle",
|
|
"items",
|
|
"summary"
|
|
]
|
|
},
|
|
"CreateAdminDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"description": "Admin email address",
|
|
"example": "admin@example.com"
|
|
},
|
|
"phone": {
|
|
"type": "string",
|
|
"description": "Admin phone number",
|
|
"example": "+1234567890"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"pattern": "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]/",
|
|
"description": "Admin password (minimum 8 characters, must contain uppercase, lowercase, number, and special character)",
|
|
"example": "AdminPass@123"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"description": "Admin first name",
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"description": "Admin last name",
|
|
"example": "Doe"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"description": "Optional notes about the admin",
|
|
"example": "System administrator"
|
|
}
|
|
},
|
|
"required": [
|
|
"email",
|
|
"phone",
|
|
"password",
|
|
"firstName",
|
|
"lastName"
|
|
]
|
|
},
|
|
"CreateProformaRequestItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"itemName": {
|
|
"type": "string",
|
|
"example": "Laptop Computer"
|
|
},
|
|
"itemDescription": {
|
|
"type": "string",
|
|
"example": "High-performance laptop for development"
|
|
},
|
|
"quantity": {
|
|
"type": "number",
|
|
"default": 1,
|
|
"minimum": 0,
|
|
"example": 10
|
|
},
|
|
"unitOfMeasure": {
|
|
"type": "string",
|
|
"default": "unit",
|
|
"example": "unit"
|
|
},
|
|
"technicalSpecifications": {
|
|
"type": "object",
|
|
"example": {
|
|
"processor": "Intel i7",
|
|
"ram": "16GB",
|
|
"storage": "512GB SSD"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"itemName"
|
|
]
|
|
},
|
|
"CreateProformaRequestDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"example": "Office Equipment Procurement 2024"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Request for quotation for office equipment"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"default": "MIXED",
|
|
"enum": [
|
|
"EQUIPMENT",
|
|
"SERVICE",
|
|
"MIXED"
|
|
]
|
|
},
|
|
"submissionDeadline": {
|
|
"type": "string",
|
|
"example": "2024-12-31T23:59:59Z"
|
|
},
|
|
"allowRevisions": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"example": true
|
|
},
|
|
"paymentTerms": {
|
|
"type": "string",
|
|
"example": "Net 30 days"
|
|
},
|
|
"incoterms": {
|
|
"type": "string",
|
|
"example": "EXW"
|
|
},
|
|
"taxIncluded": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"example": false
|
|
},
|
|
"discountStructure": {
|
|
"type": "string",
|
|
"example": "5% discount for orders > 100 units"
|
|
},
|
|
"validityPeriod": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"example": 30,
|
|
"description": "Validity period in days"
|
|
},
|
|
"attachments": {
|
|
"example": [
|
|
{
|
|
"name": "spec.pdf",
|
|
"url": "/uploads/spec.pdf"
|
|
}
|
|
],
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CreateProformaRequestItemDto"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"title",
|
|
"items"
|
|
]
|
|
},
|
|
"UpdateProformaRequestDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"example": "Office Equipment Procurement 2024"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Request for quotation for office equipment"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"default": "MIXED",
|
|
"enum": [
|
|
"EQUIPMENT",
|
|
"SERVICE",
|
|
"MIXED"
|
|
]
|
|
},
|
|
"submissionDeadline": {
|
|
"type": "string",
|
|
"example": "2024-12-31T23:59:59Z"
|
|
},
|
|
"allowRevisions": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"example": true
|
|
},
|
|
"paymentTerms": {
|
|
"type": "string",
|
|
"example": "Net 30 days"
|
|
},
|
|
"incoterms": {
|
|
"type": "string",
|
|
"example": "EXW"
|
|
},
|
|
"taxIncluded": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"example": false
|
|
},
|
|
"discountStructure": {
|
|
"type": "string",
|
|
"example": "5% discount for orders > 100 units"
|
|
},
|
|
"validityPeriod": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"example": 30,
|
|
"description": "Validity period in days"
|
|
},
|
|
"attachments": {
|
|
"example": [
|
|
{
|
|
"name": "spec.pdf",
|
|
"url": "/uploads/spec.pdf"
|
|
}
|
|
],
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CreateProformaRequestItemDto"
|
|
}
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": [
|
|
"DRAFT",
|
|
"OPEN",
|
|
"UNDER_REVIEW",
|
|
"REVISION_REQUESTED",
|
|
"CLOSED",
|
|
"CANCELLED"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"CreateProformaSubmissionItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"proformaRequestItemId": {
|
|
"type": "string",
|
|
"example": "item-id-123"
|
|
},
|
|
"unitPrice": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 999.99
|
|
},
|
|
"totalPrice": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 9999.99
|
|
},
|
|
"deliveryTime": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 30,
|
|
"description": "Delivery time in days"
|
|
},
|
|
"warrantyOrServiceTerms": {
|
|
"type": "string",
|
|
"example": "1 year warranty, on-site service"
|
|
},
|
|
"remarks": {
|
|
"type": "string",
|
|
"example": "Bulk pricing available for orders > 50 units"
|
|
}
|
|
},
|
|
"required": [
|
|
"proformaRequestItemId",
|
|
"unitPrice",
|
|
"totalPrice"
|
|
]
|
|
},
|
|
"CreateProformaSubmissionDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"totalPrice": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"example": 12500.5
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"default": "USD",
|
|
"example": "USD"
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"example": "All items in stock, ready for immediate shipment"
|
|
},
|
|
"paymentTerms": {
|
|
"type": "string",
|
|
"example": "Net 30 days"
|
|
},
|
|
"incoterms": {
|
|
"type": "string",
|
|
"example": "EXW"
|
|
},
|
|
"taxIncluded": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"example": false
|
|
},
|
|
"discountStructure": {
|
|
"type": "string",
|
|
"example": "5% early payment discount"
|
|
},
|
|
"validityPeriod": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"example": 30,
|
|
"description": "Validity period in days"
|
|
},
|
|
"attachments": {
|
|
"example": [
|
|
{
|
|
"name": "quote.pdf",
|
|
"url": "/uploads/quote.pdf"
|
|
}
|
|
],
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CreateProformaSubmissionItemDto"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"totalPrice",
|
|
"items"
|
|
]
|
|
},
|
|
"CreateRevisionRequestDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"revisionReason": {
|
|
"type": "string",
|
|
"example": "Please review pricing for item #3 and provide better delivery terms"
|
|
},
|
|
"requestedChanges": {
|
|
"type": "object",
|
|
"example": {
|
|
"items": [
|
|
{
|
|
"itemId": "item-123",
|
|
"requestedChanges": "Reduce price by 10%"
|
|
},
|
|
{
|
|
"itemId": "item-456",
|
|
"requestedChanges": "Improve delivery time from 30 to 15 days"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"revisionReason"
|
|
]
|
|
},
|
|
"CreateDeclarationDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"declarationNumber": {
|
|
"type": "string",
|
|
"description": "Declaration number (must be unique)",
|
|
"example": "DECL-2024-001"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Type of declaration",
|
|
"enum": [
|
|
"CUSTOMS",
|
|
"TAX",
|
|
"IMPORT",
|
|
"EXPORT",
|
|
"VAT",
|
|
"EXCISE",
|
|
"INCOME_TAX",
|
|
"BUSINESS_LICENSE",
|
|
"OTHER"
|
|
],
|
|
"example": "VAT"
|
|
},
|
|
"period": {
|
|
"type": "string",
|
|
"description": "Declaration period",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"SEMI_ANNUAL",
|
|
"ANNUAL",
|
|
"ONE_TIME"
|
|
],
|
|
"example": "MONTHLY"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Declaration title",
|
|
"example": "VAT Declaration - January 2024"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Declaration description",
|
|
"example": "Monthly VAT declaration for business operations"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"description": "Due date for declaration submission",
|
|
"example": "2024-02-15T00:00:00.000Z"
|
|
},
|
|
"totalValue": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Total value of the declaration",
|
|
"example": 50000
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"description": "Currency code",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Tax amount",
|
|
"example": 5000
|
|
},
|
|
"dutyAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Duty amount",
|
|
"example": 1000
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"description": "Additional notes",
|
|
"example": "Special considerations for this declaration"
|
|
},
|
|
"customsOffice": {
|
|
"type": "string",
|
|
"description": "Customs office",
|
|
"example": "Main Customs Office"
|
|
},
|
|
"referenceNumber": {
|
|
"type": "string",
|
|
"description": "Reference number",
|
|
"example": "REF-2024-001"
|
|
},
|
|
"isRecurring": {
|
|
"type": "boolean",
|
|
"description": "Whether this is a recurring declaration",
|
|
"example": true,
|
|
"default": false
|
|
},
|
|
"nextDueDate": {
|
|
"type": "string",
|
|
"description": "Next due date for recurring declarations",
|
|
"example": "2024-03-15T00:00:00.000Z"
|
|
}
|
|
},
|
|
"required": [
|
|
"declarationNumber",
|
|
"type",
|
|
"period",
|
|
"title",
|
|
"dueDate"
|
|
]
|
|
},
|
|
"DeclarationResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Declaration ID",
|
|
"example": "123e4567-e89b-12d3-a456-426614174000"
|
|
},
|
|
"declarationNumber": {
|
|
"type": "string",
|
|
"description": "Declaration number",
|
|
"example": "DECL-2024-001"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Type of declaration",
|
|
"enum": [
|
|
"CUSTOMS",
|
|
"TAX",
|
|
"IMPORT",
|
|
"EXPORT",
|
|
"VAT",
|
|
"EXCISE",
|
|
"INCOME_TAX",
|
|
"BUSINESS_LICENSE",
|
|
"OTHER"
|
|
],
|
|
"example": "VAT"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"description": "Declaration status",
|
|
"enum": [
|
|
"PENDING_UPLOAD",
|
|
"UPLOADED",
|
|
"PROCESSING",
|
|
"PROCESSED",
|
|
"OVERDUE",
|
|
"REJECTED",
|
|
"ARCHIVED"
|
|
],
|
|
"example": "PENDING_UPLOAD"
|
|
},
|
|
"period": {
|
|
"type": "string",
|
|
"description": "Declaration period",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"SEMI_ANNUAL",
|
|
"ANNUAL",
|
|
"ONE_TIME"
|
|
],
|
|
"example": "MONTHLY"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Declaration title",
|
|
"example": "VAT Declaration - January 2024"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Declaration description",
|
|
"example": "Monthly VAT declaration for business operations"
|
|
},
|
|
"filePath": {
|
|
"type": "string",
|
|
"description": "File path of uploaded declaration",
|
|
"example": "/uploads/declarations/decl-2024-001.pdf"
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "Original file name",
|
|
"example": "vat-declaration-jan-2024.pdf"
|
|
},
|
|
"fileSize": {
|
|
"type": "number",
|
|
"description": "File size in bytes",
|
|
"example": 1024000
|
|
},
|
|
"uploadedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Upload timestamp",
|
|
"example": "2024-01-15T10:30:00.000Z"
|
|
},
|
|
"dueDate": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Due date for declaration submission",
|
|
"example": "2024-02-15T00:00:00.000Z"
|
|
},
|
|
"reminderSentAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Reminder sent timestamp",
|
|
"example": "2024-02-10T09:00:00.000Z"
|
|
},
|
|
"overdueNotifiedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Overdue notification timestamp",
|
|
"example": "2024-02-16T09:00:00.000Z"
|
|
},
|
|
"processedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Processing completion timestamp",
|
|
"example": "2024-01-15T11:00:00.000Z"
|
|
},
|
|
"extractedData": {
|
|
"type": "object",
|
|
"description": "OCR extracted data",
|
|
"example": {
|
|
"totalAmount": 50000,
|
|
"taxAmount": 5000
|
|
}
|
|
},
|
|
"processingNotes": {
|
|
"type": "string",
|
|
"description": "Processing notes",
|
|
"example": "Successfully processed with high confidence"
|
|
},
|
|
"totalValue": {
|
|
"type": "number",
|
|
"description": "Total value of the declaration",
|
|
"example": 50000
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"description": "Currency code",
|
|
"example": "USD"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"description": "Tax amount",
|
|
"example": 5000
|
|
},
|
|
"dutyAmount": {
|
|
"type": "number",
|
|
"description": "Duty amount",
|
|
"example": 1000
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"description": "Additional notes",
|
|
"example": "Special considerations for this declaration"
|
|
},
|
|
"customsOffice": {
|
|
"type": "string",
|
|
"description": "Customs office",
|
|
"example": "Main Customs Office"
|
|
},
|
|
"referenceNumber": {
|
|
"type": "string",
|
|
"description": "Reference number",
|
|
"example": "REF-2024-001"
|
|
},
|
|
"isRecurring": {
|
|
"type": "boolean",
|
|
"description": "Whether this is a recurring declaration",
|
|
"example": true
|
|
},
|
|
"nextDueDate": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Next due date for recurring declarations",
|
|
"example": "2024-03-15T00:00:00.000Z"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean",
|
|
"description": "Whether the declaration is active",
|
|
"example": true
|
|
},
|
|
"userId": {
|
|
"type": "string",
|
|
"description": "User ID who owns this declaration",
|
|
"example": "123e4567-e89b-12d3-a456-426614174000"
|
|
},
|
|
"createdAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Creation timestamp",
|
|
"example": "2024-01-01T00:00:00.000Z"
|
|
},
|
|
"updatedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Last update timestamp",
|
|
"example": "2024-01-15T10:30:00.000Z"
|
|
},
|
|
"daysUntilDue": {
|
|
"type": "number",
|
|
"description": "Days until due date (negative if overdue)",
|
|
"example": 5
|
|
},
|
|
"isOverdue": {
|
|
"type": "boolean",
|
|
"description": "Whether the declaration is overdue",
|
|
"example": false
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"declarationNumber",
|
|
"type",
|
|
"status",
|
|
"period",
|
|
"title",
|
|
"dueDate",
|
|
"currency",
|
|
"taxAmount",
|
|
"dutyAmount",
|
|
"isRecurring",
|
|
"isActive",
|
|
"userId",
|
|
"createdAt",
|
|
"updatedAt",
|
|
"daysUntilDue",
|
|
"isOverdue"
|
|
]
|
|
},
|
|
"UpdateDeclarationDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"declarationNumber": {
|
|
"type": "string",
|
|
"description": "Declaration number (must be unique)",
|
|
"example": "DECL-2024-001"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Type of declaration",
|
|
"enum": [
|
|
"CUSTOMS",
|
|
"TAX",
|
|
"IMPORT",
|
|
"EXPORT",
|
|
"VAT",
|
|
"EXCISE",
|
|
"INCOME_TAX",
|
|
"BUSINESS_LICENSE",
|
|
"OTHER"
|
|
],
|
|
"example": "VAT"
|
|
},
|
|
"period": {
|
|
"type": "string",
|
|
"description": "Declaration period",
|
|
"enum": [
|
|
"MONTHLY",
|
|
"QUARTERLY",
|
|
"SEMI_ANNUAL",
|
|
"ANNUAL",
|
|
"ONE_TIME"
|
|
],
|
|
"example": "MONTHLY"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Declaration title",
|
|
"example": "VAT Declaration - January 2024"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Declaration description",
|
|
"example": "Monthly VAT declaration for business operations"
|
|
},
|
|
"dueDate": {
|
|
"type": "string",
|
|
"description": "Due date for declaration submission",
|
|
"example": "2024-02-15T00:00:00.000Z"
|
|
},
|
|
"totalValue": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Total value of the declaration",
|
|
"example": 50000
|
|
},
|
|
"currency": {
|
|
"type": "string",
|
|
"description": "Currency code",
|
|
"example": "USD",
|
|
"default": "USD"
|
|
},
|
|
"taxAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Tax amount",
|
|
"example": 5000
|
|
},
|
|
"dutyAmount": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"description": "Duty amount",
|
|
"example": 1000
|
|
},
|
|
"notes": {
|
|
"type": "string",
|
|
"description": "Additional notes",
|
|
"example": "Special considerations for this declaration"
|
|
},
|
|
"customsOffice": {
|
|
"type": "string",
|
|
"description": "Customs office",
|
|
"example": "Main Customs Office"
|
|
},
|
|
"referenceNumber": {
|
|
"type": "string",
|
|
"description": "Reference number",
|
|
"example": "REF-2024-001"
|
|
},
|
|
"isRecurring": {
|
|
"type": "boolean",
|
|
"description": "Whether this is a recurring declaration",
|
|
"example": true,
|
|
"default": false
|
|
},
|
|
"nextDueDate": {
|
|
"type": "string",
|
|
"description": "Next due date for recurring declarations",
|
|
"example": "2024-03-15T00:00:00.000Z"
|
|
}
|
|
}
|
|
},
|
|
"DeclarationUploadResponseDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"description": "Upload success status",
|
|
"example": true
|
|
},
|
|
"filePath": {
|
|
"type": "string",
|
|
"description": "File path where the declaration is stored",
|
|
"example": "uploads/declarations/123e4567-e89b-12d3-a456-426614174000.pdf"
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "Original file name",
|
|
"example": "vat-declaration-jan-2024.pdf"
|
|
},
|
|
"fileSize": {
|
|
"type": "number",
|
|
"description": "File size in bytes",
|
|
"example": 1024000
|
|
},
|
|
"uploadedAt": {
|
|
"format": "date-time",
|
|
"type": "string",
|
|
"description": "Upload timestamp",
|
|
"example": "2024-01-15T10:30:00.000Z"
|
|
},
|
|
"message": {
|
|
"type": "string",
|
|
"description": "Success message",
|
|
"example": "Declaration file uploaded successfully"
|
|
}
|
|
},
|
|
"required": [
|
|
"success",
|
|
"filePath",
|
|
"fileName",
|
|
"fileSize",
|
|
"uploadedAt",
|
|
"message"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
} |