docs(api): regenerate Scribe API documentation
Update auto-generated API documentation: - New endpoints: ProjectMonthPlan, Reports, Roles - Updated endpoint docs for Allocations and Projects - Regenerated Scribe index with new endpoints Documentation now reflects enhanced-allocation features.
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"active": true,
|
|
||||||
"iteration": 10,
|
|
||||||
"minIterations": 1,
|
|
||||||
"maxIterations": 10,
|
|
||||||
"completionPromise": "COMPLETE",
|
|
||||||
"tasksMode": false,
|
|
||||||
"taskPromise": "READY_FOR_NEXT_TASK",
|
|
||||||
"prompt": "Test the changes made by running the scribe command and the swagger is working fine. In case any issues found, fix and retest until the issue is resolved. once that is done, /opsx-verify, /opsx-sync and /opsx-archive. Then commit the code. Attempt a push, if failed, leave it for me. <promise>DONE</promise> when complete.",
|
|
||||||
"startedAt": "2026-02-18T19:18:44.320Z",
|
|
||||||
"model": "",
|
|
||||||
"agent": "opencode"
|
|
||||||
}
|
|
||||||
@@ -1,93 +1,22 @@
|
|||||||
## Autogenerated by Scribe. DO NOT MODIFY.
|
## Autogenerated by Scribe. DO NOT MODIFY.
|
||||||
|
|
||||||
name: 'Team Members'
|
name: Endpoints
|
||||||
description: |-
|
description: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
endpoints:
|
endpoints:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: api/team-members
|
uri: api/user
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'List all team members'
|
title: ''
|
||||||
description: 'Get a list of all team members with optional filtering by active status.'
|
description: ''
|
||||||
authenticated: true
|
authenticated: false
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters:
|
|
||||||
active:
|
|
||||||
custom: []
|
|
||||||
name: active
|
|
||||||
description: 'Filter by active status.'
|
|
||||||
required: false
|
|
||||||
example: true
|
|
||||||
type: boolean
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanQueryParameters:
|
|
||||||
active: true
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"name": "John Doe",
|
|
||||||
"role": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- POST
|
|
||||||
uri: api/team-members
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: 'Team Members'
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Create a new team member'
|
|
||||||
description: 'Create a new team member with name, role, and hourly rate.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
@@ -96,84 +25,19 @@ endpoints:
|
|||||||
cleanUrlParameters: []
|
cleanUrlParameters: []
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters: []
|
||||||
name:
|
cleanBodyParameters: []
|
||||||
custom: []
|
|
||||||
name: name
|
|
||||||
description: 'Team member name.'
|
|
||||||
required: true
|
|
||||||
example: 'John Doe'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
role_id:
|
|
||||||
custom: []
|
|
||||||
name: role_id
|
|
||||||
description: 'Role ID.'
|
|
||||||
required: true
|
|
||||||
example: 1
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
hourly_rate:
|
|
||||||
custom: []
|
|
||||||
name: hourly_rate
|
|
||||||
description: 'Hourly rate (must be > 0).'
|
|
||||||
required: true
|
|
||||||
example: '150.00'
|
|
||||||
type: numeric
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
active:
|
|
||||||
custom: []
|
|
||||||
name: active
|
|
||||||
description: 'Active status (defaults to true).'
|
|
||||||
required: false
|
|
||||||
example: true
|
|
||||||
type: boolean
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
name: 'John Doe'
|
|
||||||
role_id: 1
|
|
||||||
hourly_rate: '150.00'
|
|
||||||
active: true
|
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 201
|
status: 401
|
||||||
content: |-
|
content: '{"message":"Authentication required"}'
|
||||||
{
|
headers:
|
||||||
"data": {
|
cache-control: 'no-cache, private'
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
content-type: application/json
|
||||||
"name": "John Doe",
|
access-control-allow-origin: '*'
|
||||||
"role": {
|
description: null
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Validation failed","errors":{"name":["The name field is required."],"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -183,36 +47,24 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: 'api/team-members/{id}'
|
uri: api/project-month-plans
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get a single team member'
|
title: |-
|
||||||
description: 'Get details of a specific team member by ID.'
|
GET /api/project-month-plans?year=2026
|
||||||
authenticated: true
|
Returns month-plan grid payload by project/month for the year.
|
||||||
|
description: ''
|
||||||
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
urlParameters:
|
urlParameters: []
|
||||||
id:
|
cleanUrlParameters: []
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Team member UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
@@ -221,30 +73,13 @@ endpoints:
|
|||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 200
|
status: 401
|
||||||
content: |-
|
content: '{"message":"Authentication required"}'
|
||||||
{
|
headers:
|
||||||
"data": {
|
cache-control: 'no-cache, private'
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
content-type: application/json
|
||||||
"name": "John Doe",
|
access-control-allow-origin: '*'
|
||||||
"role": {
|
description: null
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -254,123 +89,92 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- PUT
|
- PUT
|
||||||
- PATCH
|
uri: api/project-month-plans/bulk
|
||||||
uri: 'api/team-members/{id}'
|
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Update a team member'
|
title: |-
|
||||||
description: 'Update details of an existing team member.'
|
PUT /api/project-month-plans/bulk
|
||||||
authenticated: true
|
Bulk upsert month plan cells.
|
||||||
|
description: ''
|
||||||
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
urlParameters:
|
urlParameters: []
|
||||||
id:
|
cleanUrlParameters: []
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Team member UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
name:
|
year:
|
||||||
custom: []
|
custom: []
|
||||||
name: name
|
name: year
|
||||||
description: 'Team member name.'
|
description: 'Must be at least 2020. Must not be greater than 2100.'
|
||||||
required: false
|
required: true
|
||||||
example: 'John Doe'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
role_id:
|
|
||||||
custom: []
|
|
||||||
name: role_id
|
|
||||||
description: 'Role ID.'
|
|
||||||
required: false
|
|
||||||
example: 1
|
example: 1
|
||||||
type: integer
|
type: integer
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
hourly_rate:
|
items:
|
||||||
custom: []
|
custom: []
|
||||||
name: hourly_rate
|
name: items
|
||||||
description: 'Hourly rate (must be > 0).'
|
description: ''
|
||||||
required: false
|
required: true
|
||||||
example: '175.00'
|
example:
|
||||||
type: numeric
|
- []
|
||||||
|
type: 'object[]'
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
active:
|
'items[].project_id':
|
||||||
custom: []
|
custom: []
|
||||||
name: active
|
name: 'items[].project_id'
|
||||||
description: 'Active status.'
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the projects table.'
|
||||||
required: false
|
required: true
|
||||||
example: false
|
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
type: boolean
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
'items[].month':
|
||||||
|
custom: []
|
||||||
|
name: 'items[].month'
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'items[].planned_hours':
|
||||||
|
custom: []
|
||||||
|
name: 'items[].planned_hours'
|
||||||
|
description: 'Must be at least 0.'
|
||||||
|
required: false
|
||||||
|
example: 84
|
||||||
|
type: number
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
name: 'John Doe'
|
year: 1
|
||||||
role_id: 1
|
items:
|
||||||
hourly_rate: '175.00'
|
-
|
||||||
active: false
|
project_id: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
|
month: 2026-02
|
||||||
|
planned_hours: 84
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses: []
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"name": "John Doe",
|
|
||||||
"role": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "175.00",
|
|
||||||
"active": false,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T11:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Validation failed","errors":{"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -380,18 +184,16 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- DELETE
|
- DELETE
|
||||||
uri: 'api/team-members/{id}'
|
uri: 'api/ptos/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Delete a team member'
|
title: ''
|
||||||
description: 'Delete a team member. Cannot delete if member has allocations or actuals.'
|
description: ''
|
||||||
authenticated: true
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
@@ -400,46 +202,22 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Team member UUID.'
|
description: 'The ID of the pto.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: architecto
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
cleanUrlParameters:
|
cleanUrlParameters:
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
id: architecto
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
cleanBodyParameters: []
|
cleanBodyParameters: []
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses: []
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: '{"message":"Team member deleted successfully"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot delete team member with active allocations","suggestion":"Consider deactivating the team member instead"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot delete team member with historical data","suggestion":"Consider deactivating the team member instead"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
|
|||||||
@@ -1,117 +1,25 @@
|
|||||||
## Autogenerated by Scribe. DO NOT MODIFY.
|
## Autogenerated by Scribe. DO NOT MODIFY.
|
||||||
|
|
||||||
name: Projects
|
name: 'Team Members'
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
endpoints:
|
endpoints:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: api/projects/types
|
uri: api/team-members
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get all project types'
|
title: 'List all team members'
|
||||||
description: ''
|
description: 'Get a list of all team members with optional filtering by active status.'
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{"id": 1, "name": "Project"},
|
|
||||||
{"id": 2, "name": "Support"},
|
|
||||||
{"id": 3, "name": "Engagement"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- GET
|
|
||||||
uri: api/projects/statuses
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Get all project statuses'
|
|
||||||
description: ''
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{"id": 1, "name": "Pre-sales", "order": 1},
|
|
||||||
{"id": 2, "name": "SOW Approval", "order": 2},
|
|
||||||
{"id": 3, "name": "Gathering Estimates", "order": 3}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- GET
|
|
||||||
uri: api/projects
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'List all projects'
|
|
||||||
description: 'Get a list of all projects with optional filtering by status and type.'
|
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -120,31 +28,19 @@ endpoints:
|
|||||||
urlParameters: []
|
urlParameters: []
|
||||||
cleanUrlParameters: []
|
cleanUrlParameters: []
|
||||||
queryParameters:
|
queryParameters:
|
||||||
status_id:
|
active:
|
||||||
custom: []
|
custom: []
|
||||||
name: status_id
|
name: active
|
||||||
description: 'Filter by status ID.'
|
description: 'Filter by active status.'
|
||||||
required: false
|
required: false
|
||||||
example: 1
|
example: true
|
||||||
type: integer
|
type: boolean
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Filter by type ID.'
|
|
||||||
required: false
|
|
||||||
example: 2
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
cleanQueryParameters:
|
cleanQueryParameters:
|
||||||
status_id: 1
|
active: true
|
||||||
type_id: 2
|
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
cleanBodyParameters: []
|
cleanBodyParameters: []
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
@@ -157,12 +53,13 @@ endpoints:
|
|||||||
"data": [
|
"data": [
|
||||||
{
|
{
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 2, "name": "Support"},
|
"name": "Backend Developer"
|
||||||
"approved_estimate": "120.00",
|
},
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60, "2024-04": 20},
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
@@ -179,17 +76,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- POST
|
- POST
|
||||||
uri: api/projects
|
uri: api/team-members
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Create a new project'
|
title: 'Create a new team member'
|
||||||
description: 'Create a new project with code, title, and type.'
|
description: 'Create a new team member with name, role, and hourly rate.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -200,32 +97,21 @@ endpoints:
|
|||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
code:
|
name:
|
||||||
custom: []
|
custom: []
|
||||||
name: code
|
name: name
|
||||||
description: 'Project code (must be unique).'
|
description: 'Team member name.'
|
||||||
required: true
|
required: true
|
||||||
example: PROJ-001
|
example: 'John Doe'
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
title:
|
role_id:
|
||||||
custom: []
|
custom: []
|
||||||
name: title
|
name: role_id
|
||||||
description: 'Project title.'
|
description: 'Role ID.'
|
||||||
required: true
|
|
||||||
example: 'Client Dashboard Redesign'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Project type ID.'
|
|
||||||
required: true
|
required: true
|
||||||
example: 1
|
example: 1
|
||||||
type: integer
|
type: integer
|
||||||
@@ -233,10 +119,33 @@ endpoints:
|
|||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
hourly_rate:
|
||||||
|
custom: []
|
||||||
|
name: hourly_rate
|
||||||
|
description: 'Hourly rate (must be > 0).'
|
||||||
|
required: true
|
||||||
|
example: '150.00'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
active:
|
||||||
|
custom: []
|
||||||
|
name: active
|
||||||
|
description: 'Active status (defaults to true).'
|
||||||
|
required: false
|
||||||
|
example: true
|
||||||
|
type: boolean
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
code: PROJ-001
|
name: 'John Doe'
|
||||||
title: 'Client Dashboard Redesign'
|
role_id: 1
|
||||||
type_id: 1
|
hourly_rate: '150.00'
|
||||||
|
active: true
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
@@ -246,10 +155,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 1, "name": "Project"}
|
"name": "Backend Developer"
|
||||||
|
},
|
||||||
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -257,7 +171,7 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Validation failed","errors":{"code":["Project code must be unique"],"title":["The title field is required."]}}'
|
content: '{"message":"Validation failed","errors":{"name":["The name field is required."],"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -269,17 +183,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get a single project'
|
title: 'Get a single team member'
|
||||||
description: 'Get details of a specific project by ID.'
|
description: 'Get details of a specific team member by ID.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -289,7 +203,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -312,12 +226,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 1, "name": "Project"},
|
"name": "Backend Developer"
|
||||||
"approved_estimate": "120.00",
|
},
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60}
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -325,7 +242,7 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -338,17 +255,17 @@ endpoints:
|
|||||||
httpMethods:
|
httpMethods:
|
||||||
- PUT
|
- PUT
|
||||||
- PATCH
|
- PATCH
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Update a project'
|
title: 'Update a team member'
|
||||||
description: 'Update details of an existing project.'
|
description: 'Update details of an existing team member.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -358,7 +275,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -371,43 +288,55 @@ endpoints:
|
|||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
code:
|
name:
|
||||||
custom: []
|
custom: []
|
||||||
name: code
|
name: name
|
||||||
description: 'Project code (must be unique).'
|
description: 'Team member name.'
|
||||||
required: false
|
required: false
|
||||||
example: PROJ-002
|
example: 'John Doe'
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
title:
|
role_id:
|
||||||
custom: []
|
custom: []
|
||||||
name: title
|
name: role_id
|
||||||
description: 'Project title.'
|
description: 'Role ID.'
|
||||||
required: false
|
required: false
|
||||||
example: 'Updated Title'
|
example: 1
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Project type ID.'
|
|
||||||
required: false
|
|
||||||
example: 2
|
|
||||||
type: integer
|
type: integer
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
hourly_rate:
|
||||||
|
custom: []
|
||||||
|
name: hourly_rate
|
||||||
|
description: 'Hourly rate (must be > 0).'
|
||||||
|
required: false
|
||||||
|
example: '175.00'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
active:
|
||||||
|
custom: []
|
||||||
|
name: active
|
||||||
|
description: 'Active status.'
|
||||||
|
required: false
|
||||||
|
example: false
|
||||||
|
type: boolean
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
code: PROJ-002
|
name: 'John Doe'
|
||||||
title: 'Updated Title'
|
role_id: 1
|
||||||
type_id: 2
|
hourly_rate: '175.00'
|
||||||
|
active: false
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
@@ -417,9 +346,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-002",
|
"name": "John Doe",
|
||||||
"title": "Updated Title",
|
"role": {
|
||||||
"type": {"id": 2, "name": "Support"}
|
"id": 1,
|
||||||
|
"name": "Backend Developer"
|
||||||
|
},
|
||||||
|
"hourly_rate": "175.00",
|
||||||
|
"active": false,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T11:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -427,13 +362,13 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Validation failed","errors":{"type_id":["The selected type id is invalid."]}}'
|
content: '{"message":"Validation failed","errors":{"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -445,17 +380,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- DELETE
|
- DELETE
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Delete a project'
|
title: 'Delete a team member'
|
||||||
description: 'Delete a project. Cannot delete if project has allocations or actuals.'
|
description: 'Delete a team member. Cannot delete if member has allocations or actuals.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -465,7 +400,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -484,302 +419,25 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 200
|
status: 200
|
||||||
content: '{"message":"Project deleted successfully"}'
|
content: '{"message":"Team member deleted successfully"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Cannot delete project with allocations"}'
|
content: '{"message":"Cannot delete team member with active allocations","suggestion":"Consider deactivating the team member instead"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
-
|
||||||
auth: []
|
custom: []
|
||||||
controller: null
|
status: 422
|
||||||
method: null
|
content: '{"message":"Cannot delete team member with historical data","suggestion":"Consider deactivating the team member instead"}'
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/status'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Transition project status'
|
|
||||||
description: 'Transition project to a new status following the state machine rules.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
status_id:
|
|
||||||
custom: []
|
|
||||||
name: status_id
|
|
||||||
description: 'Target status ID.'
|
|
||||||
required: true
|
|
||||||
example: 2
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
status_id: 2
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"status": {"id": 2, "name": "SOW Approval"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot transition from Pre-sales to Done"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/estimate'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Set approved estimate'
|
|
||||||
description: 'Set the approved billable hours estimate for a project.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
approved_estimate:
|
|
||||||
custom: []
|
|
||||||
name: approved_estimate
|
|
||||||
description: 'Approved estimate hours (must be > 0).'
|
|
||||||
required: true
|
|
||||||
example: 120.0
|
|
||||||
type: number
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
approved_estimate: 120.0
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"approved_estimate": "120.00"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Approved estimate must be greater than 0"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/forecast'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Set forecasted effort'
|
|
||||||
description: 'Set the month-by-month forecasted effort breakdown.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
forecasted_effort:
|
|
||||||
custom: []
|
|
||||||
name: forecasted_effort
|
|
||||||
description: 'Monthly effort breakdown.'
|
|
||||||
required: true
|
|
||||||
example:
|
|
||||||
2024-02: 40
|
|
||||||
2024-03: 60
|
|
||||||
type: object
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
forecasted_effort:
|
|
||||||
2024-02: 40
|
|
||||||
2024-03: 60
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Forecasted effort exceeds approved estimate by more than 5%"}'
|
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
897
backend/.scribe/endpoints.cache/04.yaml
Normal file
897
backend/.scribe/endpoints.cache/04.yaml
Normal file
@@ -0,0 +1,897 @@
|
|||||||
|
## Autogenerated by Scribe. DO NOT MODIFY.
|
||||||
|
|
||||||
|
name: 'Capacity Planning'
|
||||||
|
description: ''
|
||||||
|
endpoints:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Individual Capacity'
|
||||||
|
description: 'Calculate capacity for a specific team member in a given month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
team_member_id: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"month": "2026-02",
|
||||||
|
"working_days": 20,
|
||||||
|
"person_days": 18.5,
|
||||||
|
"hours": 148,
|
||||||
|
"details": [
|
||||||
|
{
|
||||||
|
"date": "2026-02-02",
|
||||||
|
"availability": 1,
|
||||||
|
"is_pto": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity/team
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Team Capacity'
|
||||||
|
description: 'Summarize the combined capacity for all active team members in a month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"month": "2026-02",
|
||||||
|
"total_person_days": 180.5,
|
||||||
|
"total_hours": 1444,
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"name": "Ada Lovelace",
|
||||||
|
"person_days": 18.5,
|
||||||
|
"hours": 148
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity/revenue
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Possible Revenue'
|
||||||
|
description: 'Estimate monthly revenue based on capacity hours and hourly rates.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"month": "2026-02",
|
||||||
|
"possible_revenue": 21500.25,
|
||||||
|
"member_revenues": [
|
||||||
|
{
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"team_member_name": "Ada Lovelace",
|
||||||
|
"hours": 148,
|
||||||
|
"hourly_rate": 150.0,
|
||||||
|
"revenue": 22200.0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/capacity/availability
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Save Team Member Availability'
|
||||||
|
description: 'Persist a daily availability override and refresh cached capacity totals.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
date:
|
||||||
|
custom: []
|
||||||
|
name: date
|
||||||
|
description: 'The date for the availability override (YYYY-MM-DD).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
availability:
|
||||||
|
custom: []
|
||||||
|
name: availability
|
||||||
|
description: 'The availability value (0, 0.5, 1.0).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: architecto
|
||||||
|
date: architecto
|
||||||
|
availability: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-03",
|
||||||
|
"availability": 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/capacity/availability/batch
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Batch Update Team Member Availability'
|
||||||
|
description: 'Persist multiple daily availability overrides in a single batch operation.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
updates:
|
||||||
|
custom: []
|
||||||
|
name: updates
|
||||||
|
description: 'Array of availability updates.'
|
||||||
|
required: true
|
||||||
|
example:
|
||||||
|
- architecto
|
||||||
|
type: 'string[]'
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].team_member_id':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].team_member_id'
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].date':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].date'
|
||||||
|
description: 'The date (YYYY-MM-DD).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].availability':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].availability'
|
||||||
|
description: 'The availability value (0, 0.5, 1).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
updates:
|
||||||
|
- architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"saved": 12,
|
||||||
|
"month": "2026-02"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/holidays
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List Holidays'
|
||||||
|
description: 'Retrieve holidays for a specific month or all holidays when no month is provided.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'nullable The month in YYYY-MM format.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-14",
|
||||||
|
"name": "Company Holiday",
|
||||||
|
"description": "Office closed"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/holidays
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Create Holiday'
|
||||||
|
description: 'Add a holiday and clear cached capacity data for the related month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
date:
|
||||||
|
custom: []
|
||||||
|
name: date
|
||||||
|
description: 'Date of the holiday.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-14'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
name:
|
||||||
|
custom: []
|
||||||
|
name: name
|
||||||
|
description: 'Name of the holiday.'
|
||||||
|
required: true
|
||||||
|
example: "Presidents' Day"
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
description:
|
||||||
|
custom: []
|
||||||
|
name: description
|
||||||
|
description: 'nullable Optional description of the holiday.'
|
||||||
|
required: false
|
||||||
|
example: 'Eius et animi quos velit et.'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
date: '2026-02-14'
|
||||||
|
name: "Presidents' Day"
|
||||||
|
description: 'Eius et animi quos velit et.'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-14",
|
||||||
|
"name": "Presidents' Day",
|
||||||
|
"description": "Office closed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"A holiday already exists for this date.","errors":{"date":["A holiday already exists for this date."]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- DELETE
|
||||||
|
uri: 'api/holidays/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Delete Holiday'
|
||||||
|
description: 'Remove a holiday and clear affected capacity caches.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'The holiday UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"message": "Holiday deleted"
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/ptos
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List PTO Requests'
|
||||||
|
description: 'Fetch PTO requests for a team member, optionally constrained to a month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'nullable The month in YYYY-MM format.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: architecto
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"start_date": "2026-02-10",
|
||||||
|
"end_date": "2026-02-12",
|
||||||
|
"status": "pending",
|
||||||
|
"reason": "Family travel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/ptos
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Request PTO'
|
||||||
|
description: 'Create a PTO request for a team member and approve it immediately.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
start_date:
|
||||||
|
custom: []
|
||||||
|
name: start_date
|
||||||
|
description: 'The first day of the PTO.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-10'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
end_date:
|
||||||
|
custom: []
|
||||||
|
name: end_date
|
||||||
|
description: 'The final day of the PTO.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-12'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
reason:
|
||||||
|
custom: []
|
||||||
|
name: reason
|
||||||
|
description: 'nullable Optional reason for the PTO.'
|
||||||
|
required: false
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
start_date: '2026-02-10'
|
||||||
|
end_date: '2026-02-12'
|
||||||
|
reason: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"start_date": "2026-02-10",
|
||||||
|
"end_date": "2026-02-12",
|
||||||
|
"status": "approved",
|
||||||
|
"reason": "Family travel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- PUT
|
||||||
|
uri: 'api/ptos/{id}/approve'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Approve PTO'
|
||||||
|
description: 'Approve a pending PTO request and refresh the affected capacity caches.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'The PTO UUID that needs approval.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"status": "approved"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
495
backend/.scribe/endpoints.cache/05.yaml
Normal file
495
backend/.scribe/endpoints.cache/05.yaml
Normal file
@@ -0,0 +1,495 @@
|
|||||||
|
## Autogenerated by Scribe. DO NOT MODIFY.
|
||||||
|
|
||||||
|
name: 'Resource Allocation'
|
||||||
|
description: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
endpoints:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/allocations
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List allocations / Get allocation matrix'
|
||||||
|
description: 'Get all allocations, optionally filtered by month.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Filter by month (YYYY-MM format).'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanQueryParameters:
|
||||||
|
month: 2026-02
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/allocations
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Create a new allocation'
|
||||||
|
description: 'Allocate hours for a team member to a project for a specific month.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
project_id:
|
||||||
|
custom: []
|
||||||
|
name: project_id
|
||||||
|
description: 'Project UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'Team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440002
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Month (YYYY-MM format).'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
allocated_hours:
|
||||||
|
custom: []
|
||||||
|
name: allocated_hours
|
||||||
|
description: 'Hours to allocate (must be >= 0).'
|
||||||
|
required: true
|
||||||
|
example: '40'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
project_id: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440002
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: '40'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"Validation failed","errors":{"allocated_hours":["Allocated hours must be greater than or equal to 0"]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get a single allocation'
|
||||||
|
description: 'Get details of a specific allocation by ID.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- PUT
|
||||||
|
- PATCH
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Update an allocation'
|
||||||
|
description: "Update an existing allocation's hours."
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
allocated_hours:
|
||||||
|
custom: []
|
||||||
|
name: allocated_hours
|
||||||
|
description: 'Hours to allocate (must be >= 0).'
|
||||||
|
required: true
|
||||||
|
example: '60'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
allocated_hours: '60'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 60.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"Validation failed","errors":{"allocated_hours":["Allocated hours must be greater than or equal to 0"]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- DELETE
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Delete an allocation'
|
||||||
|
description: 'Remove an allocation.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: '{"message": "Allocation deleted successfully"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/allocations/bulk
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Bulk create allocations'
|
||||||
|
description: 'Create or update multiple allocations in a single request.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
allocations:
|
||||||
|
custom: []
|
||||||
|
name: allocations
|
||||||
|
description: 'Array of allocations.'
|
||||||
|
required: true
|
||||||
|
example:
|
||||||
|
-
|
||||||
|
project_id: ...
|
||||||
|
team_member_id: ...
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: 40
|
||||||
|
type: 'string[]'
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].project_id':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].project_id'
|
||||||
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the projects table.'
|
||||||
|
required: true
|
||||||
|
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].team_member_id':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].team_member_id'
|
||||||
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].month':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].month'
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].allocated_hours':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].allocated_hours'
|
||||||
|
description: 'Must be at least 0.'
|
||||||
|
required: true
|
||||||
|
example: 77
|
||||||
|
type: number
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
allocations:
|
||||||
|
-
|
||||||
|
project_id: ...
|
||||||
|
team_member_id: ...
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: 40
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
@@ -1,91 +1,20 @@
|
|||||||
name: 'Team Members'
|
name: Endpoints
|
||||||
description: |-
|
description: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
endpoints:
|
endpoints:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: api/team-members
|
uri: api/user
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'List all team members'
|
title: ''
|
||||||
description: 'Get a list of all team members with optional filtering by active status.'
|
description: ''
|
||||||
authenticated: true
|
authenticated: false
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters:
|
|
||||||
active:
|
|
||||||
custom: []
|
|
||||||
name: active
|
|
||||||
description: 'Filter by active status.'
|
|
||||||
required: false
|
|
||||||
example: true
|
|
||||||
type: boolean
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanQueryParameters:
|
|
||||||
active: true
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"name": "John Doe",
|
|
||||||
"role": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- POST
|
|
||||||
uri: api/team-members
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: 'Team Members'
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Create a new team member'
|
|
||||||
description: 'Create a new team member with name, role, and hourly rate.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
@@ -94,84 +23,19 @@ endpoints:
|
|||||||
cleanUrlParameters: []
|
cleanUrlParameters: []
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters: []
|
||||||
name:
|
cleanBodyParameters: []
|
||||||
custom: []
|
|
||||||
name: name
|
|
||||||
description: 'Team member name.'
|
|
||||||
required: true
|
|
||||||
example: 'John Doe'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
role_id:
|
|
||||||
custom: []
|
|
||||||
name: role_id
|
|
||||||
description: 'Role ID.'
|
|
||||||
required: true
|
|
||||||
example: 1
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
hourly_rate:
|
|
||||||
custom: []
|
|
||||||
name: hourly_rate
|
|
||||||
description: 'Hourly rate (must be > 0).'
|
|
||||||
required: true
|
|
||||||
example: '150.00'
|
|
||||||
type: numeric
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
active:
|
|
||||||
custom: []
|
|
||||||
name: active
|
|
||||||
description: 'Active status (defaults to true).'
|
|
||||||
required: false
|
|
||||||
example: true
|
|
||||||
type: boolean
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
name: 'John Doe'
|
|
||||||
role_id: 1
|
|
||||||
hourly_rate: '150.00'
|
|
||||||
active: true
|
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 201
|
status: 401
|
||||||
content: |-
|
content: '{"message":"Authentication required"}'
|
||||||
{
|
headers:
|
||||||
"data": {
|
cache-control: 'no-cache, private'
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
content-type: application/json
|
||||||
"name": "John Doe",
|
access-control-allow-origin: '*'
|
||||||
"role": {
|
description: null
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Validation failed","errors":{"name":["The name field is required."],"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -181,36 +45,24 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: 'api/team-members/{id}'
|
uri: api/project-month-plans
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get a single team member'
|
title: |-
|
||||||
description: 'Get details of a specific team member by ID.'
|
GET /api/project-month-plans?year=2026
|
||||||
authenticated: true
|
Returns month-plan grid payload by project/month for the year.
|
||||||
|
description: ''
|
||||||
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
urlParameters:
|
urlParameters: []
|
||||||
id:
|
cleanUrlParameters: []
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Team member UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
@@ -219,30 +71,13 @@ endpoints:
|
|||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 200
|
status: 401
|
||||||
content: |-
|
content: '{"message":"Authentication required"}'
|
||||||
{
|
headers:
|
||||||
"data": {
|
cache-control: 'no-cache, private'
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
content-type: application/json
|
||||||
"name": "John Doe",
|
access-control-allow-origin: '*'
|
||||||
"role": {
|
description: null
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "150.00",
|
|
||||||
"active": true,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -252,123 +87,92 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- PUT
|
- PUT
|
||||||
- PATCH
|
uri: api/project-month-plans/bulk
|
||||||
uri: 'api/team-members/{id}'
|
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Update a team member'
|
title: |-
|
||||||
description: 'Update details of an existing team member.'
|
PUT /api/project-month-plans/bulk
|
||||||
authenticated: true
|
Bulk upsert month plan cells.
|
||||||
|
description: ''
|
||||||
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
urlParameters:
|
urlParameters: []
|
||||||
id:
|
cleanUrlParameters: []
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Team member UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
name:
|
year:
|
||||||
custom: []
|
custom: []
|
||||||
name: name
|
name: year
|
||||||
description: 'Team member name.'
|
description: 'Must be at least 2020. Must not be greater than 2100.'
|
||||||
required: false
|
required: true
|
||||||
example: 'John Doe'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
role_id:
|
|
||||||
custom: []
|
|
||||||
name: role_id
|
|
||||||
description: 'Role ID.'
|
|
||||||
required: false
|
|
||||||
example: 1
|
example: 1
|
||||||
type: integer
|
type: integer
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
hourly_rate:
|
items:
|
||||||
custom: []
|
custom: []
|
||||||
name: hourly_rate
|
name: items
|
||||||
description: 'Hourly rate (must be > 0).'
|
description: ''
|
||||||
required: false
|
required: true
|
||||||
example: '175.00'
|
example:
|
||||||
type: numeric
|
- []
|
||||||
|
type: 'object[]'
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
active:
|
'items[].project_id':
|
||||||
custom: []
|
custom: []
|
||||||
name: active
|
name: 'items[].project_id'
|
||||||
description: 'Active status.'
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the projects table.'
|
||||||
required: false
|
required: true
|
||||||
example: false
|
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
type: boolean
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
'items[].month':
|
||||||
|
custom: []
|
||||||
|
name: 'items[].month'
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'items[].planned_hours':
|
||||||
|
custom: []
|
||||||
|
name: 'items[].planned_hours'
|
||||||
|
description: 'Must be at least 0.'
|
||||||
|
required: false
|
||||||
|
example: 84
|
||||||
|
type: number
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
name: 'John Doe'
|
year: 1
|
||||||
role_id: 1
|
items:
|
||||||
hourly_rate: '175.00'
|
-
|
||||||
active: false
|
project_id: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
|
month: 2026-02
|
||||||
|
planned_hours: 84
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses: []
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"name": "John Doe",
|
|
||||||
"role": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Backend Developer"
|
|
||||||
},
|
|
||||||
"hourly_rate": "175.00",
|
|
||||||
"active": false,
|
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
||||||
"updated_at": "2024-01-15T11:00:00.000000Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Validation failed","errors":{"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
@@ -378,18 +182,16 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- DELETE
|
- DELETE
|
||||||
uri: 'api/team-members/{id}'
|
uri: 'api/ptos/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: 'Team Members'
|
groupName: Endpoints
|
||||||
groupDescription: |-
|
groupDescription: ''
|
||||||
|
|
||||||
Endpoints for managing team members.
|
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Delete a team member'
|
title: ''
|
||||||
description: 'Delete a team member. Cannot delete if member has allocations or actuals.'
|
description: ''
|
||||||
authenticated: true
|
authenticated: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
@@ -398,46 +200,22 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Team member UUID.'
|
description: 'The ID of the pto.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: architecto
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: false
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
cleanUrlParameters:
|
cleanUrlParameters:
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
id: architecto
|
||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
cleanBodyParameters: []
|
cleanBodyParameters: []
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses: []
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: '{"message":"Team member deleted successfully"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Team member not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot delete team member with active allocations","suggestion":"Consider deactivating the team member instead"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot delete team member with historical data","suggestion":"Consider deactivating the team member instead"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
responseFields: []
|
||||||
auth: []
|
auth: []
|
||||||
controller: null
|
controller: null
|
||||||
|
|||||||
@@ -1,115 +1,23 @@
|
|||||||
name: Projects
|
name: 'Team Members'
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
endpoints:
|
endpoints:
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: api/projects/types
|
uri: api/team-members
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get all project types'
|
title: 'List all team members'
|
||||||
description: ''
|
description: 'Get a list of all team members with optional filtering by active status.'
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{"id": 1, "name": "Project"},
|
|
||||||
{"id": 2, "name": "Support"},
|
|
||||||
{"id": 3, "name": "Engagement"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- GET
|
|
||||||
uri: api/projects/statuses
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Get all project statuses'
|
|
||||||
description: ''
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters: []
|
|
||||||
cleanUrlParameters: []
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters: []
|
|
||||||
cleanBodyParameters: []
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": [
|
|
||||||
{"id": 1, "name": "Pre-sales", "order": 1},
|
|
||||||
{"id": 2, "name": "SOW Approval", "order": 2},
|
|
||||||
{"id": 3, "name": "Gathering Estimates", "order": 3}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- GET
|
|
||||||
uri: api/projects
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'List all projects'
|
|
||||||
description: 'Get a list of all projects with optional filtering by status and type.'
|
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -118,31 +26,19 @@ endpoints:
|
|||||||
urlParameters: []
|
urlParameters: []
|
||||||
cleanUrlParameters: []
|
cleanUrlParameters: []
|
||||||
queryParameters:
|
queryParameters:
|
||||||
status_id:
|
active:
|
||||||
custom: []
|
custom: []
|
||||||
name: status_id
|
name: active
|
||||||
description: 'Filter by status ID.'
|
description: 'Filter by active status.'
|
||||||
required: false
|
required: false
|
||||||
example: 1
|
example: true
|
||||||
type: integer
|
type: boolean
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Filter by type ID.'
|
|
||||||
required: false
|
|
||||||
example: 2
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
cleanQueryParameters:
|
cleanQueryParameters:
|
||||||
status_id: 1
|
active: true
|
||||||
type_id: 2
|
|
||||||
bodyParameters: []
|
bodyParameters: []
|
||||||
cleanBodyParameters: []
|
cleanBodyParameters: []
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
@@ -155,12 +51,13 @@ endpoints:
|
|||||||
"data": [
|
"data": [
|
||||||
{
|
{
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 2, "name": "Support"},
|
"name": "Backend Developer"
|
||||||
"approved_estimate": "120.00",
|
},
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60, "2024-04": 20},
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
"created_at": "2024-01-15T10:00:00.000000Z",
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
"updated_at": "2024-01-15T10:00:00.000000Z"
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
@@ -177,17 +74,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- POST
|
- POST
|
||||||
uri: api/projects
|
uri: api/team-members
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Create a new project'
|
title: 'Create a new team member'
|
||||||
description: 'Create a new project with code, title, and type.'
|
description: 'Create a new team member with name, role, and hourly rate.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -198,32 +95,21 @@ endpoints:
|
|||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
code:
|
name:
|
||||||
custom: []
|
custom: []
|
||||||
name: code
|
name: name
|
||||||
description: 'Project code (must be unique).'
|
description: 'Team member name.'
|
||||||
required: true
|
required: true
|
||||||
example: PROJ-001
|
example: 'John Doe'
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
title:
|
role_id:
|
||||||
custom: []
|
custom: []
|
||||||
name: title
|
name: role_id
|
||||||
description: 'Project title.'
|
description: 'Role ID.'
|
||||||
required: true
|
|
||||||
example: 'Client Dashboard Redesign'
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Project type ID.'
|
|
||||||
required: true
|
required: true
|
||||||
example: 1
|
example: 1
|
||||||
type: integer
|
type: integer
|
||||||
@@ -231,10 +117,33 @@ endpoints:
|
|||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
hourly_rate:
|
||||||
|
custom: []
|
||||||
|
name: hourly_rate
|
||||||
|
description: 'Hourly rate (must be > 0).'
|
||||||
|
required: true
|
||||||
|
example: '150.00'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
active:
|
||||||
|
custom: []
|
||||||
|
name: active
|
||||||
|
description: 'Active status (defaults to true).'
|
||||||
|
required: false
|
||||||
|
example: true
|
||||||
|
type: boolean
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
code: PROJ-001
|
name: 'John Doe'
|
||||||
title: 'Client Dashboard Redesign'
|
role_id: 1
|
||||||
type_id: 1
|
hourly_rate: '150.00'
|
||||||
|
active: true
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
@@ -244,10 +153,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 1, "name": "Project"}
|
"name": "Backend Developer"
|
||||||
|
},
|
||||||
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -255,7 +169,7 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Validation failed","errors":{"code":["Project code must be unique"],"title":["The title field is required."]}}'
|
content: '{"message":"Validation failed","errors":{"name":["The name field is required."],"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -267,17 +181,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- GET
|
- GET
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Get a single project'
|
title: 'Get a single team member'
|
||||||
description: 'Get details of a specific project by ID.'
|
description: 'Get details of a specific team member by ID.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -287,7 +201,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -310,12 +224,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-001",
|
"name": "John Doe",
|
||||||
"title": "Client Dashboard Redesign",
|
"role": {
|
||||||
"status": {"id": 1, "name": "Pre-sales"},
|
"id": 1,
|
||||||
"type": {"id": 1, "name": "Project"},
|
"name": "Backend Developer"
|
||||||
"approved_estimate": "120.00",
|
},
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60}
|
"hourly_rate": "150.00",
|
||||||
|
"active": true,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -323,7 +240,7 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -336,17 +253,17 @@ endpoints:
|
|||||||
httpMethods:
|
httpMethods:
|
||||||
- PUT
|
- PUT
|
||||||
- PATCH
|
- PATCH
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Update a project'
|
title: 'Update a team member'
|
||||||
description: 'Update details of an existing project.'
|
description: 'Update details of an existing team member.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -356,7 +273,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -369,43 +286,55 @@ endpoints:
|
|||||||
queryParameters: []
|
queryParameters: []
|
||||||
cleanQueryParameters: []
|
cleanQueryParameters: []
|
||||||
bodyParameters:
|
bodyParameters:
|
||||||
code:
|
name:
|
||||||
custom: []
|
custom: []
|
||||||
name: code
|
name: name
|
||||||
description: 'Project code (must be unique).'
|
description: 'Team member name.'
|
||||||
required: false
|
required: false
|
||||||
example: PROJ-002
|
example: 'John Doe'
|
||||||
type: string
|
type: string
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
title:
|
role_id:
|
||||||
custom: []
|
custom: []
|
||||||
name: title
|
name: role_id
|
||||||
description: 'Project title.'
|
description: 'Role ID.'
|
||||||
required: false
|
required: false
|
||||||
example: 'Updated Title'
|
example: 1
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
type_id:
|
|
||||||
custom: []
|
|
||||||
name: type_id
|
|
||||||
description: 'Project type ID.'
|
|
||||||
required: false
|
|
||||||
example: 2
|
|
||||||
type: integer
|
type: integer
|
||||||
enumValues: []
|
enumValues: []
|
||||||
exampleWasSpecified: true
|
exampleWasSpecified: true
|
||||||
nullable: false
|
nullable: false
|
||||||
deprecated: false
|
deprecated: false
|
||||||
|
hourly_rate:
|
||||||
|
custom: []
|
||||||
|
name: hourly_rate
|
||||||
|
description: 'Hourly rate (must be > 0).'
|
||||||
|
required: false
|
||||||
|
example: '175.00'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
active:
|
||||||
|
custom: []
|
||||||
|
name: active
|
||||||
|
description: 'Active status.'
|
||||||
|
required: false
|
||||||
|
example: false
|
||||||
|
type: boolean
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
cleanBodyParameters:
|
cleanBodyParameters:
|
||||||
code: PROJ-002
|
name: 'John Doe'
|
||||||
title: 'Updated Title'
|
role_id: 1
|
||||||
type_id: 2
|
hourly_rate: '175.00'
|
||||||
|
active: false
|
||||||
fileParameters: []
|
fileParameters: []
|
||||||
responses:
|
responses:
|
||||||
-
|
-
|
||||||
@@ -415,9 +344,15 @@ endpoints:
|
|||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
"code": "PROJ-002",
|
"name": "John Doe",
|
||||||
"title": "Updated Title",
|
"role": {
|
||||||
"type": {"id": 2, "name": "Support"}
|
"id": 1,
|
||||||
|
"name": "Backend Developer"
|
||||||
|
},
|
||||||
|
"hourly_rate": "175.00",
|
||||||
|
"active": false,
|
||||||
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
||||||
|
"updated_at": "2024-01-15T11:00:00.000000Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headers: []
|
headers: []
|
||||||
@@ -425,13 +360,13 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Validation failed","errors":{"type_id":["The selected type id is invalid."]}}'
|
content: '{"message":"Validation failed","errors":{"hourly_rate":["Hourly rate must be greater than 0"]}}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
@@ -443,17 +378,17 @@ endpoints:
|
|||||||
custom: []
|
custom: []
|
||||||
httpMethods:
|
httpMethods:
|
||||||
- DELETE
|
- DELETE
|
||||||
uri: 'api/projects/{id}'
|
uri: 'api/team-members/{id}'
|
||||||
metadata:
|
metadata:
|
||||||
custom: []
|
custom: []
|
||||||
groupName: Projects
|
groupName: 'Team Members'
|
||||||
groupDescription: |-
|
groupDescription: |-
|
||||||
|
|
||||||
Endpoints for managing projects.
|
Endpoints for managing team members.
|
||||||
subgroup: ''
|
subgroup: ''
|
||||||
subgroupDescription: ''
|
subgroupDescription: ''
|
||||||
title: 'Delete a project'
|
title: 'Delete a team member'
|
||||||
description: 'Delete a project. Cannot delete if project has allocations or actuals.'
|
description: 'Delete a team member. Cannot delete if member has allocations or actuals.'
|
||||||
authenticated: true
|
authenticated: true
|
||||||
deprecated: false
|
deprecated: false
|
||||||
headers:
|
headers:
|
||||||
@@ -463,7 +398,7 @@ endpoints:
|
|||||||
id:
|
id:
|
||||||
custom: []
|
custom: []
|
||||||
name: id
|
name: id
|
||||||
description: 'Project UUID.'
|
description: 'Team member UUID.'
|
||||||
required: true
|
required: true
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
type: string
|
type: string
|
||||||
@@ -482,302 +417,25 @@ endpoints:
|
|||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 200
|
status: 200
|
||||||
content: '{"message":"Project deleted successfully"}'
|
content: '{"message":"Team member deleted successfully"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 404
|
status: 404
|
||||||
content: '{"message":"Project not found"}'
|
content: '{"message":"Team member not found"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
-
|
-
|
||||||
custom: []
|
custom: []
|
||||||
status: 422
|
status: 422
|
||||||
content: '{"message":"Cannot delete project with allocations"}'
|
content: '{"message":"Cannot delete team member with active allocations","suggestion":"Consider deactivating the team member instead"}'
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
-
|
||||||
auth: []
|
custom: []
|
||||||
controller: null
|
status: 422
|
||||||
method: null
|
content: '{"message":"Cannot delete team member with historical data","suggestion":"Consider deactivating the team member instead"}'
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/status'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Transition project status'
|
|
||||||
description: 'Transition project to a new status following the state machine rules.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
status_id:
|
|
||||||
custom: []
|
|
||||||
name: status_id
|
|
||||||
description: 'Target status ID.'
|
|
||||||
required: true
|
|
||||||
example: 2
|
|
||||||
type: integer
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
status_id: 2
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"status": {"id": 2, "name": "SOW Approval"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Cannot transition from Pre-sales to Done"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/estimate'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Set approved estimate'
|
|
||||||
description: 'Set the approved billable hours estimate for a project.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
approved_estimate:
|
|
||||||
custom: []
|
|
||||||
name: approved_estimate
|
|
||||||
description: 'Approved estimate hours (must be > 0).'
|
|
||||||
required: true
|
|
||||||
example: 120.0
|
|
||||||
type: number
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
approved_estimate: 120.0
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"approved_estimate": "120.00"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Approved estimate must be greater than 0"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
responseFields: []
|
|
||||||
auth: []
|
|
||||||
controller: null
|
|
||||||
method: null
|
|
||||||
route: null
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
httpMethods:
|
|
||||||
- PUT
|
|
||||||
uri: 'api/projects/{project}/forecast'
|
|
||||||
metadata:
|
|
||||||
custom: []
|
|
||||||
groupName: Projects
|
|
||||||
groupDescription: |-
|
|
||||||
|
|
||||||
Endpoints for managing projects.
|
|
||||||
subgroup: ''
|
|
||||||
subgroupDescription: ''
|
|
||||||
title: 'Set forecasted effort'
|
|
||||||
description: 'Set the month-by-month forecasted effort breakdown.'
|
|
||||||
authenticated: true
|
|
||||||
deprecated: false
|
|
||||||
headers:
|
|
||||||
Content-Type: application/json
|
|
||||||
Accept: application/json
|
|
||||||
urlParameters:
|
|
||||||
project:
|
|
||||||
custom: []
|
|
||||||
name: project
|
|
||||||
description: 'The project.'
|
|
||||||
required: true
|
|
||||||
example: architecto
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: false
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
id:
|
|
||||||
custom: []
|
|
||||||
name: id
|
|
||||||
description: 'Project UUID.'
|
|
||||||
required: true
|
|
||||||
example: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
type: string
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanUrlParameters:
|
|
||||||
project: architecto
|
|
||||||
id: 550e8400-e29b-41d4-a716-446655440000
|
|
||||||
queryParameters: []
|
|
||||||
cleanQueryParameters: []
|
|
||||||
bodyParameters:
|
|
||||||
forecasted_effort:
|
|
||||||
custom: []
|
|
||||||
name: forecasted_effort
|
|
||||||
description: 'Monthly effort breakdown.'
|
|
||||||
required: true
|
|
||||||
example:
|
|
||||||
2024-02: 40
|
|
||||||
2024-03: 60
|
|
||||||
type: object
|
|
||||||
enumValues: []
|
|
||||||
exampleWasSpecified: true
|
|
||||||
nullable: false
|
|
||||||
deprecated: false
|
|
||||||
cleanBodyParameters:
|
|
||||||
forecasted_effort:
|
|
||||||
2024-02: 40
|
|
||||||
2024-03: 60
|
|
||||||
fileParameters: []
|
|
||||||
responses:
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 200
|
|
||||||
content: |-
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
"forecasted_effort": {"2024-02": 40, "2024-03": 60}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 404
|
|
||||||
content: '{"message":"Project not found"}'
|
|
||||||
headers: []
|
|
||||||
description: ''
|
|
||||||
-
|
|
||||||
custom: []
|
|
||||||
status: 422
|
|
||||||
content: '{"message":"Forecasted effort exceeds approved estimate by more than 5%"}'
|
|
||||||
headers: []
|
headers: []
|
||||||
description: ''
|
description: ''
|
||||||
responseFields: []
|
responseFields: []
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
895
backend/.scribe/endpoints/04.yaml
Normal file
895
backend/.scribe/endpoints/04.yaml
Normal file
@@ -0,0 +1,895 @@
|
|||||||
|
name: 'Capacity Planning'
|
||||||
|
description: ''
|
||||||
|
endpoints:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Individual Capacity'
|
||||||
|
description: 'Calculate capacity for a specific team member in a given month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
team_member_id: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"month": "2026-02",
|
||||||
|
"working_days": 20,
|
||||||
|
"person_days": 18.5,
|
||||||
|
"hours": 148,
|
||||||
|
"details": [
|
||||||
|
{
|
||||||
|
"date": "2026-02-02",
|
||||||
|
"availability": 1,
|
||||||
|
"is_pto": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity/team
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Team Capacity'
|
||||||
|
description: 'Summarize the combined capacity for all active team members in a month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"month": "2026-02",
|
||||||
|
"total_person_days": 180.5,
|
||||||
|
"total_hours": 1444,
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"name": "Ada Lovelace",
|
||||||
|
"person_days": 18.5,
|
||||||
|
"hours": 148
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/capacity/revenue
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get Possible Revenue'
|
||||||
|
description: 'Estimate monthly revenue based on capacity hours and hourly rates.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"month": "2026-02",
|
||||||
|
"possible_revenue": 21500.25,
|
||||||
|
"member_revenues": [
|
||||||
|
{
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"team_member_name": "Ada Lovelace",
|
||||||
|
"hours": 148,
|
||||||
|
"hourly_rate": 150.0,
|
||||||
|
"revenue": 22200.0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/capacity/availability
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Save Team Member Availability'
|
||||||
|
description: 'Persist a daily availability override and refresh cached capacity totals.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
date:
|
||||||
|
custom: []
|
||||||
|
name: date
|
||||||
|
description: 'The date for the availability override (YYYY-MM-DD).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
availability:
|
||||||
|
custom: []
|
||||||
|
name: availability
|
||||||
|
description: 'The availability value (0, 0.5, 1.0).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: architecto
|
||||||
|
date: architecto
|
||||||
|
availability: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-03",
|
||||||
|
"availability": 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/capacity/availability/batch
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Batch Update Team Member Availability'
|
||||||
|
description: 'Persist multiple daily availability overrides in a single batch operation.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'The month in YYYY-MM format.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
updates:
|
||||||
|
custom: []
|
||||||
|
name: updates
|
||||||
|
description: 'Array of availability updates.'
|
||||||
|
required: true
|
||||||
|
example:
|
||||||
|
- architecto
|
||||||
|
type: 'string[]'
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].team_member_id':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].team_member_id'
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].date':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].date'
|
||||||
|
description: 'The date (YYYY-MM-DD).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'updates[].availability':
|
||||||
|
custom: []
|
||||||
|
name: 'updates[].availability'
|
||||||
|
description: 'The availability value (0, 0.5, 1).'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
updates:
|
||||||
|
- architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"saved": 12,
|
||||||
|
"month": "2026-02"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/holidays
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List Holidays'
|
||||||
|
description: 'Retrieve holidays for a specific month or all holidays when no month is provided.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'nullable The month in YYYY-MM format.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-14",
|
||||||
|
"name": "Company Holiday",
|
||||||
|
"description": "Office closed"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/holidays
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Create Holiday'
|
||||||
|
description: 'Add a holiday and clear cached capacity data for the related month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
date:
|
||||||
|
custom: []
|
||||||
|
name: date
|
||||||
|
description: 'Date of the holiday.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-14'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
name:
|
||||||
|
custom: []
|
||||||
|
name: name
|
||||||
|
description: 'Name of the holiday.'
|
||||||
|
required: true
|
||||||
|
example: "Presidents' Day"
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
description:
|
||||||
|
custom: []
|
||||||
|
name: description
|
||||||
|
description: 'nullable Optional description of the holiday.'
|
||||||
|
required: false
|
||||||
|
example: 'Eius et animi quos velit et.'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
date: '2026-02-14'
|
||||||
|
name: "Presidents' Day"
|
||||||
|
description: 'Eius et animi quos velit et.'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"date": "2026-02-14",
|
||||||
|
"name": "Presidents' Day",
|
||||||
|
"description": "Office closed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"A holiday already exists for this date.","errors":{"date":["A holiday already exists for this date."]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- DELETE
|
||||||
|
uri: 'api/holidays/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Delete Holiday'
|
||||||
|
description: 'Remove a holiday and clear affected capacity caches.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'The holiday UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"message": "Holiday deleted"
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/ptos
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List PTO Requests'
|
||||||
|
description: 'Fetch PTO requests for a team member, optionally constrained to a month.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'nullable The month in YYYY-MM format.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
month: 2026-02
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: architecto
|
||||||
|
month: 2026-02
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"start_date": "2026-02-10",
|
||||||
|
"end_date": "2026-02-12",
|
||||||
|
"status": "pending",
|
||||||
|
"reason": "Family travel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/ptos
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Request PTO'
|
||||||
|
description: 'Create a PTO request for a team member and approve it immediately.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'The team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
start_date:
|
||||||
|
custom: []
|
||||||
|
name: start_date
|
||||||
|
description: 'The first day of the PTO.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-10'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
end_date:
|
||||||
|
custom: []
|
||||||
|
name: end_date
|
||||||
|
description: 'The final day of the PTO.'
|
||||||
|
required: true
|
||||||
|
example: '2026-02-12'
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
reason:
|
||||||
|
custom: []
|
||||||
|
name: reason
|
||||||
|
description: 'nullable Optional reason for the PTO.'
|
||||||
|
required: false
|
||||||
|
example: architecto
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
start_date: '2026-02-10'
|
||||||
|
end_date: '2026-02-12'
|
||||||
|
reason: architecto
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"start_date": "2026-02-10",
|
||||||
|
"end_date": "2026-02-12",
|
||||||
|
"status": "approved",
|
||||||
|
"reason": "Family travel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- PUT
|
||||||
|
uri: 'api/ptos/{id}/approve'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Capacity Planning'
|
||||||
|
groupDescription: ''
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Approve PTO'
|
||||||
|
description: 'Approve a pending PTO request and refresh the affected capacity caches.'
|
||||||
|
authenticated: false
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'The PTO UUID that needs approval.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"status": "approved"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
493
backend/.scribe/endpoints/05.yaml
Normal file
493
backend/.scribe/endpoints/05.yaml
Normal file
@@ -0,0 +1,493 @@
|
|||||||
|
name: 'Resource Allocation'
|
||||||
|
description: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
endpoints:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: api/allocations
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'List allocations / Get allocation matrix'
|
||||||
|
description: 'Get all allocations, optionally filtered by month.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters:
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Filter by month (YYYY-MM format).'
|
||||||
|
required: false
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanQueryParameters:
|
||||||
|
month: 2026-02
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/allocations
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Create a new allocation'
|
||||||
|
description: 'Allocate hours for a team member to a project for a specific month.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
project_id:
|
||||||
|
custom: []
|
||||||
|
name: project_id
|
||||||
|
description: 'Project UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
team_member_id:
|
||||||
|
custom: []
|
||||||
|
name: team_member_id
|
||||||
|
description: 'Team member UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440002
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: true
|
||||||
|
deprecated: false
|
||||||
|
month:
|
||||||
|
custom: []
|
||||||
|
name: month
|
||||||
|
description: 'Month (YYYY-MM format).'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
allocated_hours:
|
||||||
|
custom: []
|
||||||
|
name: allocated_hours
|
||||||
|
description: 'Hours to allocate (must be >= 0).'
|
||||||
|
required: true
|
||||||
|
example: '40'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
project_id: 550e8400-e29b-41d4-a716-446655440001
|
||||||
|
team_member_id: 550e8400-e29b-41d4-a716-446655440002
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: '40'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"Validation failed","errors":{"allocated_hours":["Allocated hours must be greater than or equal to 0"]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- GET
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Get a single allocation'
|
||||||
|
description: 'Get details of a specific allocation by ID.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- PUT
|
||||||
|
- PATCH
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Update an allocation'
|
||||||
|
description: "Update an existing allocation's hours."
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
allocated_hours:
|
||||||
|
custom: []
|
||||||
|
name: allocated_hours
|
||||||
|
description: 'Hours to allocate (must be >= 0).'
|
||||||
|
required: true
|
||||||
|
example: '60'
|
||||||
|
type: numeric
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
allocated_hours: '60'
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 60.00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 422
|
||||||
|
content: '{"message":"Validation failed","errors":{"allocated_hours":["Allocated hours must be greater than or equal to 0"]}}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- DELETE
|
||||||
|
uri: 'api/allocations/{id}'
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Delete an allocation'
|
||||||
|
description: 'Remove an allocation.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters:
|
||||||
|
id:
|
||||||
|
custom: []
|
||||||
|
name: id
|
||||||
|
description: 'Allocation UUID.'
|
||||||
|
required: true
|
||||||
|
example: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanUrlParameters:
|
||||||
|
id: 550e8400-e29b-41d4-a716-446655440000
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters: []
|
||||||
|
cleanBodyParameters: []
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 200
|
||||||
|
content: '{"message": "Allocation deleted successfully"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 404
|
||||||
|
content: '{"message": "Allocation not found"}'
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
httpMethods:
|
||||||
|
- POST
|
||||||
|
uri: api/allocations/bulk
|
||||||
|
metadata:
|
||||||
|
custom: []
|
||||||
|
groupName: 'Resource Allocation'
|
||||||
|
groupDescription: |-
|
||||||
|
|
||||||
|
Endpoints for managing resource allocations.
|
||||||
|
subgroup: ''
|
||||||
|
subgroupDescription: ''
|
||||||
|
title: 'Bulk create allocations'
|
||||||
|
description: 'Create or update multiple allocations in a single request.'
|
||||||
|
authenticated: true
|
||||||
|
deprecated: false
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Accept: application/json
|
||||||
|
urlParameters: []
|
||||||
|
cleanUrlParameters: []
|
||||||
|
queryParameters: []
|
||||||
|
cleanQueryParameters: []
|
||||||
|
bodyParameters:
|
||||||
|
allocations:
|
||||||
|
custom: []
|
||||||
|
name: allocations
|
||||||
|
description: 'Array of allocations.'
|
||||||
|
required: true
|
||||||
|
example:
|
||||||
|
-
|
||||||
|
project_id: ...
|
||||||
|
team_member_id: ...
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: 40
|
||||||
|
type: 'string[]'
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: true
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].project_id':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].project_id'
|
||||||
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the projects table.'
|
||||||
|
required: true
|
||||||
|
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].team_member_id':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].team_member_id'
|
||||||
|
description: 'Must be a valid UUID. The <code>id</code> of an existing record in the team_members table.'
|
||||||
|
required: true
|
||||||
|
example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].month':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].month'
|
||||||
|
description: 'Must be a valid date in the format <code>Y-m</code>.'
|
||||||
|
required: true
|
||||||
|
example: 2026-02
|
||||||
|
type: string
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
'allocations[].allocated_hours':
|
||||||
|
custom: []
|
||||||
|
name: 'allocations[].allocated_hours'
|
||||||
|
description: 'Must be at least 0.'
|
||||||
|
required: true
|
||||||
|
example: 77
|
||||||
|
type: number
|
||||||
|
enumValues: []
|
||||||
|
exampleWasSpecified: false
|
||||||
|
nullable: false
|
||||||
|
deprecated: false
|
||||||
|
cleanBodyParameters:
|
||||||
|
allocations:
|
||||||
|
-
|
||||||
|
project_id: ...
|
||||||
|
team_member_id: ...
|
||||||
|
month: 2026-02
|
||||||
|
allocated_hours: 40
|
||||||
|
fileParameters: []
|
||||||
|
responses:
|
||||||
|
-
|
||||||
|
custom: []
|
||||||
|
status: 201
|
||||||
|
content: |-
|
||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
||||||
|
"project_id": "550e8400-e29b-41d4-a716-446655440001",
|
||||||
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440002",
|
||||||
|
"month": "2026-02",
|
||||||
|
"allocated_hours": 40.00
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
headers: []
|
||||||
|
description: ''
|
||||||
|
responseFields: []
|
||||||
|
auth: []
|
||||||
|
controller: null
|
||||||
|
method: null
|
||||||
|
route: null
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user