openapi: 3.0.3 info: title: 'IMAC-CONNECT API Documentation' description: 'IMAC Connect API - Procurement, Inventory, Projects, and Field Operations Platform' version: 1.0.0 servers: - url: 'http://imac.name' tags: - name: 'Audit Logs' description: "\nAPIs for viewing audit logs (admin only)" - name: 'Dashboard & Analytics' description: "\nAPIs for dashboard KPIs, charts, and analytics" - name: Endpoints description: '' - name: Items description: "\nAPIs for managing inventory items" - name: Notifications description: "\nAPIs for managing user notifications" - name: Permissions description: "\nAPIs for viewing permissions (read-only)" - name: 'Price Lists' description: "\nAPIs for managing supplier price lists" - name: 'Procurement Requests' description: "\nAPIs for managing procurement requests" - name: Projects description: "\nAPIs for managing projects" - name: 'Purchase Orders' description: "\nAPIs for managing purchase orders" - name: Reports description: "\nAPIs for managing field reports" - name: Roles description: "\nAPIs for managing roles and permissions" - name: 'Stock Management' description: "\nAPIs for managing stock levels and movements" - name: Suppliers description: "\nAPIs for managing suppliers" - name: 'System Settings' description: "\nAPIs for managing system settings (admin only)" - name: Timesheets description: "\nAPIs for managing timesheet entries" - name: 'Training Records' description: "\nAPIs for managing training records" - name: Vehicles description: "\nAPIs for managing vehicles" components: securitySchemes: default: type: http scheme: bearer description: 'You can retrieve your token by logging in via the `/api/v1/auth/login` endpoint. Include the token in the Authorization header as: `Bearer {token}`.' security: - default: [] paths: /api/v1/audit-logs: get: summary: 'Display a listing of audit logs.' operationId: displayAListingOfAuditLogs description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Audit Logs' '/api/v1/audit-logs/{uuid}': get: summary: 'Display the specified audit log.' operationId: displayTheSpecifiedAuditLog description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Audit Logs' parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/dashboard/kpis: get: summary: 'Get dashboard KPIs.' operationId: getDashboardKPIs description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/dashboard/charts: get: summary: 'Get dashboard charts data.' operationId: getDashboardChartsData description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/dashboard/activities: get: summary: 'Get recent activities.' operationId: getRecentActivities description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/analytics/procurements: get: summary: 'Get procurement analytics.' operationId: getProcurementAnalytics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/analytics/inventory: get: summary: 'Get inventory analytics.' operationId: getInventoryAnalytics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/analytics/projects: get: summary: 'Get project analytics.' operationId: getProjectAnalytics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Dashboard & Analytics' /api/v1/auth/login: post: summary: 'Authenticate user and return token.' operationId: authenticateUserAndReturnToken description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: qkunze@example.com nullable: false password: type: string description: '' example: 'O[2UZ5ij-e/dl4m{o,' nullable: false required: - email - password /api/v1/auth/register: post: summary: 'Register a new user.' operationId: registerANewUser description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false password: type: string description: 'Must be at least 8 characters.' example: '4[*UyPJ"}6' nullable: false phone: type: string description: 'Must not be greater than 20 characters.' example: hdtqtqxbajwbpilpm nullable: true first_name: type: string description: 'Must not be greater than 255 characters.' example: ufinllwloauydlsmsjury nullable: true last_name: type: string description: 'Must not be greater than 255 characters.' example: vojcybzvrbyickznkyglo nullable: true middle_name: type: string description: 'Must not be greater than 255 characters.' example: igmkwxphlvazjrcnfbaqy nullable: true date_of_birth: type: string description: 'Must be a valid date. Must be a date before today.' example: '2020-03-09' nullable: true required: - name - email - password /api/v1/auth/forgot-password: post: summary: 'Send password reset link.' operationId: sendPasswordResetLink description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: qkunze@example.com nullable: false required: - email /api/v1/auth/reset-password: post: summary: 'Reset password.' operationId: resetPassword description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: token: type: string description: '' example: consequatur nullable: false email: type: string description: 'Must be a valid email address.' example: carolyne.luettgen@example.org nullable: false password: type: string description: 'Must be at least 8 characters.' example: ij-e/dl4m nullable: false required: - token - email - password /api/v1/auth/logout: post: summary: 'Logout user (revoke token).' operationId: logoutUserrevokeToken description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/auth/logout-all: post: summary: 'Revoke all user tokens.' operationId: revokeAllUserTokens description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/auth/refresh: post: summary: 'Refresh the authentication token.' operationId: refreshTheAuthenticationToken description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/auth/me: get: summary: 'Get authenticated user.' operationId: getAuthenticatedUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints '/api/v1/users/{user_uuid}/activate': post: summary: 'Activate a user.' operationId: activateAUser description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: user_uuid description: '' example: 019a72f5-e572-70af-84d1-1706caf0c4db required: true schema: type: string '/api/v1/users/{user_uuid}/deactivate': post: summary: 'Deactivate a user.' operationId: deactivateAUser description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: user_uuid description: '' example: 019a72f5-e572-70af-84d1-1706caf0c4db required: true schema: type: string '/api/v1/users/{user_uuid}/reset-password': post: summary: 'Reset user password.' operationId: resetUserPassword description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: password: type: string description: 'Must be at least 8 characters.' example: 'O[2UZ5ij-e/dl4m{o,' nullable: false required: - password parameters: - in: path name: user_uuid description: '' example: 019a72f5-e572-70af-84d1-1706caf0c4db required: true schema: type: string /api/v1/users: get: summary: 'Display a listing of users.' operationId: displayAListingOfUsers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created user.' operationId: storeANewlyCreatedUser description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false password: type: string description: 'Must be at least 8 characters.' example: '4[*UyPJ"}6' nullable: false phone: type: string description: 'Must not be greater than 20 characters.' example: hdtqtqxbajwbpilpm nullable: true status: type: string description: '' example: suspended nullable: true enum: - active - inactive - suspended - pending first_name: type: string description: 'Must not be greater than 255 characters.' example: ufinllwloauydlsmsjury nullable: true last_name: type: string description: 'Must not be greater than 255 characters.' example: vojcybzvrbyickznkyglo nullable: true middle_name: type: string description: 'Must not be greater than 255 characters.' example: igmkwxphlvazjrcnfbaqy nullable: true date_of_birth: type: string description: 'Must be a valid date. Must be a date before today.' example: '2020-03-09' nullable: true gender: type: string description: '' example: male nullable: true enum: - male - female - other address: type: string description: 'Must not be greater than 500 characters.' example: mqeopfuudtdsufvyvddqa nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true state: type: string description: 'Must not be greater than 255 characters.' example: xbajwbpilpmufinllwloa nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: uydlsmsjuryvojcybzvrb nullable: true postal_code: type: string description: 'Must not be greater than 20 characters.' example: yickznkygloigmkwx nullable: true required: - name - email - password '/api/v1/users/{uuid}': get: summary: 'Display the specified user.' operationId: displayTheSpecifiedUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified user.' operationId: updateTheSpecifiedUser description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false password: type: string description: 'Must be at least 8 characters.' example: '4[*UyPJ"}6' nullable: true phone: type: string description: 'Must not be greater than 20 characters.' example: hdtqtqxbajwbpilpm nullable: true status: type: string description: '' example: pending nullable: true enum: - active - inactive - suspended - pending first_name: type: string description: 'Must not be greater than 255 characters.' example: ufinllwloauydlsmsjury nullable: true last_name: type: string description: 'Must not be greater than 255 characters.' example: vojcybzvrbyickznkyglo nullable: true middle_name: type: string description: 'Must not be greater than 255 characters.' example: igmkwxphlvazjrcnfbaqy nullable: true date_of_birth: type: string description: 'Must be a valid date. Must be a date before today.' example: '2020-03-09' nullable: true gender: type: string description: '' example: female nullable: true enum: - male - female - other address: type: string description: 'Must not be greater than 500 characters.' example: mqeopfuudtdsufvyvddqa nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true state: type: string description: 'Must not be greater than 255 characters.' example: xbajwbpilpmufinllwloa nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: uydlsmsjuryvojcybzvrb nullable: true postal_code: type: string description: 'Must not be greater than 20 characters.' example: yickznkygloigmkwx nullable: true delete: summary: 'Remove the specified user.' operationId: removeTheSpecifiedUser description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: uuid description: '' example: 019a72f5-e572-70af-84d1-1706caf0c4db required: true schema: type: string '/api/v1/customers/{customer_uuid}/projects': get: summary: 'Get customer projects.' operationId: getCustomerProjects description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: customer_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/customers: get: summary: 'Display a listing of customers.' operationId: displayAListingOfCustomers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created customer.' operationId: storeANewlyCreatedCustomer description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false contact_person: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: schmitt.beulah@example.org nullable: true phone: type: string description: 'Must not be greater than 20 characters.' example: smsjuryvojcybzvrb nullable: true address: type: string description: 'Must not be greater than 500 characters.' example: yickznkygloigmkwxphlv nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: azjrcnfbaqywuxhgjjmzu nullable: true state: type: string description: 'Must not be greater than 255 characters.' example: xjubqouzswiwxtrkimfca nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: tbxspzmrazsroyjpxmqes nullable: true status: type: string description: '' example: suspended nullable: true enum: - active - inactive - suspended notes: type: string description: '' example: consequatur nullable: true required: - code - name '/api/v1/customers/{uuid}': get: summary: 'Display the specified customer.' operationId: displayTheSpecifiedCustomer description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified customer.' operationId: updateTheSpecifiedCustomer description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false contact_person: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: schmitt.beulah@example.org nullable: true phone: type: string description: 'Must not be greater than 20 characters.' example: smsjuryvojcybzvrb nullable: true address: type: string description: 'Must not be greater than 500 characters.' example: yickznkygloigmkwxphlv nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: azjrcnfbaqywuxhgjjmzu nullable: true state: type: string description: 'Must not be greater than 255 characters.' example: xjubqouzswiwxtrkimfca nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: tbxspzmrazsroyjpxmqes nullable: true status: type: string description: '' example: suspended nullable: true enum: - active - inactive - suspended notes: type: string description: '' example: consequatur nullable: true delete: summary: 'Remove the specified customer.' operationId: removeTheSpecifiedCustomer description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/items/{item_uuid}/stock-levels': get: summary: 'Get item stock levels.' operationId: getItemStockLevels description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Items parameters: - in: path name: item_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/items/{item_uuid}/price-lists': get: summary: 'Get item price lists.' operationId: getItemPriceLists description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Items parameters: - in: path name: item_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/items: get: summary: 'Display a listing of items.' operationId: displayAListingOfItems description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Items post: summary: 'Store a newly created item.' operationId: storeANewlyCreatedItem description: '' parameters: [] responses: { } tags: - Items requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true category: type: string description: 'Must not be greater than 255 characters.' example: dtdsufvyvddqamniihfqc nullable: true unit_of_measure: type: string description: 'Must not be greater than 50 characters.' example: oynlazghdtqtqxbajwbpi nullable: true default_supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: null nullable: true base_price: type: number description: 'Must be at least 0.' example: 41 nullable: true status: type: string description: '' example: active nullable: true enum: - active - inactive required: - code - name '/api/v1/items/{uuid}': get: summary: 'Display the specified item.' operationId: displayTheSpecifiedItem description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Items put: summary: 'Update the specified item.' operationId: updateTheSpecifiedItem description: '' parameters: [] responses: { } tags: - Items requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true category: type: string description: 'Must not be greater than 255 characters.' example: dtdsufvyvddqamniihfqc nullable: true unit_of_measure: type: string description: 'Must not be greater than 50 characters.' example: oynlazghdtqtqxbajwbpi nullable: true default_supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: null nullable: true base_price: type: number description: 'Must be at least 0.' example: 41 nullable: true status: type: string description: '' example: active nullable: true enum: - active - inactive delete: summary: 'Remove the specified item.' operationId: removeTheSpecifiedItem description: '' parameters: [] responses: { } tags: - Items parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/notifications/{notification_uuid}/read': post: summary: 'Mark notification as read.' operationId: markNotificationAsRead description: '' parameters: [] responses: { } tags: - Notifications parameters: - in: path name: notification_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/notifications/mark-all-read: post: summary: 'Mark all notifications as read.' operationId: markAllNotificationsAsRead description: '' parameters: [] responses: { } tags: - Notifications /api/v1/notifications/unread-count: get: summary: 'Get unread notifications count.' operationId: getUnreadNotificationsCount description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Notifications /api/v1/notifications: get: summary: 'Display a listing of notifications for the authenticated user.' operationId: displayAListingOfNotificationsForTheAuthenticatedUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Notifications '/api/v1/notifications/{uuid}': get: summary: 'Display the specified notification.' operationId: displayTheSpecifiedNotification description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Notifications delete: summary: 'Remove the specified notification.' operationId: removeTheSpecifiedNotification description: '' parameters: [] responses: { } tags: - Notifications parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/permissions: get: summary: 'Display a listing of permissions.' operationId: displayAListingOfPermissions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Permissions '/api/v1/permissions/{uuid}': get: summary: 'Display the specified permission.' operationId: displayTheSpecifiedPermission description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Permissions parameters: - in: path name: uuid description: '' example: 019a72f5-e107-7002-b65b-660897661695 required: true schema: type: string /api/v1/price-lists: get: summary: 'Display a listing of price lists.' operationId: displayAListingOfPriceLists description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Price Lists' post: summary: 'Store a newly created price list entry.' operationId: storeANewlyCreatedPriceListEntry description: '' parameters: [] responses: { } tags: - 'Price Lists' requestBody: required: true content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: consequatur nullable: false supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: consequatur nullable: false price: type: number description: 'Must be at least 0.' example: 45 nullable: false effective_from: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:20' nullable: false effective_to: type: string description: 'Must be a valid date. Must be a date after effective_from.' example: '2106-12-11' nullable: true currency: type: string description: 'Must not be greater than 3 characters.' example: mqe nullable: true required: - item_id - supplier_id - price - effective_from '/api/v1/price-lists/{uuid}': get: summary: 'Display the specified price list entry.' operationId: displayTheSpecifiedPriceListEntry description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Price Lists' put: summary: 'Update the specified price list entry.' operationId: updateTheSpecifiedPriceListEntry description: '' parameters: [] responses: { } tags: - 'Price Lists' requestBody: required: false content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: false supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: null nullable: false price: type: number description: 'Must be at least 0.' example: 73 nullable: false effective_from: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:20' nullable: false effective_to: type: string description: 'Must be a valid date. Must be a date after effective_from.' example: '2106-12-11' nullable: true currency: type: string description: 'Must not be greater than 3 characters.' example: mqe nullable: true delete: summary: 'Remove the specified price list entry.' operationId: removeTheSpecifiedPriceListEntry description: '' parameters: [] responses: { } tags: - 'Price Lists' parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/procurements/{procurementRequest_uuid}/submit': post: summary: 'Submit procurement request for approval.' operationId: submitProcurementRequestForApproval description: '' parameters: [] responses: { } tags: - 'Procurement Requests' parameters: - in: path name: procurementRequest_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/procurements/{procurementRequest_uuid}/approve': post: summary: 'Approve procurement request.' operationId: approveProcurementRequest description: '' parameters: [] responses: { } tags: - 'Procurement Requests' parameters: - in: path name: procurementRequest_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/procurements/{procurementRequest_uuid}/reject': post: summary: 'Reject procurement request.' operationId: rejectProcurementRequest description: '' parameters: [] responses: { } tags: - 'Procurement Requests' parameters: - in: path name: procurementRequest_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/procurements/{procurementRequest_uuid}/convert-to-po': post: summary: 'Convert approved procurement request to purchase order.' operationId: convertApprovedProcurementRequestToPurchaseOrder description: '' parameters: [] responses: { } tags: - 'Procurement Requests' requestBody: required: true content: application/json: schema: type: object properties: supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: consequatur nullable: false order_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:20' nullable: true required_date: type: string description: 'Must be a valid date. Must be a date after or equal to order_date.' example: '2106-12-11' nullable: true delivery_address: type: string description: 'Must not be greater than 500 characters.' example: mqeopfuudtdsufvyvddqa nullable: true terms: type: string description: '' example: consequatur nullable: true required: - supplier_id parameters: - in: path name: procurementRequest_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/procurements: get: summary: 'Display a listing of procurement requests.' operationId: displayAListingOfProcurementRequests description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Procurement Requests' post: summary: 'Store a newly created procurement request.' operationId: storeANewlyCreatedProcurementRequest description: '' parameters: [] responses: { } tags: - 'Procurement Requests' requestBody: required: true content: application/json: schema: type: object properties: request_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: true project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true status: type: string description: '' example: draft nullable: true enum: - draft - pending - approved - rejected - converted priority: type: string description: '' example: urgent nullable: true enum: - low - medium - high - urgent required_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:20' nullable: true notes: type: string description: '' example: consequatur nullable: true items: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: true quantity: type: number description: 'Must be at least 0.01.' example: 73 nullable: false unit_price: type: number description: 'Must be at least 0.' example: 45 nullable: true description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true notes: type: string description: '' example: consequatur nullable: true required: - quantity required: - items '/api/v1/procurements/{id}': get: summary: 'Display the specified procurement request.' operationId: displayTheSpecifiedProcurementRequest description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Procurement Requests' put: summary: 'Update the specified procurement request.' operationId: updateTheSpecifiedProcurementRequest description: '' parameters: [] responses: { } tags: - 'Procurement Requests' requestBody: required: false content: application/json: schema: type: object properties: request_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true status: type: string description: '' example: approved nullable: true enum: - draft - pending - approved - rejected - converted priority: type: string description: '' example: high nullable: true enum: - low - medium - high - urgent required_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:20' nullable: true notes: type: string description: '' example: consequatur nullable: true items: type: array description: 'Must have at least 1 items.' example: null items: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: true quantity: type: number description: 'Must be at least 0.01.' example: 45 nullable: false unit_price: type: number description: 'Must be at least 0.' example: 56 nullable: true description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true notes: type: string description: '' example: consequatur nullable: true required: - quantity delete: summary: 'Remove the specified procurement request.' operationId: removeTheSpecifiedProcurementRequest description: '' parameters: [] responses: { } tags: - 'Procurement Requests' parameters: - in: path name: id description: 'The ID of the procurement.' example: consequatur required: true schema: type: string '/api/v1/projects/{project_uuid}/procurements': get: summary: 'Get project procurements.' operationId: getProjectProcurements description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Projects parameters: - in: path name: project_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/projects/{project_uuid}/reports': get: summary: 'Get project reports.' operationId: getProjectReports description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Projects parameters: - in: path name: project_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/projects: get: summary: 'Display a listing of projects.' operationId: displayAListingOfProjects description: '' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: '{"success": true, "message": "Projects retrieved successfully", "data": [...], "pagination": {...}}' tags: - Projects post: summary: 'Store a newly created project.' operationId: storeANewlyCreatedProject description: '' parameters: [] responses: { } tags: - Projects requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false customer_id: type: string description: 'The id of an existing record in the customers table.' example: consequatur nullable: false start_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:19' nullable: false end_date: type: string description: 'Must be a valid date. Must be a date after start_date.' example: '2106-12-11' nullable: true status: type: string description: '' example: cancelled nullable: true enum: - planning - active - on_hold - completed - cancelled budget: type: number description: 'Must be at least 0.' example: 45 nullable: true manager_id: type: string description: 'The id of an existing record in the users table.' example: consequatur nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true required: - code - name - customer_id - start_date - manager_id '/api/v1/projects/{uuid}': get: summary: 'Display the specified project.' operationId: displayTheSpecifiedProject description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Projects put: summary: 'Update the specified project.' operationId: updateTheSpecifiedProject description: '' parameters: [] responses: { } tags: - Projects requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false customer_id: type: string description: 'The id of an existing record in the customers table.' example: null nullable: false start_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:19' nullable: false end_date: type: string description: 'Must be a valid date. Must be a date after start_date.' example: '2106-12-11' nullable: true status: type: string description: '' example: completed nullable: true enum: - planning - active - on_hold - completed - cancelled budget: type: number description: 'Must be at least 0.' example: 45 nullable: true manager_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true delete: summary: 'Remove the specified project.' operationId: removeTheSpecifiedProject description: '' parameters: [] responses: { } tags: - Projects parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/purchase-orders/{purchaseOrder_uuid}/submit': post: summary: 'Submit purchase order for approval.' operationId: submitPurchaseOrderForApproval description: '' parameters: [] responses: { } tags: - 'Purchase Orders' parameters: - in: path name: purchaseOrder_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/purchase-orders/{purchaseOrder_uuid}/approve': post: summary: 'Approve purchase order.' operationId: approvePurchaseOrder description: '' parameters: [] responses: { } tags: - 'Purchase Orders' parameters: - in: path name: purchaseOrder_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/purchase-orders/{purchaseOrder_uuid}/reject': post: summary: 'Reject purchase order.' operationId: rejectPurchaseOrder description: '' parameters: [] responses: { } tags: - 'Purchase Orders' parameters: - in: path name: purchaseOrder_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/purchase-orders: get: summary: 'Display a listing of purchase orders.' operationId: displayAListingOfPurchaseOrders description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Purchase Orders' post: summary: 'Store a newly created purchase order.' operationId: storeANewlyCreatedPurchaseOrder description: '' parameters: [] responses: { } tags: - 'Purchase Orders' requestBody: required: true content: application/json: schema: type: object properties: po_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: true supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: consequatur nullable: false project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true status: type: string description: '' example: rejected nullable: true enum: - draft - pending - approved - rejected - issued - received - cancelled order_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:21' nullable: true required_date: type: string description: 'Must be a valid date. Must be a date after or equal to order_date.' example: '2106-12-11' nullable: true delivery_address: type: string description: '' example: consequatur nullable: true terms: type: string description: '' example: consequatur nullable: true items: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: true quantity: type: number description: 'Must be at least 0.01.' example: 73 nullable: false unit_price: type: number description: 'Must be at least 0.' example: 45 nullable: false tax_rate: type: number description: 'Must be at least 0. Must not be greater than 100.' example: 16 nullable: true description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true required: - quantity - unit_price required: - supplier_id - items '/api/v1/purchase-orders/{uuid}': get: summary: 'Display the specified purchase order.' operationId: displayTheSpecifiedPurchaseOrder description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Purchase Orders' put: summary: 'Update the specified purchase order.' operationId: updateTheSpecifiedPurchaseOrder description: '' parameters: [] responses: { } tags: - 'Purchase Orders' requestBody: required: false content: application/json: schema: type: object properties: po_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false supplier_id: type: string description: 'The id of an existing record in the suppliers table.' example: null nullable: false project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true status: type: string description: '' example: pending nullable: true enum: - draft - pending - approved - rejected - issued - received - cancelled order_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:21' nullable: true required_date: type: string description: 'Must be a valid date. Must be a date after or equal to order_date.' example: '2106-12-11' nullable: true delivery_address: type: string description: '' example: consequatur nullable: true terms: type: string description: '' example: consequatur nullable: true items: type: array description: 'Must have at least 1 items.' example: null items: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: true quantity: type: number description: 'Must be at least 0.01.' example: 45 nullable: false unit_price: type: number description: 'Must be at least 0.' example: 56 nullable: false tax_rate: type: number description: 'Must be at least 0. Must not be greater than 100.' example: 5 nullable: true description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true required: - quantity - unit_price delete: summary: 'Remove the specified purchase order.' operationId: removeTheSpecifiedPurchaseOrder description: '' parameters: [] responses: { } tags: - 'Purchase Orders' parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/reports/{report_uuid}/submit': post: summary: 'Submit report.' operationId: submitReport description: '' parameters: [] responses: { } tags: - Reports parameters: - in: path name: report_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/reports/{report_uuid}/attachments': post: summary: 'Upload attachment to report.' operationId: uploadAttachmentToReport description: '' parameters: [] responses: { } tags: - Reports requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Must be a file. Must not be greater than 10240 kilobytes.' nullable: false required: - file get: summary: 'Get report attachments.' operationId: getReportAttachments description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports parameters: - in: path name: report_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/reports/{report_uuid}/attachments/{attachment_uuid}': delete: summary: 'Delete report attachment.' operationId: deleteReportAttachment description: '' parameters: [] responses: { } tags: - Reports parameters: - in: path name: report_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string - in: path name: attachment_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/reports: get: summary: 'Display a listing of reports.' operationId: displayAListingOfReports description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports post: summary: 'Store a newly created report.' operationId: storeANewlyCreatedReport description: '' parameters: [] responses: { } tags: - Reports requestBody: required: true content: application/json: schema: type: object properties: report_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: true project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true report_type: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false title: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true status: type: string description: '' example: submitted nullable: true enum: - draft - submitted - reviewed - resolved - closed priority: type: string description: '' example: medium nullable: true enum: - low - medium - high - urgent location_lat: type: number description: 'Must be between -90 and 90.' example: -90 nullable: true location_lng: type: number description: 'Must be between -180 and 180.' example: -179 nullable: true required: - report_type - title '/api/v1/reports/{uuid}': get: summary: 'Display the specified report.' operationId: displayTheSpecifiedReport description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports put: summary: 'Update the specified report.' operationId: updateTheSpecifiedReport description: '' parameters: [] responses: { } tags: - Reports requestBody: required: false content: application/json: schema: type: object properties: report_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true report_type: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false title: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true status: type: string description: '' example: draft nullable: true enum: - draft - submitted - reviewed - resolved - closed priority: type: string description: '' example: high nullable: true enum: - low - medium - high - urgent location_lat: type: number description: 'Must be between -90 and 90.' example: -90 nullable: true location_lng: type: number description: 'Must be between -180 and 180.' example: -179 nullable: true delete: summary: 'Remove the specified report.' operationId: removeTheSpecifiedReport description: '' parameters: [] responses: { } tags: - Reports parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/roles/{role_uuid}/permissions': post: summary: 'Assign permissions to role.' operationId: assignPermissionsToRole description: '' parameters: [] responses: { } tags: - Roles requestBody: required: false content: application/json: schema: type: object properties: permission_ids: type: array description: 'The id of an existing record in the permissions table.' example: null items: type: string parameters: - in: path name: role_uuid description: '' example: 019a72f5-e02f-70bb-9443-7cb5ab140c15 required: true schema: type: string /api/v1/roles: get: summary: 'Display a listing of roles.' operationId: displayAListingOfRoles description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Roles post: summary: 'Store a newly created role.' operationId: storeANewlyCreatedRole description: '' parameters: [] responses: { } tags: - Roles requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false description: type: string description: 'Must not be greater than 500 characters.' example: 'Dolores molestias ipsam sit.' nullable: true is_system: type: boolean description: '' example: true nullable: true permission_ids: type: array description: 'The id of an existing record in the permissions table.' example: null items: type: string required: - name '/api/v1/roles/{uuid}': get: summary: 'Display the specified role.' operationId: displayTheSpecifiedRole description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Roles put: summary: 'Update the specified role.' operationId: updateTheSpecifiedRole description: '' parameters: [] responses: { } tags: - Roles requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false description: type: string description: 'Must not be greater than 500 characters.' example: 'Dolores molestias ipsam sit.' nullable: true is_system: type: boolean description: '' example: true nullable: true permission_ids: type: array description: 'The id of an existing record in the permissions table.' example: null items: type: string delete: summary: 'Remove the specified role.' operationId: removeTheSpecifiedRole description: '' parameters: [] responses: { } tags: - Roles parameters: - in: path name: uuid description: '' example: 019a72f5-e02f-70bb-9443-7cb5ab140c15 required: true schema: type: string /api/v1/stock-levels/adjust: post: summary: 'Adjust stock level (increase or decrease).' operationId: adjustStockLevelincreaseOrDecrease description: '' parameters: [] responses: { } tags: - 'Stock Management' requestBody: required: true content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: consequatur nullable: false location: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: false adjustment: type: number description: '' example: 11613.31890586 nullable: false reason: type: string description: 'Must not be greater than 500 characters.' example: opfuudtdsufvyvddqamni nullable: false notes: type: string description: '' example: consequatur nullable: true required: - item_id - location - adjustment - reason /api/v1/stock-levels/transfer: post: summary: 'Transfer stock between locations.' operationId: transferStockBetweenLocations description: '' parameters: [] responses: { } tags: - 'Stock Management' requestBody: required: true content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: consequatur nullable: false location_from: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: false location_to: type: string description: 'The value and location_from must be different. Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: false quantity: type: number description: 'Must be at least 0.01.' example: 80 nullable: false notes: type: string description: '' example: consequatur nullable: true required: - item_id - location_from - location_to - quantity /api/v1/stock-levels/low-stock: get: summary: 'Get low stock items.' operationId: getLowStockItems description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Stock Management' /api/v1/stock-levels: get: summary: 'Display a listing of stock levels.' operationId: displayAListingOfStockLevels description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Stock Management' post: summary: 'Store a newly created stock level.' operationId: storeANewlyCreatedStockLevel description: '' parameters: [] responses: { } tags: - 'Stock Management' requestBody: required: true content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: consequatur nullable: false location: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: false on_hand: type: number description: 'Must be at least 0.' example: 45 nullable: false reserved: type: number description: 'Must be at least 0.' example: 46 nullable: true reorder_level: type: number description: 'Must be at least 0.' example: 28 nullable: true required: - item_id - location - on_hand '/api/v1/stock-levels/{uuid}': get: summary: 'Display the specified stock level.' operationId: displayTheSpecifiedStockLevel description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Stock Management' put: summary: 'Update the specified stock level.' operationId: updateTheSpecifiedStockLevel description: '' parameters: [] responses: { } tags: - 'Stock Management' requestBody: required: false content: application/json: schema: type: object properties: item_id: type: string description: 'The id of an existing record in the items table.' example: null nullable: false location: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false on_hand: type: number description: 'Must be at least 0.' example: 1 nullable: false reserved: type: number description: 'Must be at least 0.' example: 45 nullable: true reorder_level: type: number description: 'Must be at least 0.' example: 46 nullable: true delete: summary: 'Remove the specified stock level.' operationId: removeTheSpecifiedStockLevel description: '' parameters: [] responses: { } tags: - 'Stock Management' parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/suppliers/{supplier_uuid}/price-lists': get: summary: 'Get supplier price lists.' operationId: getSupplierPriceLists description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Suppliers parameters: - in: path name: supplier_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/suppliers: get: summary: 'Display a listing of suppliers.' operationId: displayAListingOfSuppliers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Suppliers post: summary: 'Store a newly created supplier.' operationId: storeANewlyCreatedSupplier description: '' parameters: [] responses: { } tags: - Suppliers requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false contact_person: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: schmitt.beulah@example.org nullable: true phone: type: string description: 'Must not be greater than 20 characters.' example: smsjuryvojcybzvrb nullable: true address: type: string description: 'Must not be greater than 500 characters.' example: yickznkygloigmkwxphlv nullable: true payment_terms: type: string description: 'Must not be greater than 255 characters.' example: azjrcnfbaqywuxhgjjmzu nullable: true rating: type: integer description: 'Must be at least 0. Must not be greater than 5.' example: 5 nullable: true categories: type: array description: '' example: - consequatur items: type: string status: type: string description: '' example: inactive nullable: true enum: - active - inactive - suspended required: - code - name '/api/v1/suppliers/{uuid}': get: summary: 'Display the specified supplier.' operationId: displayTheSpecifiedSupplier description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Suppliers put: summary: 'Update the specified supplier.' operationId: updateTheSpecifiedSupplier description: '' parameters: [] responses: { } tags: - Suppliers requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false contact_person: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: schmitt.beulah@example.org nullable: true phone: type: string description: 'Must not be greater than 20 characters.' example: smsjuryvojcybzvrb nullable: true address: type: string description: 'Must not be greater than 500 characters.' example: yickznkygloigmkwxphlv nullable: true payment_terms: type: string description: 'Must not be greater than 255 characters.' example: azjrcnfbaqywuxhgjjmzu nullable: true rating: type: integer description: 'Must be at least 0. Must not be greater than 5.' example: 5 nullable: true categories: type: array description: '' example: - consequatur items: type: string status: type: string description: '' example: active nullable: true enum: - active - inactive - suspended delete: summary: 'Remove the specified supplier.' operationId: removeTheSpecifiedSupplier description: '' parameters: [] responses: { } tags: - Suppliers parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/system/settings/key/{key}': get: summary: 'Get a system setting by key.' operationId: getASystemSettingByKey description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'System Settings' parameters: - in: path name: key description: 'The key.' example: consequatur required: true schema: type: string /api/v1/system/settings: get: summary: 'Display a listing of system settings.' operationId: displayAListingOfSystemSettings description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'System Settings' post: summary: 'Store a newly created system setting.' operationId: storeANewlyCreatedSystemSetting description: '' parameters: [] responses: { } tags: - 'System Settings' requestBody: required: true content: application/json: schema: type: object properties: key: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false value: type: string description: '' example: consequatur nullable: false description: type: string description: 'Must not be greater than 500 characters.' example: 'Dolorum amet iste laborum eius est dolor.' nullable: true type: type: string description: '' example: integer nullable: true enum: - string - integer - boolean - json required: - key - value '/api/v1/system/settings/{id}': get: summary: 'Display the specified system setting.' operationId: displayTheSpecifiedSystemSetting description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'System Settings' put: summary: 'Update the specified system setting.' operationId: updateTheSpecifiedSystemSetting description: '' parameters: [] responses: { } tags: - 'System Settings' requestBody: required: false content: application/json: schema: type: object properties: key: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false value: type: string description: '' example: null nullable: false description: type: string description: 'Must not be greater than 500 characters.' example: 'Dolores molestias ipsam sit.' nullable: true type: type: string description: '' example: string nullable: true enum: - string - integer - boolean - json delete: summary: 'Remove the specified system setting.' operationId: removeTheSpecifiedSystemSetting description: '' parameters: [] responses: { } tags: - 'System Settings' parameters: - in: path name: id description: 'The ID of the setting.' example: consequatur required: true schema: type: string '/api/v1/timesheets/{timesheet_uuid}/submit': post: summary: 'Submit timesheet for approval.' operationId: submitTimesheetForApproval description: '' parameters: [] responses: { } tags: - Timesheets parameters: - in: path name: timesheet_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/timesheets/{timesheet_uuid}/approve': post: summary: 'Approve timesheet entry.' operationId: approveTimesheetEntry description: '' parameters: [] responses: { } tags: - Timesheets parameters: - in: path name: timesheet_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/timesheets/{timesheet_uuid}/reject': post: summary: 'Reject timesheet entry.' operationId: rejectTimesheetEntry description: '' parameters: [] responses: { } tags: - Timesheets parameters: - in: path name: timesheet_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/timesheets/summary: get: summary: 'Get timesheet summary.' operationId: getTimesheetSummary description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Timesheets /api/v1/timesheets: get: summary: 'Display a listing of timesheet entries.' operationId: displayAListingOfTimesheetEntries description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Timesheets post: summary: 'Store a newly created timesheet entry.' operationId: storeANewlyCreatedTimesheetEntry description: '' parameters: [] responses: { } tags: - Timesheets requestBody: required: true content: application/json: schema: type: object properties: project_id: type: string description: 'The id of an existing record in the projects table.' example: consequatur nullable: false date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:22' nullable: false hours: type: number description: 'Must be at least 0.01. Must not be greater than 24.' example: 12 nullable: false task_description: type: string description: '' example: consequatur nullable: true location_lat: type: number description: 'Must be between -90 and 90.' example: -90 nullable: false location_lng: type: number description: 'Must be between -180 and 180.' example: -179 nullable: false location_address: type: string description: 'Must not be greater than 500 characters.' example: eopfuudtdsufvyvddqamn nullable: true status: type: string description: '' example: approved nullable: true enum: - draft - submitted - approved - rejected required: - project_id - date - hours - location_lat - location_lng '/api/v1/timesheets/{uuid}': get: summary: 'Display the specified timesheet entry.' operationId: displayTheSpecifiedTimesheetEntry description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Timesheets put: summary: 'Update the specified timesheet entry.' operationId: updateTheSpecifiedTimesheetEntry description: '' parameters: [] responses: { } tags: - Timesheets requestBody: required: false content: application/json: schema: type: object properties: project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: false date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:22' nullable: false hours: type: number description: 'Must be at least 0.01. Must not be greater than 24.' example: 20 nullable: false task_description: type: string description: '' example: consequatur nullable: true location_lat: type: number description: 'Must be between -90 and 90.' example: -90 nullable: false location_lng: type: number description: 'Must be between -180 and 180.' example: -179 nullable: false location_address: type: string description: 'Must not be greater than 500 characters.' example: eopfuudtdsufvyvddqamn nullable: true status: type: string description: '' example: rejected nullable: true enum: - draft - submitted - approved - rejected delete: summary: 'Remove the specified timesheet entry.' operationId: removeTheSpecifiedTimesheetEntry description: '' parameters: [] responses: { } tags: - Timesheets parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/training-records/expiring: get: summary: 'Get expiring certifications.' operationId: getExpiringCertifications description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Training Records' /api/v1/training-records: get: summary: 'Display a listing of training records.' operationId: displayAListingOfTrainingRecords description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Training Records' post: summary: 'Store a newly created training record.' operationId: storeANewlyCreatedTrainingRecord description: '' parameters: [] responses: { } tags: - 'Training Records' requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'The id of an existing record in the users table.' example: consequatur nullable: false course_name: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: false provider: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true completion_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:22' nullable: false expiry_date: type: string description: 'Must be a valid date. Must be a date after completion_date.' example: '2106-12-11' nullable: true certificate_path: type: string description: 'Must not be greater than 500 characters.' example: mqeopfuudtdsufvyvddqa nullable: true status: type: string description: '' example: expired nullable: true enum: - active - expired - pending required: - user_id - course_name - completion_date '/api/v1/training-records/{uuid}': get: summary: 'Display the specified training record.' operationId: displayTheSpecifiedTrainingRecord description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Training Records' put: summary: 'Update the specified training record.' operationId: updateTheSpecifiedTrainingRecord description: '' parameters: [] responses: { } tags: - 'Training Records' requestBody: required: false content: application/json: schema: type: object properties: user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: false course_name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false provider: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: true completion_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:22' nullable: false expiry_date: type: string description: 'Must be a valid date. Must be a date after completion_date.' example: '2106-12-11' nullable: true certificate_path: type: string description: 'Must not be greater than 500 characters.' example: mqeopfuudtdsufvyvddqa nullable: true status: type: string description: '' example: expired nullable: true enum: - active - expired - pending delete: summary: 'Remove the specified training record.' operationId: removeTheSpecifiedTrainingRecord description: '' parameters: [] responses: { } tags: - 'Training Records' parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/vehicles/{vehicle_uuid}/assign': post: summary: 'Assign vehicle to project.' operationId: assignVehicleToProject description: '' parameters: [] responses: { } tags: - Vehicles requestBody: required: true content: application/json: schema: type: object properties: project_id: type: string description: 'The id of an existing record in the projects table.' example: consequatur nullable: false required: - project_id parameters: - in: path name: vehicle_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string '/api/v1/vehicles/{vehicle_uuid}/unassign': post: summary: 'Unassign vehicle from project.' operationId: unassignVehicleFromProject description: '' parameters: [] responses: { } tags: - Vehicles parameters: - in: path name: vehicle_uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string /api/v1/vehicles: get: summary: 'Display a listing of vehicles.' operationId: displayAListingOfVehicles description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Vehicles post: summary: 'Store a newly created vehicle.' operationId: storeANewlyCreatedVehicle description: '' parameters: [] responses: { } tags: - Vehicles requestBody: required: true content: application/json: schema: type: object properties: plate_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false type: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: true make: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true model: type: string description: 'Must not be greater than 255 characters.' example: auydlsmsjuryvojcybzvr nullable: true year: type: integer description: 'Must be at least 1900. Must not be greater than 2026.' example: 2 nullable: true status: type: string description: '' example: maintenance nullable: true enum: - available - assigned - maintenance - retired assigned_project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true last_service_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:21' nullable: true odometer: type: integer description: 'Must be at least 0.' example: 84 nullable: true required: - plate_number '/api/v1/vehicles/{uuid}': get: summary: 'Display the specified vehicle.' operationId: displayTheSpecifiedVehicle description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Vehicles put: summary: 'Update the specified vehicle.' operationId: updateTheSpecifiedVehicle description: '' parameters: [] responses: { } tags: - Vehicles requestBody: required: false content: application/json: schema: type: object properties: plate_number: type: string description: 'Must not be greater than 50 characters.' example: vmqeopfuudtdsufvyvddq nullable: false type: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: true make: type: string description: 'Must not be greater than 255 characters.' example: qxbajwbpilpmufinllwlo nullable: true model: type: string description: 'Must not be greater than 255 characters.' example: auydlsmsjuryvojcybzvr nullable: true year: type: integer description: 'Must be at least 1900. Must not be greater than 2026.' example: 2 nullable: true status: type: string description: '' example: maintenance nullable: true enum: - available - assigned - maintenance - retired assigned_project_id: type: string description: 'The id of an existing record in the projects table.' example: null nullable: true last_service_date: type: string description: 'Must be a valid date.' example: '2025-11-12T10:13:22' nullable: true odometer: type: integer description: 'Must be at least 0.' example: 84 nullable: true delete: summary: 'Remove the specified vehicle.' operationId: removeTheSpecifiedVehicle description: '' parameters: [] responses: { } tags: - Vehicles parameters: - in: path name: uuid description: '' example: 66529e01-d113-3473-8d6f-9e11e09332ea required: true schema: type: string