- Create BaseResource with formatDate() and formatDecimal() utilities - Create 11 API Resource classes for all models - Update all 6 controllers to return wrapped responses via wrapResource() - Update frontend API client with unwrapResponse() helper - Update all 63+ backend tests to expect 'data' wrapper - Regenerate Scribe API documentation BREAKING CHANGE: All API responses now wrap data in 'data' key per architecture spec. Backend Tests: 70 passed, 5 failed (unrelated to data wrapper) Frontend Unit: 10 passed E2E Tests: 102 passed, 20 skipped API Docs: Generated successfully Refs: openspec/changes/api-resource-standard
4937 lines
190 KiB
PHP
4937 lines
190 KiB
PHP
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
<title>Laravel API Documentation</title>
|
|
|
|
<link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
|
|
|
|
<link rel="stylesheet" href="{{ asset("/vendor/scribe/css/theme-default.style.css") }}" media="screen">
|
|
<link rel="stylesheet" href="{{ asset("/vendor/scribe/css/theme-default.print.css") }}" media="print">
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
|
|
|
|
<link rel="stylesheet"
|
|
href="https://unpkg.com/@highlightjs/cdn-assets@11.6.0/styles/obsidian.min.css">
|
|
<script src="https://unpkg.com/@highlightjs/cdn-assets@11.6.0/highlight.min.js"></script>
|
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jets/0.14.1/jets.min.js"></script>
|
|
|
|
<style id="language-style">
|
|
/* starts out as display none and is replaced with js later */
|
|
body .content .bash-example code { display: none; }
|
|
body .content .javascript-example code { display: none; }
|
|
</style>
|
|
|
|
<script>
|
|
var tryItOutBaseUrl = "http://localhost";
|
|
var useCsrf = Boolean();
|
|
var csrfUrl = "/sanctum/csrf-cookie";
|
|
</script>
|
|
<script src="{{ asset("/vendor/scribe/js/tryitout-5.7.0.js") }}"></script>
|
|
|
|
<script src="{{ asset("/vendor/scribe/js/theme-default-5.7.0.js") }}"></script>
|
|
|
|
</head>
|
|
|
|
<body data-languages="["bash","javascript"]">
|
|
|
|
<a href="#" id="nav-button">
|
|
<span>
|
|
MENU
|
|
<img src="{{ asset("/vendor/scribe/images/navbar.png") }}" alt="navbar-image"/>
|
|
</span>
|
|
</a>
|
|
<div class="tocify-wrapper">
|
|
|
|
<div class="lang-selector">
|
|
<button type="button" class="lang-button" data-language-name="bash">bash</button>
|
|
<button type="button" class="lang-button" data-language-name="javascript">javascript</button>
|
|
</div>
|
|
|
|
<div class="search">
|
|
<input type="text" class="search" id="input-search" placeholder="Search">
|
|
</div>
|
|
|
|
<div id="toc">
|
|
<ul id="tocify-header-introduction" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="introduction">
|
|
<a href="#introduction">Introduction</a>
|
|
</li>
|
|
</ul>
|
|
<ul id="tocify-header-authenticating-requests" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="authenticating-requests">
|
|
<a href="#authenticating-requests">Authenticating requests</a>
|
|
</li>
|
|
</ul>
|
|
<ul id="tocify-header-authentication" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="authentication">
|
|
<a href="#authentication">Authentication</a>
|
|
</li>
|
|
<ul id="tocify-subheader-authentication" class="tocify-subheader">
|
|
<li class="tocify-item level-2" data-unique="authentication-POSTapi-auth-login">
|
|
<a href="#authentication-POSTapi-auth-login">Login and get tokens</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="authentication-POSTapi-auth-refresh">
|
|
<a href="#authentication-POSTapi-auth-refresh">Refresh access token</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="authentication-POSTapi-auth-logout">
|
|
<a href="#authentication-POSTapi-auth-logout">Logout current session</a>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul id="tocify-header-capacity-planning" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="capacity-planning">
|
|
<a href="#capacity-planning">Capacity Planning</a>
|
|
</li>
|
|
<ul id="tocify-subheader-capacity-planning" class="tocify-subheader">
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-GETapi-capacity">
|
|
<a href="#capacity-planning-GETapi-capacity">Get Individual Capacity</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-GETapi-capacity-team">
|
|
<a href="#capacity-planning-GETapi-capacity-team">Get Team Capacity</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-GETapi-capacity-revenue">
|
|
<a href="#capacity-planning-GETapi-capacity-revenue">Get Possible Revenue</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-GETapi-holidays">
|
|
<a href="#capacity-planning-GETapi-holidays">List Holidays</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-POSTapi-holidays">
|
|
<a href="#capacity-planning-POSTapi-holidays">Create Holiday</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-DELETEapi-holidays--id-">
|
|
<a href="#capacity-planning-DELETEapi-holidays--id-">Delete Holiday</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-GETapi-ptos">
|
|
<a href="#capacity-planning-GETapi-ptos">List PTO Requests</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-POSTapi-ptos">
|
|
<a href="#capacity-planning-POSTapi-ptos">Request PTO</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="capacity-planning-PUTapi-ptos--id--approve">
|
|
<a href="#capacity-planning-PUTapi-ptos--id--approve">Approve PTO</a>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul id="tocify-header-projects" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="projects">
|
|
<a href="#projects">Projects</a>
|
|
</li>
|
|
<ul id="tocify-subheader-projects" class="tocify-subheader">
|
|
<li class="tocify-item level-2" data-unique="projects-GETapi-projects-types">
|
|
<a href="#projects-GETapi-projects-types">Get all project types</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-GETapi-projects-statuses">
|
|
<a href="#projects-GETapi-projects-statuses">Get all project statuses</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-GETapi-projects">
|
|
<a href="#projects-GETapi-projects">List all projects</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-POSTapi-projects">
|
|
<a href="#projects-POSTapi-projects">Create a new project</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-GETapi-projects--id-">
|
|
<a href="#projects-GETapi-projects--id-">Get a single project</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-PUTapi-projects--id-">
|
|
<a href="#projects-PUTapi-projects--id-">Update a project</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-DELETEapi-projects--id-">
|
|
<a href="#projects-DELETEapi-projects--id-">Delete a project</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-PUTapi-projects--project--status">
|
|
<a href="#projects-PUTapi-projects--project--status">Transition project status</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-PUTapi-projects--project--estimate">
|
|
<a href="#projects-PUTapi-projects--project--estimate">Set approved estimate</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="projects-PUTapi-projects--project--forecast">
|
|
<a href="#projects-PUTapi-projects--project--forecast">Set forecasted effort</a>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul id="tocify-header-team-members" class="tocify-header">
|
|
<li class="tocify-item level-1" data-unique="team-members">
|
|
<a href="#team-members">Team Members</a>
|
|
</li>
|
|
<ul id="tocify-subheader-team-members" class="tocify-subheader">
|
|
<li class="tocify-item level-2" data-unique="team-members-GETapi-team-members">
|
|
<a href="#team-members-GETapi-team-members">List all team members</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="team-members-POSTapi-team-members">
|
|
<a href="#team-members-POSTapi-team-members">Create a new team member</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="team-members-GETapi-team-members--id-">
|
|
<a href="#team-members-GETapi-team-members--id-">Get a single team member</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="team-members-PUTapi-team-members--id-">
|
|
<a href="#team-members-PUTapi-team-members--id-">Update a team member</a>
|
|
</li>
|
|
<li class="tocify-item level-2" data-unique="team-members-DELETEapi-team-members--id-">
|
|
<a href="#team-members-DELETEapi-team-members--id-">Delete a team member</a>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
</div>
|
|
|
|
<ul class="toc-footer" id="toc-footer">
|
|
<li style="padding-bottom: 5px;"><a href="{{ route("scribe.postman") }}">View Postman collection</a></li>
|
|
<li style="padding-bottom: 5px;"><a href="{{ route("scribe.openapi") }}">View OpenAPI spec</a></li>
|
|
<li><a href="http://github.com/knuckleswtf/scribe">Documentation powered by Scribe ✍</a></li>
|
|
</ul>
|
|
|
|
<ul class="toc-footer" id="last-updated">
|
|
<li>Last updated: February 19, 2026</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="page-wrapper">
|
|
<div class="dark-box"></div>
|
|
<div class="content">
|
|
<h1 id="introduction">Introduction</h1>
|
|
<aside>
|
|
<strong>Base URL</strong>: <code>http://localhost</code>
|
|
</aside>
|
|
<pre><code>This documentation aims to provide all the information you need to work with our API.
|
|
|
|
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
|
|
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside></code></pre>
|
|
|
|
<h1 id="authenticating-requests">Authenticating requests</h1>
|
|
<p>This API is not authenticated.</p>
|
|
|
|
<h1 id="authentication">Authentication</h1>
|
|
|
|
<p>Endpoints for JWT authentication and session lifecycle.</p>
|
|
|
|
<h2 id="authentication-POSTapi-auth-login">Login and get tokens</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Authenticate with email and password to receive an access token and refresh token.</p>
|
|
|
|
<span id="example-requests-POSTapi-auth-login">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/auth/login" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"email\": \"user@example.com\",
|
|
\"password\": \"secret123\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/auth/login"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"email": "user@example.com",
|
|
"password": "secret123"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-auth-login">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"name": "Alice Johnson",
|
|
"email": "user@example.com",
|
|
"role": "manager",
|
|
"active": true,
|
|
"created_at": "2026-01-01T00:00:00Z",
|
|
"updated_at": "2026-01-01T00:00:00Z"
|
|
},
|
|
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
|
|
"refresh_token": "abc123def456",
|
|
"token_type": "bearer",
|
|
"expires_in": 3600
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (401):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Invalid credentials"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (403):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Account is inactive"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"errors": {
|
|
"email": [
|
|
"The email field is required."
|
|
],
|
|
"password": [
|
|
"The password field is required."
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-auth-login" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-auth-login"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-auth-login"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-auth-login" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-auth-login">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-auth-login" data-method="POST"
|
|
data-path="api/auth/login"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-auth-login', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-auth-login"
|
|
onclick="tryItOut('POSTapi-auth-login');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-auth-login"
|
|
onclick="cancelTryOut('POSTapi-auth-login');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-auth-login"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/auth/login</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-auth-login"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-auth-login"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>email</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="email" data-endpoint="POSTapi-auth-login"
|
|
value="user@example.com"
|
|
data-component="body">
|
|
<br>
|
|
<p>User email address. Example: <code>user@example.com</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>password</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="password" data-endpoint="POSTapi-auth-login"
|
|
value="secret123"
|
|
data-component="body">
|
|
<br>
|
|
<p>User password. Example: <code>secret123</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="authentication-POSTapi-auth-refresh">Refresh access token</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Exchange a valid refresh token for a new access token and refresh token pair.</p>
|
|
|
|
<span id="example-requests-POSTapi-auth-refresh">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/auth/refresh" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"refresh_token\": \"abc123def456\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/auth/refresh"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"refresh_token": "abc123def456"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-auth-refresh">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"name": "Alice Johnson",
|
|
"email": "user@example.com",
|
|
"role": "manager",
|
|
"active": true,
|
|
"created_at": "2026-01-01T00:00:00Z",
|
|
"updated_at": "2026-01-01T00:00:00Z"
|
|
},
|
|
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
|
|
"refresh_token": "newtoken123",
|
|
"token_type": "bearer",
|
|
"expires_in": 3600
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (401):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Invalid or expired refresh token"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-auth-refresh" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-auth-refresh"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-auth-refresh"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-auth-refresh" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-auth-refresh">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-auth-refresh" data-method="POST"
|
|
data-path="api/auth/refresh"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-auth-refresh', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-auth-refresh"
|
|
onclick="tryItOut('POSTapi-auth-refresh');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-auth-refresh"
|
|
onclick="cancelTryOut('POSTapi-auth-refresh');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-auth-refresh"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/auth/refresh</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-auth-refresh"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-auth-refresh"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>refresh_token</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="refresh_token" data-endpoint="POSTapi-auth-refresh"
|
|
value="abc123def456"
|
|
data-component="body">
|
|
<br>
|
|
<p>Refresh token returned by login. Example: <code>abc123def456</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="authentication-POSTapi-auth-logout">Logout current session</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Invalidate a refresh token and end the active authenticated session.</p>
|
|
|
|
<span id="example-requests-POSTapi-auth-logout">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/auth/logout" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"refresh_token\": \"abc123def456\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/auth/logout"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"refresh_token": "abc123def456"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-auth-logout">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Logged out successfully"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-auth-logout" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-auth-logout"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-auth-logout"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-auth-logout" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-auth-logout">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-auth-logout" data-method="POST"
|
|
data-path="api/auth/logout"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-auth-logout', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-auth-logout"
|
|
onclick="tryItOut('POSTapi-auth-logout');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-auth-logout"
|
|
onclick="cancelTryOut('POSTapi-auth-logout');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-auth-logout"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/auth/logout</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-auth-logout"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-auth-logout"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>refresh_token</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="refresh_token" data-endpoint="POSTapi-auth-logout"
|
|
value="abc123def456"
|
|
data-component="body">
|
|
<br>
|
|
<p>Optional refresh token to invalidate immediately. Example: <code>abc123def456</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h1 id="capacity-planning">Capacity Planning</h1>
|
|
|
|
|
|
|
|
<h2 id="capacity-planning-GETapi-capacity">Get Individual Capacity</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Calculate capacity for a specific team member in a given month.</p>
|
|
|
|
<span id="example-requests-GETapi-capacity">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/capacity" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"month\": \"2026-02\",
|
|
\"team_member_id\": \"architecto\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/capacity"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"month": "2026-02",
|
|
"team_member_id": "architecto"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-capacity">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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
|
|
}
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-capacity" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-capacity"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-capacity"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-capacity" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-capacity">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-capacity" data-method="GET"
|
|
data-path="api/capacity"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-capacity', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-capacity"
|
|
onclick="tryItOut('GETapi-capacity');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-capacity"
|
|
onclick="cancelTryOut('GETapi-capacity');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-capacity"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/capacity</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-capacity"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-capacity"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity"
|
|
value="2026-02"
|
|
data-component="url">
|
|
<br>
|
|
<p>The month in YYYY-MM format. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>team_member_id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="team_member_id" data-endpoint="GETapi-capacity"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>The team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity"
|
|
value="2026-02"
|
|
data-component="body">
|
|
<br>
|
|
<p>Must be a valid date in the format <code>Y-m</code>. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>team_member_id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="team_member_id" data-endpoint="GETapi-capacity"
|
|
value="architecto"
|
|
data-component="body">
|
|
<br>
|
|
<p>The <code>id</code> of an existing record in the team_members table. Example: <code>architecto</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-GETapi-capacity-team">Get Team Capacity</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Summarize the combined capacity for all active team members in a month.</p>
|
|
|
|
<span id="example-requests-GETapi-capacity-team">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/capacity/team" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"month\": \"2026-02\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/capacity/team"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"month": "2026-02"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-capacity-team">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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
|
|
}
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-capacity-team" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-capacity-team"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-capacity-team"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-capacity-team" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-capacity-team">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-capacity-team" data-method="GET"
|
|
data-path="api/capacity/team"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-capacity-team', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-capacity-team"
|
|
onclick="tryItOut('GETapi-capacity-team');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-capacity-team"
|
|
onclick="cancelTryOut('GETapi-capacity-team');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-capacity-team"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/capacity/team</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-capacity-team"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-capacity-team"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity-team"
|
|
value="2026-02"
|
|
data-component="url">
|
|
<br>
|
|
<p>The month in YYYY-MM format. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity-team"
|
|
value="2026-02"
|
|
data-component="body">
|
|
<br>
|
|
<p>Must be a valid date in the format <code>Y-m</code>. Example: <code>2026-02</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-GETapi-capacity-revenue">Get Possible Revenue</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Estimate monthly revenue based on capacity hours and hourly rates.</p>
|
|
|
|
<span id="example-requests-GETapi-capacity-revenue">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/capacity/revenue" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"month\": \"2026-02\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/capacity/revenue"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"month": "2026-02"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-capacity-revenue">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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,
|
|
"revenue": 22200
|
|
}
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-capacity-revenue" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-capacity-revenue"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-capacity-revenue"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-capacity-revenue" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-capacity-revenue">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-capacity-revenue" data-method="GET"
|
|
data-path="api/capacity/revenue"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-capacity-revenue', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-capacity-revenue"
|
|
onclick="tryItOut('GETapi-capacity-revenue');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-capacity-revenue"
|
|
onclick="cancelTryOut('GETapi-capacity-revenue');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-capacity-revenue"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/capacity/revenue</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-capacity-revenue"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-capacity-revenue"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity-revenue"
|
|
value="2026-02"
|
|
data-component="url">
|
|
<br>
|
|
<p>The month in YYYY-MM format. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-capacity-revenue"
|
|
value="2026-02"
|
|
data-component="body">
|
|
<br>
|
|
<p>Must be a valid date in the format <code>Y-m</code>. Example: <code>2026-02</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-GETapi-holidays">List Holidays</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Retrieve holidays for a specific month or all holidays when no month is provided.</p>
|
|
|
|
<span id="example-requests-GETapi-holidays">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/holidays" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"month\": \"2026-02\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/holidays"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"month": "2026-02"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-holidays">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": [
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"date": "2026-02-14",
|
|
"name": "Company Holiday",
|
|
"description": "Office closed"
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-holidays" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-holidays"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-holidays"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-holidays" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-holidays">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-holidays" data-method="GET"
|
|
data-path="api/holidays"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-holidays', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-holidays"
|
|
onclick="tryItOut('GETapi-holidays');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-holidays"
|
|
onclick="cancelTryOut('GETapi-holidays');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-holidays"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/holidays</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-holidays"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-holidays"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-holidays"
|
|
value="2026-02"
|
|
data-component="url">
|
|
<br>
|
|
<p>nullable The month in YYYY-MM format. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-holidays"
|
|
value="2026-02"
|
|
data-component="body">
|
|
<br>
|
|
<p>Must be a valid date in the format <code>Y-m</code>. Example: <code>2026-02</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-POSTapi-holidays">Create Holiday</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Add a holiday and clear cached capacity data for the related month.</p>
|
|
|
|
<span id="example-requests-POSTapi-holidays">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/holidays" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"date\": \"2026-02-14\",
|
|
\"name\": \"Presidents\' Day\",
|
|
\"description\": \"Eius et animi quos velit et.\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/holidays"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"date": "2026-02-14",
|
|
"name": "Presidents' Day",
|
|
"description": "Eius et animi quos velit et."
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-holidays">
|
|
<blockquote>
|
|
<p>Example response (201):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"date": "2026-02-14",
|
|
"name": "Presidents' Day",
|
|
"description": "Office closed"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-holidays" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-holidays"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-holidays"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-holidays" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-holidays">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-holidays" data-method="POST"
|
|
data-path="api/holidays"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-holidays', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-holidays"
|
|
onclick="tryItOut('POSTapi-holidays');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-holidays"
|
|
onclick="cancelTryOut('POSTapi-holidays');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-holidays"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/holidays</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-holidays"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-holidays"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>date</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="date" data-endpoint="POSTapi-holidays"
|
|
value="2026-02-14"
|
|
data-component="body">
|
|
<br>
|
|
<p>Date of the holiday. Example: <code>2026-02-14</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>name</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="name" data-endpoint="POSTapi-holidays"
|
|
value="Presidents' Day"
|
|
data-component="body">
|
|
<br>
|
|
<p>Name of the holiday. Example: <code>Presidents' Day</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>description</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="description" data-endpoint="POSTapi-holidays"
|
|
value="Eius et animi quos velit et."
|
|
data-component="body">
|
|
<br>
|
|
<p>nullable Optional description of the holiday. Example: <code>Eius et animi quos velit et.</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-DELETEapi-holidays--id-">Delete Holiday</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Remove a holiday and clear affected capacity caches.</p>
|
|
|
|
<span id="example-requests-DELETEapi-holidays--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request DELETE \
|
|
"http://localhost/api/holidays/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/holidays/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "DELETE",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-DELETEapi-holidays--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Holiday deleted"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-DELETEapi-holidays--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-DELETEapi-holidays--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-DELETEapi-holidays--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-DELETEapi-holidays--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-DELETEapi-holidays--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-DELETEapi-holidays--id-" data-method="DELETE"
|
|
data-path="api/holidays/{id}"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('DELETEapi-holidays--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-DELETEapi-holidays--id-"
|
|
onclick="tryItOut('DELETEapi-holidays--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-DELETEapi-holidays--id-"
|
|
onclick="cancelTryOut('DELETEapi-holidays--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-DELETEapi-holidays--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-red">DELETE</small>
|
|
<b><code>api/holidays/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="DELETEapi-holidays--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="DELETEapi-holidays--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="DELETEapi-holidays--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>The holiday UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-GETapi-ptos">List PTO Requests</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Fetch PTO requests for a team member, optionally constrained to a month.</p>
|
|
|
|
<span id="example-requests-GETapi-ptos">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/ptos" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"team_member_id\": \"architecto\",
|
|
\"month\": \"2026-02\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/ptos"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"team_member_id": "architecto",
|
|
"month": "2026-02"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-ptos">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-ptos" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-ptos"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-ptos"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-ptos" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-ptos">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-ptos" data-method="GET"
|
|
data-path="api/ptos"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-ptos', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-ptos"
|
|
onclick="tryItOut('GETapi-ptos');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-ptos"
|
|
onclick="cancelTryOut('GETapi-ptos');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-ptos"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/ptos</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-ptos"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-ptos"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>team_member_id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="team_member_id" data-endpoint="GETapi-ptos"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>The team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-ptos"
|
|
value="2026-02"
|
|
data-component="url">
|
|
<br>
|
|
<p>nullable The month in YYYY-MM format. Example: <code>2026-02</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>team_member_id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="team_member_id" data-endpoint="GETapi-ptos"
|
|
value="architecto"
|
|
data-component="body">
|
|
<br>
|
|
<p>The <code>id</code> of an existing record in the team_members table. Example: <code>architecto</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>month</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="month" data-endpoint="GETapi-ptos"
|
|
value="2026-02"
|
|
data-component="body">
|
|
<br>
|
|
<p>Must be a valid date in the format <code>Y-m</code>. Example: <code>2026-02</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-POSTapi-ptos">Request PTO</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Create a PTO request for a team member and keep it in pending status.</p>
|
|
|
|
<span id="example-requests-POSTapi-ptos">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/ptos" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"team_member_id\": \"550e8400-e29b-41d4-a716-446655440000\",
|
|
\"start_date\": \"2026-02-10\",
|
|
\"end_date\": \"2026-02-12\",
|
|
\"reason\": \"architecto\"
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/ptos"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"team_member_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"start_date": "2026-02-10",
|
|
"end_date": "2026-02-12",
|
|
"reason": "architecto"
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-ptos">
|
|
<blockquote>
|
|
<p>Example response (201):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-ptos" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-ptos"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-ptos"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-ptos" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-ptos">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-ptos" data-method="POST"
|
|
data-path="api/ptos"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-ptos', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-ptos"
|
|
onclick="tryItOut('POSTapi-ptos');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-ptos"
|
|
onclick="cancelTryOut('POSTapi-ptos');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-ptos"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/ptos</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-ptos"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-ptos"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>team_member_id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="team_member_id" data-endpoint="POSTapi-ptos"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="body">
|
|
<br>
|
|
<p>The team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>start_date</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="start_date" data-endpoint="POSTapi-ptos"
|
|
value="2026-02-10"
|
|
data-component="body">
|
|
<br>
|
|
<p>The first day of the PTO. Example: <code>2026-02-10</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>end_date</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="end_date" data-endpoint="POSTapi-ptos"
|
|
value="2026-02-12"
|
|
data-component="body">
|
|
<br>
|
|
<p>The final day of the PTO. Example: <code>2026-02-12</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>reason</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="reason" data-endpoint="POSTapi-ptos"
|
|
value="architecto"
|
|
data-component="body">
|
|
<br>
|
|
<p>nullable Optional reason for the PTO. Example: <code>architecto</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="capacity-planning-PUTapi-ptos--id--approve">Approve PTO</h2>
|
|
|
|
<p>
|
|
</p>
|
|
|
|
<p>Approve a pending PTO request and refresh the affected capacity caches.</p>
|
|
|
|
<span id="example-requests-PUTapi-ptos--id--approve">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/ptos/550e8400-e29b-41d4-a716-446655440001/approve" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/ptos/550e8400-e29b-41d4-a716-446655440001/approve"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-ptos--id--approve">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440001",
|
|
"status": "approved"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-ptos--id--approve" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-ptos--id--approve"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-ptos--id--approve"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-ptos--id--approve" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-ptos--id--approve">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-ptos--id--approve" data-method="PUT"
|
|
data-path="api/ptos/{id}/approve"
|
|
data-authed="0"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-ptos--id--approve', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-ptos--id--approve"
|
|
onclick="tryItOut('PUTapi-ptos--id--approve');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-ptos--id--approve"
|
|
onclick="cancelTryOut('PUTapi-ptos--id--approve');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-ptos--id--approve"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/ptos/{id}/approve</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-ptos--id--approve"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-ptos--id--approve"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-ptos--id--approve"
|
|
value="550e8400-e29b-41d4-a716-446655440001"
|
|
data-component="url">
|
|
<br>
|
|
<p>The PTO UUID that needs approval. Example: <code>550e8400-e29b-41d4-a716-446655440001</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h1 id="projects">Projects</h1>
|
|
|
|
<p>Endpoints for managing projects.</p>
|
|
|
|
<h2 id="projects-GETapi-projects-types">Get all project types</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
|
|
|
|
<span id="example-requests-GETapi-projects-types">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/projects/types" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/types"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-projects-types">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"name": "Project"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "Support"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "Engagement"
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-projects-types" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-projects-types"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-projects-types"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-projects-types" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-projects-types">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-projects-types" data-method="GET"
|
|
data-path="api/projects/types"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-projects-types', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-projects-types"
|
|
onclick="tryItOut('GETapi-projects-types');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-projects-types"
|
|
onclick="cancelTryOut('GETapi-projects-types');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-projects-types"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/projects/types</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-projects-types"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-projects-types"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-GETapi-projects-statuses">Get all project statuses</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
|
|
|
|
<span id="example-requests-GETapi-projects-statuses">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/projects/statuses" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/statuses"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-projects-statuses">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"name": "Pre-sales",
|
|
"order": 1
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "SOW Approval",
|
|
"order": 2
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "Gathering Estimates",
|
|
"order": 3
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-projects-statuses" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-projects-statuses"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-projects-statuses"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-projects-statuses" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-projects-statuses">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-projects-statuses" data-method="GET"
|
|
data-path="api/projects/statuses"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-projects-statuses', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-projects-statuses"
|
|
onclick="tryItOut('GETapi-projects-statuses');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-projects-statuses"
|
|
onclick="cancelTryOut('GETapi-projects-statuses');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-projects-statuses"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/projects/statuses</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-projects-statuses"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-projects-statuses"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-GETapi-projects">List all projects</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Get a list of all projects with optional filtering by status and type.</p>
|
|
|
|
<span id="example-requests-GETapi-projects">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/projects?status_id=1&type_id=2" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects"
|
|
);
|
|
|
|
const params = {
|
|
"status_id": "1",
|
|
"type_id": "2",
|
|
};
|
|
Object.keys(params)
|
|
.forEach(key => url.searchParams.append(key, params[key]));
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-projects">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": [
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"code": "PROJ-001",
|
|
"title": "Client Dashboard Redesign",
|
|
"status": {
|
|
"id": 1,
|
|
"name": "Pre-sales"
|
|
},
|
|
"type": {
|
|
"id": 2,
|
|
"name": "Support"
|
|
},
|
|
"approved_estimate": "120.00",
|
|
"forecasted_effort": {
|
|
"2024-02": 40,
|
|
"2024-03": 60,
|
|
"2024-04": 20
|
|
},
|
|
"created_at": "2024-01-15T10:00:00.000000Z",
|
|
"updated_at": "2024-01-15T10:00:00.000000Z"
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-projects" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-projects"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-projects"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-projects" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-projects">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-projects" data-method="GET"
|
|
data-path="api/projects"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-projects', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-projects"
|
|
onclick="tryItOut('GETapi-projects');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-projects"
|
|
onclick="cancelTryOut('GETapi-projects');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-projects"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/projects</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-projects"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-projects"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>status_id</code></b>
|
|
<small>integer</small>
|
|
<i>optional</i>
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="status_id" data-endpoint="GETapi-projects"
|
|
value="1"
|
|
data-component="query">
|
|
<br>
|
|
<p>Filter by status ID. Example: <code>1</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>type_id</code></b>
|
|
<small>integer</small>
|
|
<i>optional</i>
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="type_id" data-endpoint="GETapi-projects"
|
|
value="2"
|
|
data-component="query">
|
|
<br>
|
|
<p>Filter by type ID. Example: <code>2</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-POSTapi-projects">Create a new project</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Create a new project with code, title, and type.</p>
|
|
|
|
<span id="example-requests-POSTapi-projects">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/projects" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"code\": \"PROJ-001\",
|
|
\"title\": \"Client Dashboard Redesign\",
|
|
\"type_id\": 1
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"code": "PROJ-001",
|
|
"title": "Client Dashboard Redesign",
|
|
"type_id": 1
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-projects">
|
|
<blockquote>
|
|
<p>Example response (201):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"code": "PROJ-001",
|
|
"title": "Client Dashboard Redesign",
|
|
"status": {
|
|
"id": 1,
|
|
"name": "Pre-sales"
|
|
},
|
|
"type": {
|
|
"id": 1,
|
|
"name": "Project"
|
|
}
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Validation failed",
|
|
"errors": {
|
|
"code": [
|
|
"Project code must be unique"
|
|
],
|
|
"title": [
|
|
"The title field is required."
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-projects" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-projects"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-projects"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-projects" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-projects">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-projects" data-method="POST"
|
|
data-path="api/projects"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-projects', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-projects"
|
|
onclick="tryItOut('POSTapi-projects');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-projects"
|
|
onclick="cancelTryOut('POSTapi-projects');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-projects"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/projects</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-projects"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-projects"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>code</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="code" data-endpoint="POSTapi-projects"
|
|
value="PROJ-001"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project code (must be unique). Example: <code>PROJ-001</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>title</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="title" data-endpoint="POSTapi-projects"
|
|
value="Client Dashboard Redesign"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project title. Example: <code>Client Dashboard Redesign</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>type_id</code></b>
|
|
<small>integer</small>
|
|
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="type_id" data-endpoint="POSTapi-projects"
|
|
value="1"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project type ID. Example: <code>1</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-GETapi-projects--id-">Get a single project</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Get details of a specific project by ID.</p>
|
|
|
|
<span id="example-requests-GETapi-projects--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-projects--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"code": "PROJ-001",
|
|
"title": "Client Dashboard Redesign",
|
|
"status": {
|
|
"id": 1,
|
|
"name": "Pre-sales"
|
|
},
|
|
"type": {
|
|
"id": 1,
|
|
"name": "Project"
|
|
},
|
|
"approved_estimate": "120.00",
|
|
"forecasted_effort": {
|
|
"2024-02": 40,
|
|
"2024-03": 60
|
|
}
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-projects--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-projects--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-projects--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-projects--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-projects--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-projects--id-" data-method="GET"
|
|
data-path="api/projects/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-projects--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-projects--id-"
|
|
onclick="tryItOut('GETapi-projects--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-projects--id-"
|
|
onclick="cancelTryOut('GETapi-projects--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-projects--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/projects/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="GETapi-projects--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-PUTapi-projects--id-">Update a project</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Update details of an existing project.</p>
|
|
|
|
<span id="example-requests-PUTapi-projects--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"code\": \"PROJ-002\",
|
|
\"title\": \"Updated Title\",
|
|
\"type_id\": 2
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"code": "PROJ-002",
|
|
"title": "Updated Title",
|
|
"type_id": 2
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-projects--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"code": "PROJ-002",
|
|
"title": "Updated Title",
|
|
"type": {
|
|
"id": 2,
|
|
"name": "Support"
|
|
}
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Validation failed",
|
|
"errors": {
|
|
"type_id": [
|
|
"The selected type id is invalid."
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-projects--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-projects--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-projects--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-projects--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-projects--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-projects--id-" data-method="PUT"
|
|
data-path="api/projects/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-projects--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-projects--id-"
|
|
onclick="tryItOut('PUTapi-projects--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-projects--id-"
|
|
onclick="cancelTryOut('PUTapi-projects--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-projects--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/projects/{id}</code></b>
|
|
</p>
|
|
<p>
|
|
<small class="badge badge-purple">PATCH</small>
|
|
<b><code>api/projects/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-projects--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>code</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="code" data-endpoint="PUTapi-projects--id-"
|
|
value="PROJ-002"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project code (must be unique). Example: <code>PROJ-002</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>title</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="title" data-endpoint="PUTapi-projects--id-"
|
|
value="Updated Title"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project title. Example: <code>Updated Title</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>type_id</code></b>
|
|
<small>integer</small>
|
|
<i>optional</i>
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="type_id" data-endpoint="PUTapi-projects--id-"
|
|
value="2"
|
|
data-component="body">
|
|
<br>
|
|
<p>Project type ID. Example: <code>2</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-DELETEapi-projects--id-">Delete a project</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Delete a project. Cannot delete if project has allocations or actuals.</p>
|
|
|
|
<span id="example-requests-DELETEapi-projects--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request DELETE \
|
|
"http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "DELETE",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-DELETEapi-projects--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project deleted successfully"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Cannot delete project with allocations"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-DELETEapi-projects--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-DELETEapi-projects--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-DELETEapi-projects--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-DELETEapi-projects--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-DELETEapi-projects--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-DELETEapi-projects--id-" data-method="DELETE"
|
|
data-path="api/projects/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('DELETEapi-projects--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-DELETEapi-projects--id-"
|
|
onclick="tryItOut('DELETEapi-projects--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-DELETEapi-projects--id-"
|
|
onclick="cancelTryOut('DELETEapi-projects--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-DELETEapi-projects--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-red">DELETE</small>
|
|
<b><code>api/projects/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="DELETEapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="DELETEapi-projects--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="DELETEapi-projects--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-PUTapi-projects--project--status">Transition project status</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Transition project to a new status following the state machine rules.</p>
|
|
|
|
<span id="example-requests-PUTapi-projects--project--status">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/projects/architecto/status" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"status_id\": 2
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/architecto/status"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"status_id": 2
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-projects--project--status">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"status": {
|
|
"id": 2,
|
|
"name": "SOW Approval"
|
|
}
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Cannot transition from Pre-sales to Done"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-projects--project--status" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-projects--project--status"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-projects--project--status"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-projects--project--status" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-projects--project--status">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-projects--project--status" data-method="PUT"
|
|
data-path="api/projects/{project}/status"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-projects--project--status', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-projects--project--status"
|
|
onclick="tryItOut('PUTapi-projects--project--status');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-projects--project--status"
|
|
onclick="cancelTryOut('PUTapi-projects--project--status');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-projects--project--status"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/projects/{project}/status</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-projects--project--status"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-projects--project--status"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>project</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="project" data-endpoint="PUTapi-projects--project--status"
|
|
value="architecto"
|
|
data-component="url">
|
|
<br>
|
|
<p>The project. Example: <code>architecto</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-projects--project--status"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>status_id</code></b>
|
|
<small>integer</small>
|
|
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="status_id" data-endpoint="PUTapi-projects--project--status"
|
|
value="2"
|
|
data-component="body">
|
|
<br>
|
|
<p>Target status ID. Example: <code>2</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-PUTapi-projects--project--estimate">Set approved estimate</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Set the approved billable hours estimate for a project.</p>
|
|
|
|
<span id="example-requests-PUTapi-projects--project--estimate">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/projects/architecto/estimate" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"approved_estimate\": 120
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/architecto/estimate"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"approved_estimate": 120
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-projects--project--estimate">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"approved_estimate": "120.00"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Approved estimate must be greater than 0"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-projects--project--estimate" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-projects--project--estimate"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-projects--project--estimate"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-projects--project--estimate" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-projects--project--estimate">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-projects--project--estimate" data-method="PUT"
|
|
data-path="api/projects/{project}/estimate"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-projects--project--estimate', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-projects--project--estimate"
|
|
onclick="tryItOut('PUTapi-projects--project--estimate');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-projects--project--estimate"
|
|
onclick="cancelTryOut('PUTapi-projects--project--estimate');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-projects--project--estimate"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/projects/{project}/estimate</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-projects--project--estimate"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-projects--project--estimate"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>project</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="project" data-endpoint="PUTapi-projects--project--estimate"
|
|
value="architecto"
|
|
data-component="url">
|
|
<br>
|
|
<p>The project. Example: <code>architecto</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-projects--project--estimate"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>approved_estimate</code></b>
|
|
<small>number</small>
|
|
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="approved_estimate" data-endpoint="PUTapi-projects--project--estimate"
|
|
value="120"
|
|
data-component="body">
|
|
<br>
|
|
<p>Approved estimate hours (must be > 0). Example: <code>120</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="projects-PUTapi-projects--project--forecast">Set forecasted effort</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Set the month-by-month forecasted effort breakdown.</p>
|
|
|
|
<span id="example-requests-PUTapi-projects--project--forecast">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/projects/architecto/forecast" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"forecasted_effort\": {
|
|
\"2024-02\": 40,
|
|
\"2024-03\": 60
|
|
}
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/projects/architecto/forecast"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"forecasted_effort": {
|
|
"2024-02": 40,
|
|
"2024-03": 60
|
|
}
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-projects--project--forecast">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"forecasted_effort": {
|
|
"2024-02": 40,
|
|
"2024-03": 60
|
|
}
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Project not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Forecasted effort exceeds approved estimate by more than 5%"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-projects--project--forecast" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-projects--project--forecast"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-projects--project--forecast"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-projects--project--forecast" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-projects--project--forecast">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-projects--project--forecast" data-method="PUT"
|
|
data-path="api/projects/{project}/forecast"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-projects--project--forecast', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-projects--project--forecast"
|
|
onclick="tryItOut('PUTapi-projects--project--forecast');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-projects--project--forecast"
|
|
onclick="cancelTryOut('PUTapi-projects--project--forecast');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-projects--project--forecast"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/projects/{project}/forecast</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-projects--project--forecast"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-projects--project--forecast"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>project</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="project" data-endpoint="PUTapi-projects--project--forecast"
|
|
value="architecto"
|
|
data-component="url">
|
|
<br>
|
|
<p>The project. Example: <code>architecto</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-projects--project--forecast"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Project UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>forecasted_effort</code></b>
|
|
<small>object</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="forecasted_effort" data-endpoint="PUTapi-projects--project--forecast"
|
|
value=""
|
|
data-component="body">
|
|
<br>
|
|
<p>Monthly effort breakdown.</p>
|
|
</div>
|
|
</form>
|
|
|
|
<h1 id="team-members">Team Members</h1>
|
|
|
|
<p>Endpoints for managing team members.</p>
|
|
|
|
<h2 id="team-members-GETapi-team-members">List all team members</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Get a list of all team members with optional filtering by active status.</p>
|
|
|
|
<span id="example-requests-GETapi-team-members">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/team-members?active=1" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/team-members"
|
|
);
|
|
|
|
const params = {
|
|
"active": "1",
|
|
};
|
|
Object.keys(params)
|
|
.forEach(key => url.searchParams.append(key, params[key]));
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-team-members">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
]
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-team-members" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-team-members"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-team-members"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-team-members" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-team-members">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-team-members" data-method="GET"
|
|
data-path="api/team-members"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-team-members', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-team-members"
|
|
onclick="tryItOut('GETapi-team-members');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-team-members"
|
|
onclick="cancelTryOut('GETapi-team-members');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-team-members"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/team-members</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-team-members"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-team-members"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>active</code></b>
|
|
<small>boolean</small>
|
|
<i>optional</i>
|
|
|
|
<label data-endpoint="GETapi-team-members" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="1"
|
|
data-endpoint="GETapi-team-members"
|
|
data-component="query" >
|
|
<code>true</code>
|
|
</label>
|
|
<label data-endpoint="GETapi-team-members" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="0"
|
|
data-endpoint="GETapi-team-members"
|
|
data-component="query" >
|
|
<code>false</code>
|
|
</label>
|
|
<br>
|
|
<p>Filter by active status. Example: <code>true</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="team-members-POSTapi-team-members">Create a new team member</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Create a new team member with name, role, and hourly rate.</p>
|
|
|
|
<span id="example-requests-POSTapi-team-members">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request POST \
|
|
"http://localhost/api/team-members" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"name\": \"John Doe\",
|
|
\"role_id\": 1,
|
|
\"hourly_rate\": \"150.00\",
|
|
\"active\": true
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/team-members"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"name": "John Doe",
|
|
"role_id": 1,
|
|
"hourly_rate": "150.00",
|
|
"active": true
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-POSTapi-team-members">
|
|
<blockquote>
|
|
<p>Example response (201):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Validation failed",
|
|
"errors": {
|
|
"name": [
|
|
"The name field is required."
|
|
],
|
|
"hourly_rate": [
|
|
"Hourly rate must be greater than 0"
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-POSTapi-team-members" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-POSTapi-team-members"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-POSTapi-team-members"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-POSTapi-team-members" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-POSTapi-team-members">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-POSTapi-team-members" data-method="POST"
|
|
data-path="api/team-members"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('POSTapi-team-members', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-POSTapi-team-members"
|
|
onclick="tryItOut('POSTapi-team-members');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-POSTapi-team-members"
|
|
onclick="cancelTryOut('POSTapi-team-members');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-POSTapi-team-members"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-black">POST</small>
|
|
<b><code>api/team-members</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="POSTapi-team-members"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="POSTapi-team-members"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>name</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="name" data-endpoint="POSTapi-team-members"
|
|
value="John Doe"
|
|
data-component="body">
|
|
<br>
|
|
<p>Team member name. Example: <code>John Doe</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>role_id</code></b>
|
|
<small>integer</small>
|
|
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="role_id" data-endpoint="POSTapi-team-members"
|
|
value="1"
|
|
data-component="body">
|
|
<br>
|
|
<p>Role ID. Example: <code>1</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>hourly_rate</code></b>
|
|
<small>numeric</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="hourly_rate" data-endpoint="POSTapi-team-members"
|
|
value="150.00"
|
|
data-component="body">
|
|
<br>
|
|
<p>Hourly rate (must be > 0). Example: <code>150.00</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>active</code></b>
|
|
<small>boolean</small>
|
|
<i>optional</i>
|
|
|
|
<label data-endpoint="POSTapi-team-members" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="true"
|
|
data-endpoint="POSTapi-team-members"
|
|
data-component="body" >
|
|
<code>true</code>
|
|
</label>
|
|
<label data-endpoint="POSTapi-team-members" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="false"
|
|
data-endpoint="POSTapi-team-members"
|
|
data-component="body" >
|
|
<code>false</code>
|
|
</label>
|
|
<br>
|
|
<p>Active status (defaults to true). Example: <code>true</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="team-members-GETapi-team-members--id-">Get a single team member</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Get details of a specific team member by ID.</p>
|
|
|
|
<span id="example-requests-GETapi-team-members--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request GET \
|
|
--get "http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-GETapi-team-members--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Team member not found"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-GETapi-team-members--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-GETapi-team-members--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-GETapi-team-members--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-GETapi-team-members--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-GETapi-team-members--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-GETapi-team-members--id-" data-method="GET"
|
|
data-path="api/team-members/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('GETapi-team-members--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-GETapi-team-members--id-"
|
|
onclick="tryItOut('GETapi-team-members--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-GETapi-team-members--id-"
|
|
onclick="cancelTryOut('GETapi-team-members--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-GETapi-team-members--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-green">GET</small>
|
|
<b><code>api/team-members/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="GETapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="GETapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="GETapi-team-members--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="team-members-PUTapi-team-members--id-">Update a team member</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Update details of an existing team member.</p>
|
|
|
|
<span id="example-requests-PUTapi-team-members--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request PUT \
|
|
"http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json" \
|
|
--data "{
|
|
\"name\": \"John Doe\",
|
|
\"role_id\": 1,
|
|
\"hourly_rate\": \"175.00\",
|
|
\"active\": false
|
|
}"
|
|
</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
let body = {
|
|
"name": "John Doe",
|
|
"role_id": 1,
|
|
"hourly_rate": "175.00",
|
|
"active": false
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-PUTapi-team-members--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"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"
|
|
}
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Team member not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Validation failed",
|
|
"errors": {
|
|
"hourly_rate": [
|
|
"Hourly rate must be greater than 0"
|
|
]
|
|
}
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-PUTapi-team-members--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-PUTapi-team-members--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-PUTapi-team-members--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-PUTapi-team-members--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-PUTapi-team-members--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-PUTapi-team-members--id-" data-method="PUT"
|
|
data-path="api/team-members/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('PUTapi-team-members--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-PUTapi-team-members--id-"
|
|
onclick="tryItOut('PUTapi-team-members--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-PUTapi-team-members--id-"
|
|
onclick="cancelTryOut('PUTapi-team-members--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-PUTapi-team-members--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-darkblue">PUT</small>
|
|
<b><code>api/team-members/{id}</code></b>
|
|
</p>
|
|
<p>
|
|
<small class="badge badge-purple">PATCH</small>
|
|
<b><code>api/team-members/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="PUTapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="PUTapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="PUTapi-team-members--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>name</code></b>
|
|
<small>string</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="name" data-endpoint="PUTapi-team-members--id-"
|
|
value="John Doe"
|
|
data-component="body">
|
|
<br>
|
|
<p>Team member name. Example: <code>John Doe</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>role_id</code></b>
|
|
<small>integer</small>
|
|
<i>optional</i>
|
|
|
|
<input type="number" style="display: none"
|
|
step="any" name="role_id" data-endpoint="PUTapi-team-members--id-"
|
|
value="1"
|
|
data-component="body">
|
|
<br>
|
|
<p>Role ID. Example: <code>1</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>hourly_rate</code></b>
|
|
<small>numeric</small>
|
|
<i>optional</i>
|
|
|
|
<input type="text" style="display: none"
|
|
name="hourly_rate" data-endpoint="PUTapi-team-members--id-"
|
|
value="175.00"
|
|
data-component="body">
|
|
<br>
|
|
<p>Hourly rate (must be > 0). Example: <code>175.00</code></p>
|
|
</div>
|
|
<div style=" padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>active</code></b>
|
|
<small>boolean</small>
|
|
<i>optional</i>
|
|
|
|
<label data-endpoint="PUTapi-team-members--id-" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="true"
|
|
data-endpoint="PUTapi-team-members--id-"
|
|
data-component="body" >
|
|
<code>true</code>
|
|
</label>
|
|
<label data-endpoint="PUTapi-team-members--id-" style="display: none">
|
|
<input type="radio" name="active"
|
|
value="false"
|
|
data-endpoint="PUTapi-team-members--id-"
|
|
data-component="body" >
|
|
<code>false</code>
|
|
</label>
|
|
<br>
|
|
<p>Active status. Example: <code>false</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
<h2 id="team-members-DELETEapi-team-members--id-">Delete a team member</h2>
|
|
|
|
<p>
|
|
<small class="badge badge-darkred">requires authentication</small>
|
|
</p>
|
|
|
|
<p>Delete a team member. Cannot delete if member has allocations or actuals.</p>
|
|
|
|
<span id="example-requests-DELETEapi-team-members--id-">
|
|
<blockquote>Example request:</blockquote>
|
|
|
|
|
|
<div class="bash-example">
|
|
<pre><code class="language-bash">curl --request DELETE \
|
|
"http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000" \
|
|
--header "Content-Type: application/json" \
|
|
--header "Accept: application/json"</code></pre></div>
|
|
|
|
|
|
<div class="javascript-example">
|
|
<pre><code class="language-javascript">const url = new URL(
|
|
"http://localhost/api/team-members/550e8400-e29b-41d4-a716-446655440000"
|
|
);
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
};
|
|
|
|
fetch(url, {
|
|
method: "DELETE",
|
|
headers,
|
|
}).then(response => response.json());</code></pre></div>
|
|
|
|
</span>
|
|
|
|
<span id="example-responses-DELETEapi-team-members--id-">
|
|
<blockquote>
|
|
<p>Example response (200):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Team member deleted successfully"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (404):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Team member not found"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Cannot delete team member with active allocations",
|
|
"suggestion": "Consider deactivating the team member instead"
|
|
}</code>
|
|
</pre>
|
|
<blockquote>
|
|
<p>Example response (422):</p>
|
|
</blockquote>
|
|
<pre>
|
|
|
|
<code class="language-json" style="max-height: 300px;">{
|
|
"message": "Cannot delete team member with historical data",
|
|
"suggestion": "Consider deactivating the team member instead"
|
|
}</code>
|
|
</pre>
|
|
</span>
|
|
<span id="execution-results-DELETEapi-team-members--id-" hidden>
|
|
<blockquote>Received response<span
|
|
id="execution-response-status-DELETEapi-team-members--id-"></span>:
|
|
</blockquote>
|
|
<pre class="json"><code id="execution-response-content-DELETEapi-team-members--id-"
|
|
data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
|
|
</span>
|
|
<span id="execution-error-DELETEapi-team-members--id-" hidden>
|
|
<blockquote>Request failed with error:</blockquote>
|
|
<pre><code id="execution-error-message-DELETEapi-team-members--id-">
|
|
|
|
Tip: Check that you're properly connected to the network.
|
|
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
|
|
You can check the Dev Tools console for debugging information.</code></pre>
|
|
</span>
|
|
<form id="form-DELETEapi-team-members--id-" data-method="DELETE"
|
|
data-path="api/team-members/{id}"
|
|
data-authed="1"
|
|
data-hasfiles="0"
|
|
data-isarraybody="0"
|
|
autocomplete="off"
|
|
onsubmit="event.preventDefault(); executeTryOut('DELETEapi-team-members--id-', this);">
|
|
<h3>
|
|
Request
|
|
<button type="button"
|
|
style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-tryout-DELETEapi-team-members--id-"
|
|
onclick="tryItOut('DELETEapi-team-members--id-');">Try it out ⚡
|
|
</button>
|
|
<button type="button"
|
|
style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-canceltryout-DELETEapi-team-members--id-"
|
|
onclick="cancelTryOut('DELETEapi-team-members--id-');" hidden>Cancel 🛑
|
|
</button>
|
|
<button type="submit"
|
|
style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
|
|
id="btn-executetryout-DELETEapi-team-members--id-"
|
|
data-initial-text="Send Request 💥"
|
|
data-loading-text="⏱ Sending..."
|
|
hidden>Send Request 💥
|
|
</button>
|
|
</h3>
|
|
<p>
|
|
<small class="badge badge-red">DELETE</small>
|
|
<b><code>api/team-members/{id}</code></b>
|
|
</p>
|
|
<h4 class="fancy-heading-panel"><b>Headers</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Content-Type</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Content-Type" data-endpoint="DELETEapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>Accept</code></b>
|
|
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="Accept" data-endpoint="DELETEapi-team-members--id-"
|
|
value="application/json"
|
|
data-component="header">
|
|
<br>
|
|
<p>Example: <code>application/json</code></p>
|
|
</div>
|
|
<h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
|
|
<div style="padding-left: 28px; clear: unset;">
|
|
<b style="line-height: 2;"><code>id</code></b>
|
|
<small>string</small>
|
|
|
|
|
|
<input type="text" style="display: none"
|
|
name="id" data-endpoint="DELETEapi-team-members--id-"
|
|
value="550e8400-e29b-41d4-a716-446655440000"
|
|
data-component="url">
|
|
<br>
|
|
<p>Team member UUID. Example: <code>550e8400-e29b-41d4-a716-446655440000</code></p>
|
|
</div>
|
|
</form>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
<div class="dark-box">
|
|
<div class="lang-selector">
|
|
<button type="button" class="lang-button" data-language-name="bash">bash</button>
|
|
<button type="button" class="lang-button" data-language-name="javascript">javascript</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|