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:
2026-03-08 18:23:11 -04:00
parent dd8055f6b7
commit b9775f2f5a
12 changed files with 6446 additions and 2590 deletions

View File

@@ -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"
}

View File

@@ -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.'
authenticated: true
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: '' description: ''
responseFields: [] authenticated: false
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

View File

@@ -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

View 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

View 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

View File

@@ -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.'
authenticated: true
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: '' description: ''
responseFields: [] authenticated: false
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

View File

@@ -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

View 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

View 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