diff --git a/PostFundManagement.ConsoleUI/openapi_live.json b/PostFundManagement.ConsoleUI/openapi_live.json new file mode 100644 index 0000000..423173e --- /dev/null +++ b/PostFundManagement.ConsoleUI/openapi_live.json @@ -0,0 +1,6077 @@ +{ + "openapi": "3.1.1", + "info": { + "title": "PostFundManagement.Api | v1", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://api.ifri.khongisa.co.za/" + } + ], + "paths": { + "/v1/api/users/{userId}": { + "get": { + "tags": [ + "Users" + ], + "description": "Gets the metadata of a single user.", + "operationId": "getuser", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/users/{page}/{pageSize}": { + "post": { + "tags": [ + "Users" + ], + "description": "Paginated, searchable directory of system users. Supports filtering by ActivityStatus, searching by Email, and sorting", + "operationId": "getusers", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UserFilterRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/integration/sync": { + "post": { + "tags": [ + "Users" + ], + "description": "Trigger integration and data synchronization in the background", + "operationId": "syncuser", + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/users/{userId}/status/{status}": { + "get": { + "tags": [ + "Users" + ], + "description": "Changes the Activity status of the user in the system", + "operationId": "updateuserstatus", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "status", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/ActivityStatus" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/tools/hashid/{id64}": { + "get": { + "tags": [ + "Tools" + ], + "description": "Hashes an int64 identifier", + "operationId": "encodeid", + "parameters": [ + { + "name": "id64", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/activities": { + "post": { + "tags": [ + "Projects" + ], + "description": "Add a new activity under project (M04)", + "operationId": "createactivity", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateActivityRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/programme": { + "post": { + "tags": [ + "Projects" + ], + "description": "Create programme", + "operationId": "createprogramme", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateProgrammeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Projects" + ], + "description": "Update existing programme", + "operationId": "updateprogramme", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateProgrammeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects": { + "post": { + "tags": [ + "Projects" + ], + "description": "Create a new project (M04)", + "operationId": "createproject", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateProjectRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of projects", + "operationId": "getprojects", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Projects" + ], + "description": "Update project details", + "operationId": "updateproject", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/{projectId}/activities": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of activities for a project", + "operationId": "getactivities", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Activity" + } + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/activities/{activityId}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Gets a specific activity by it's id", + "operationId": "getactivity", + "parameters": [ + { + "name": "activityId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Activity" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/milestones/{milestoneId}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Gets a specific milestone", + "operationId": "getmilestone", + "parameters": [ + { + "name": "milestoneId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/milestones/{page}/{pageSize}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of all milestones", + "operationId": "getmilestones", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Milestone" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/programme/{programmeId}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get specific programme", + "operationId": "getprogramme", + "parameters": [ + { + "name": "programmeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Programme" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/{programmeId}/programme": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of all projects under a programme", + "operationId": "getprogrammeprojects", + "parameters": [ + { + "name": "programmeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/programme/{page}/{pageSize}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of all programmes", + "operationId": "getprogrammesprojects", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Programme" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/{projectId}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get project by ID", + "operationId": "getproject", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/indicators/project/{projectId}": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get get a detailed list of project indicators", + "operationId": "getprojectindicators", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Indicator" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/{projectId}/milestones": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of milestones for a project", + "operationId": "getprojectmilestones", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Milestone" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/{projectId}/risks": { + "get": { + "tags": [ + "Projects" + ], + "description": "Get a list of risks for a project", + "operationId": "getprojectrisks", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Risk" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/milestone": { + "put": { + "tags": [ + "Projects" + ], + "description": "Update project milestone details", + "operationId": "updatemilestone", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateMilestoneRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/projects/status": { + "put": { + "tags": [ + "Projects" + ], + "description": "Update project status (M04)", + "operationId": "updateprojectstatus", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectStatusRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/awards": { + "post": { + "tags": [ + "Grants" + ], + "description": "Register an approved funding award (M01)", + "operationId": "createaward", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateAwardRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Grants" + ], + "description": "Get a list of awards", + "operationId": "getawards", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Award" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/budgets": { + "post": { + "tags": [ + "Grants" + ], + "description": "Create a new budget line (M05)", + "operationId": "createbudget", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateBudgetRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Grants" + ], + "description": "Get all budgets", + "operationId": "getbudgets", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Budget" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/contracts": { + "post": { + "tags": [ + "Grants" + ], + "description": "Create a contract record from an approved award (M02)", + "operationId": "createcontract", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateContractRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Grants" + ], + "description": "Get all contracts", + "operationId": "getcontracts", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Contract" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Grants" + ], + "description": "Updates a specific contract", + "operationId": "updatecontract", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateContractRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/contracts/execute": { + "post": { + "tags": [ + "Grants" + ], + "description": "Execute the contract and lock the contractual version", + "operationId": "executecontract", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ExecuteContractRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/awards/{awardId}": { + "get": { + "tags": [ + "Grants" + ], + "description": "Get award by ID", + "operationId": "getaward", + "parameters": [ + { + "name": "awardId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Award" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/budgets/{budgetId}": { + "get": { + "tags": [ + "Grants" + ], + "description": "Get budget by ID", + "operationId": "getbudget", + "parameters": [ + { + "name": "budgetId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Budget" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/contracts/{contractId}": { + "get": { + "tags": [ + "Grants" + ], + "description": "Get contract by ID", + "operationId": "getcontract", + "parameters": [ + { + "name": "contractId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Contract" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "post": { + "tags": [ + "Grants" + ], + "description": "Uploads a contract file securely", + "operationId": "uploadcontract", + "parameters": [ + { + "name": "contractId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/grants/contracts/{contractId}/securelink": { + "get": { + "tags": [ + "Grants" + ], + "description": "Gets a secure download URL, has expiry period (default 15min)", + "operationId": "getcontracturl", + "parameters": [ + { + "name": "contractId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "string" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/organisations": { + "post": { + "tags": [ + "Governance" + ], + "description": "Create a new organization profile", + "operationId": "createorganisation", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateOrganisationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Governance" + ], + "description": "Get a paginated directory of organizations", + "operationId": "getorganisations", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Organisation" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Governance" + ], + "description": "Update an existing organization profile", + "operationId": "updateorganisation", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateOrganisationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/organisations/portfolio": { + "post": { + "tags": [ + "Governance" + ], + "description": "Create a new organization portfolio", + "operationId": "createportfolio", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreatePortfolioRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Governance" + ], + "description": "Update an existing organization portfolio", + "operationId": "updateportfolio", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdatePortfolioRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/dashboard": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get executive portfolio dashboard metrics and KPIs", + "operationId": "dashboard", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Dashboard" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/instruments/{programmeId}": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get all funding instruments", + "operationId": "getinstruments", + "parameters": [ + { + "name": "programmeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instrument" + } + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/organisations/{organisationId}": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get organization profile by ID", + "operationId": "getorganisation", + "parameters": [ + { + "name": "organisationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Organisation" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/portfolios/{portfolioId}": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get a specific portfolios", + "operationId": "getportfolio", + "parameters": [ + { + "name": "portfolioId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Portfolio" + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Portfolio" + } + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/portfolios/{portfolioId}/programmes": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get a programme's portfolios", + "operationId": "getportfolioprogrammes", + "parameters": [ + { + "name": "portfolioId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Programme" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/organisations/{organisationId}/portfolio": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get all portfolios", + "operationId": "getportfolios", + "parameters": [ + { + "name": "organisationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Portfolio" + } + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/governance/programmes/{portfolioId}": { + "get": { + "tags": [ + "Governance" + ], + "description": "Get all programmes", + "operationId": "getprogrammes", + "parameters": [ + { + "name": "portfolioId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Programme" + } + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/execution/disbursements/{disbursementId}/approve": { + "post": { + "tags": [ + "Execution" + ], + "description": "Approve disbursement and release payment (M06)", + "operationId": "approvedisbursement", + "parameters": [ + { + "name": "disbursementId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/execution/disbursements": { + "post": { + "tags": [ + "Execution" + ], + "description": "Create a new disbursement schedule (M06)", + "operationId": "createdisbursement", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateDisbursementRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Execution" + ], + "description": "Get a list of disbursements", + "operationId": "getdisbursements", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Disbursement" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Execution" + ], + "description": "Update the details of a specific disbursement", + "operationId": "updatedisbursement", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateDisbursementRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/execution/risks": { + "post": { + "tags": [ + "Execution" + ], + "description": "Add risk to risk register (M09)", + "operationId": "createrisk", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateRiskRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "get": { + "tags": [ + "Execution" + ], + "description": "Get a list of all risks", + "operationId": "getrisks", + "parameters": [ + { + "name": "page", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + }, + "put": { + "tags": [ + "Execution" + ], + "description": "Update the details of a specific risk", + "operationId": "updaterisk", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateRiskRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/execution/disbursements/{disbursementId}": { + "get": { + "tags": [ + "Execution" + ], + "description": "Get a specific disbursement", + "operationId": "getdisbursement", + "parameters": [ + { + "name": "disbursementId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Disbursement" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/execution/risks/{riskId}": { + "get": { + "tags": [ + "Execution" + ], + "description": "Get a specific risk", + "operationId": "getrisk", + "parameters": [ + { + "name": "riskId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Risk" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/file": { + "put": { + "tags": [ + "Evidence & M&E" + ], + "description": "Upload supporting evidence file to S3 and register metadata (M14)", + "operationId": "createevidence", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/indicators": { + "post": { + "tags": [ + "Evidence & M&E" + ], + "description": "Define indicators and baselines/targets (M08)", + "operationId": "createindicator", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateIndicatorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/milestones": { + "post": { + "tags": [ + "Evidence & M&E" + ], + "description": "Define contractual milestones (M07)", + "operationId": "createmilestonerequest", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/CreateMilestoneRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/{evidenceId}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a specific evidence record and assiciated file URLs", + "operationId": "getevidence", + "parameters": [ + { + "name": "evidenceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Evidence" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/files/{page}/{pageSize}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a list of all uploaded evidence files metadata", + "operationId": "getevidencefiles", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Evidence" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/{evidenceId}/securelink": { + "get": { + "tags": [ + "Grants" + ], + "description": "Gets a secure download URL of the evidence file, URL expires (default: 15min)", + "operationId": "getevidenceurl", + "parameters": [ + { + "name": "evidenceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json; version=1": { + "schema": { + "type": "string" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/indicators/{indicatorId}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a specific indicator.", + "operationId": "getindicator", + "parameters": [ + { + "name": "indicatorId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Indicator" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/indicators/{page}/{pageSize}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a list of indicators", + "operationId": "getindicators", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Indicator" + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/milestone/{milestoneId}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a list of all uploaded evidence metadata for a specific mliestone", + "operationId": "getmilestoneevidence", + "parameters": [ + { + "name": "milestoneId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Evidence" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/{projectId}": { + "get": { + "tags": [ + "Evidence & M&E" + ], + "description": "Get a list of all uploaded evidence metadata for a specific project", + "operationId": "getprojectevidence", + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Evidence" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence/indicators/{indicatorId}/actuals/{actualAmount}": { + "post": { + "tags": [ + "Evidence & M&E" + ], + "description": "Record actual values for indicators (M08)", + "operationId": "recordindicatoramount", + "parameters": [ + { + "name": "indicatorId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "actualAmount", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": "number", + "format": "double" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/evidence": { + "put": { + "tags": [ + "Evidence & M&E" + ], + "description": "Updates a specific evidence record metadata", + "operationId": "updateevidence", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/UpdateEvidenceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "403": { + "description": "Forbidden" + }, + "401": { + "description": "Unauthorized" + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/communications/invites/applicant/{applicantUserId}": { + "get": { + "tags": [ + "Communications" + ], + "description": "Gets an applicant's invite", + "operationId": "getapplicantinvite", + "parameters": [ + { + "name": "applicantUserId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Invite" + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/communications/invites/{applicantUserId}": { + "get": { + "tags": [ + "Communications" + ], + "description": "Gets an applicant's invite list", + "operationId": "getapplicantinvites", + "parameters": [ + { + "name": "applicantUserId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Invite" + } + } + } + } + }, + "404": { + "description": "Not Found" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/communications/invites/{page}/{pageSize}": { + "get": { + "tags": [ + "Communications" + ], + "description": "Get a list of sent invitations", + "operationId": "getinvites", + "parameters": [ + { + "name": "page", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "path", + "required": true, + "schema": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Invite" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + }, + "security": [ + { } + ] + } + }, + "/v1/api/communications/invite": { + "post": { + "tags": [ + "Communications" + ], + "description": "Trigger an invite to an organization or candidate (specifying NotificationPlatform)", + "operationId": "sendinvite", + "requestBody": { + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/InviteRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/Invite" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json; version=1": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "security": [ + { } + ] + } + } + }, + "components": { + "schemas": { + "Activity": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "approvedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "category": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "performedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + } + } + }, + "ActivityStatus": { + "type": "integer" + }, + "ApprovalStatus": { + "type": "integer" + }, + "Award": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "approvedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "Budget": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "approvedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "Contract": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "awardId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "externalSignatureId": { + "type": [ + "null", + "string" + ] + }, + "signedDocumentUrl": { + "type": [ + "null", + "string" + ] + }, + "effectiveAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "expiresAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "totalValue": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "status": { + "$ref": "#/components/schemas/ContractStatus" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + } + } + }, + "ContractStatus": { + "type": "integer" + }, + "CreateActivityRequest": { + "required": [ + "projectId", + "milestoneId", + "category", + "amount", + "title", + "description", + "performedAt" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "category": { + "type": "string" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "performedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + } + } + }, + "CreateAwardRequest": { + "required": [ + "organisationId", + "programmeId", + "amount" + ], + "type": "object", + "properties": { + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "CreateBudgetRequest": { + "required": [ + "projectId", + "name", + "amount" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "CreateContractRequest": { + "required": [ + "awardId", + "totalValue", + "effectiveAt", + "expiresAt" + ], + "type": "object", + "properties": { + "awardId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "totalValue": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "effectiveAt": { + "type": "string", + "format": "date-time" + }, + "expiresAt": { + "type": "string", + "format": "date-time" + } + } + }, + "CreateDisbursementRequest": { + "required": [ + "projectId", + "milestoneId", + "amount" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "CreateIndicatorRequest": { + "required": [ + "projectId", + "name", + "unitOfMeasure", + "baselineAmount", + "targetAmount" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "unitOfMeasure": { + "$ref": "#/components/schemas/UnitOfMeasure" + }, + "baselineAmount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "targetAmount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "CreateMilestoneRequest": { + "required": [ + "projectId", + "dueAt", + "name", + "priority" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "dueAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "priority": { + "$ref": "#/components/schemas/Priority" + } + } + }, + "CreateOrganisationRequest": { + "required": [ + "name", + "registrationNo", + "email" + ], + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "registrationNo": { + "type": "string" + }, + "email": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/OrganisationType" + } + } + }, + "CreatePortfolioRequest": { + "required": [ + "name", + "description", + "organisationId", + "ownerId" + ], + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "ownerId": { + "type": "string", + "format": "uuid" + } + } + }, + "CreateProgrammeRequest": { + "required": [ + "portfolioId", + "name", + "ownerId" + ], + "type": "object", + "properties": { + "portfolioId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string", + "format": "uuid" + } + } + }, + "CreateProjectRequest": { + "required": [ + "programmeId", + "name", + "description", + "sector", + "projectType" + ], + "type": "object", + "properties": { + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "sector": { + "$ref": "#/components/schemas/IndustrySector" + }, + "projectType": { + "$ref": "#/components/schemas/ProjectType" + } + } + }, + "CreateRiskRequest": { + "required": [ + "projectId", + "likelihood", + "impact", + "name", + "description" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "likelihood": { + "$ref": "#/components/schemas/RiskLikelihood" + }, + "impact": { + "$ref": "#/components/schemas/RiskImpact" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "Dashboard": { + "required": [ + "portfolioValue", + "activeAwards", + "disbursed", + "onTrackPercentage", + "atRiskCount", + "beneficiariesReached" + ], + "type": "object", + "properties": { + "portfolioValue": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "activeAwards": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32" + }, + "disbursed": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "onTrackPercentage": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "atRiskCount": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32" + }, + "beneficiariesReached": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32" + } + } + }, + "Disbursement": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "Evidence": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "indicatorId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "activityId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "version": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32" + }, + "type": { + "$ref": "#/components/schemas/EvidenceType" + }, + "documentUrl": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "EvidenceType": { + "type": "integer" + }, + "ExecuteContractRequest": { + "required": [ + "contractId", + "externalSignatureId", + "signedDocumentUrl" + ], + "type": "object", + "properties": { + "contractId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "externalSignatureId": { + "type": "string" + }, + "signedDocumentUrl": { + "type": "string" + } + } + }, + "Indicator": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "unitOfMeasure": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/UnitOfMeasure" + } + ] + }, + "baselineAmount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "targetAmount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + }, + "actualAmount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "IndustrySector": { + "type": "integer" + }, + "Instrument": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "code": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ActivityStatus" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + } + } + }, + "Invite": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "invitedOrganisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "awardId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "contractId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "recipient": { + "type": "string", + "format": "uuid" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + } + } + }, + "InviteRequest": { + "required": [ + "organisationId", + "invitedOrganisationId", + "awardId", + "contractId", + "recipient", + "message", + "platform" + ], + "type": "object", + "properties": { + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "invitedOrganisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "awardId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "contractId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "recipient": { + "type": "string", + "format": "uuid" + }, + "message": { + "type": "string" + }, + "platform": { + "$ref": "#/components/schemas/NotificationPlatform" + } + } + }, + "Milestone": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "dueAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + }, + "priority": { + "$ref": "#/components/schemas/Priority" + } + } + }, + "NotificationPlatform": { + "type": "integer" + }, + "Organisation": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "registrationNo": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "type": { + "$ref": "#/components/schemas/OrganisationType" + }, + "status": { + "$ref": "#/components/schemas/ActivityStatus" + } + } + }, + "OrganisationType": { + "type": "integer", + "default": 5 + }, + "Portfolio": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "ownedBy": { + "type": "string", + "format": "uuid" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + } + } + }, + "Priority": { + "type": "integer" + }, + "ProblemDetails": { + "type": "object", + "properties": { + "type": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "status": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int32" + }, + "detail": { + "type": [ + "null", + "string" + ] + }, + "instance": { + "type": [ + "null", + "string" + ] + } + } + }, + "Programme": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "portfolioId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "ownedBy": { + "type": "string", + "format": "uuid" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "Project": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "updatedBy": { + "type": [ + "null", + "string" + ], + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "startedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "endedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "sector": { + "$ref": "#/components/schemas/IndustrySector" + }, + "projectType": { + "$ref": "#/components/schemas/ProjectType" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "ProjectType": { + "type": "integer" + }, + "Risk": { + "type": "object", + "properties": { + "id": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "createdBy": { + "type": "string", + "format": "uuid" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "likelihood": { + "$ref": "#/components/schemas/RiskLikelihood" + }, + "impact": { + "$ref": "#/components/schemas/RiskImpact" + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + } + } + }, + "RiskImpact": { + "type": "integer" + }, + "RiskLikelihood": { + "type": "integer" + }, + "UnitOfMeasure": { + "type": "integer" + }, + "UpdateContractRequest": { + "required": [ + "contractId", + "status" + ], + "type": "object", + "properties": { + "contractId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "status": { + "$ref": "#/components/schemas/ContractStatus" + } + } + }, + "UpdateDisbursementRequest": { + "required": [ + "disbursementId", + "milestoneId", + "amount" + ], + "type": "object", + "properties": { + "disbursementId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "null", + "integer", + "string" + ], + "format": "int64" + }, + "amount": { + "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", + "type": [ + "number", + "string" + ], + "format": "double" + } + } + }, + "UpdateEvidenceRequest": { + "required": [ + "evidenceId", + "version", + "evidenceType", + "status" + ], + "type": "object", + "properties": { + "evidenceId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "version": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int32" + }, + "evidenceType": { + "$ref": "#/components/schemas/EvidenceType" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "UpdateMilestoneRequest": { + "required": [ + "milestoneId", + "dueAt", + "name", + "priority", + "status" + ], + "type": "object", + "properties": { + "milestoneId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "dueAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "priority": { + "$ref": "#/components/schemas/Priority" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "UpdateOrganisationRequest": { + "required": [ + "organisationId", + "name", + "registrationNo", + "email", + "type" + ], + "type": "object", + "properties": { + "organisationId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "registrationNo": { + "type": "string" + }, + "email": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/OrganisationType" + } + } + }, + "UpdatePortfolioRequest": { + "required": [ + "portfolioId", + "name", + "description", + "ownerId" + ], + "type": "object", + "properties": { + "portfolioId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ownerId": { + "type": "string", + "format": "uuid" + } + } + }, + "UpdateProgrammeRequest": { + "required": [ + "programmeId", + "name", + "ownerId", + "status" + ], + "type": "object", + "properties": { + "programmeId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string", + "format": "uuid" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "UpdateProjectRequest": { + "required": [ + "projectId", + "name", + "description", + "startedAt", + "endedAt", + "sector", + "projectType" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "startedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "endedAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "sector": { + "$ref": "#/components/schemas/IndustrySector" + }, + "projectType": { + "$ref": "#/components/schemas/ProjectType" + } + } + }, + "UpdateProjectStatusRequest": { + "required": [ + "projectId", + "status" + ], + "type": "object", + "properties": { + "projectId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "status": { + "$ref": "#/components/schemas/ApprovalStatus" + } + } + }, + "UpdateRiskRequest": { + "required": [ + "riskId", + "likelihood", + "impact", + "name", + "description" + ], + "type": "object", + "properties": { + "riskId": { + "pattern": "^-?(?:0|[1-9]\\d*)$", + "type": [ + "integer", + "string" + ], + "format": "int64" + }, + "likelihood": { + "$ref": "#/components/schemas/RiskLikelihood" + }, + "impact": { + "$ref": "#/components/schemas/RiskImpact" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "lastLoginAt": { + "type": [ + "null", + "string" + ], + "format": "date-time" + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "status": { + "$ref": "#/components/schemas/ActivityStatus" + } + } + }, + "UserFilterRequest": { + "type": "object", + "properties": { + "status": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/ActivityStatus" + } + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "sortBy": { + "type": [ + "null", + "string" + ] + }, + "sortDescending": { + "type": "boolean", + "default": false + } + } + } + }, + "securitySchemes": { + "Bearer": { + "type": "http", + "description": "JWT Authorization header using the Bearer scheme", + "scheme": "bearer" + }, + "OAuth2": { + "type": "oauth2", + "description": "Interactive OAuth2 flow for authentication and authorization", + "flows": { + "authorizationCode": { + "authorizationUrl": "https://sts.security.khongisa.co.za/connect/authorize", + "tokenUrl": "https://sts.security.khongisa.co.za/connect/token", + "scopes": { + "openid": "OpenID Connect", + "profile": "User Profile", + "roles": "User Roles", + "email": "User Email", + "address": "User Address", + "pfm-api-dev": "PFM API Scope" + } + } + } + } + } + }, + "tags": [ + { + "name": "Users" + }, + { + "name": "Tools" + }, + { + "name": "Projects" + }, + { + "name": "Grants" + }, + { + "name": "Governance" + }, + { + "name": "Execution" + }, + { + "name": "Evidence & M&E" + }, + { + "name": "Communications" + } + ] +} \ No newline at end of file diff --git a/PostFundManagement.ConsoleUI/src/components/layout/AppLayout.tsx b/PostFundManagement.ConsoleUI/src/components/layout/AppLayout.tsx index 32afa5a..d56c6bb 100644 --- a/PostFundManagement.ConsoleUI/src/components/layout/AppLayout.tsx +++ b/PostFundManagement.ConsoleUI/src/components/layout/AppLayout.tsx @@ -80,8 +80,12 @@ export const AppLayout: React.FC = () => { }); // Ensure current logged-in user is registered in the email cache - if (sub && (user?.email || claims.email)) { - registerUserEmail(sub, ((user?.email || claims.email) as string)); + const effectiveEmail = ((user?.email || claims?.email || claims?.['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] || claims?.upn) as string); + if (sub && effectiveEmail) { + registerUserEmail(sub, effectiveEmail); + } + if (user?.id && effectiveEmail) { + registerUserEmail(user.id, effectiveEmail); } // Extract name and email directly from validated token claims @@ -148,31 +152,20 @@ export const AppLayout: React.FC = () => { {navItems.map((item) => { const Icon = item.icon; return ( -
+ Inspect and verify deliverable evidence uploaded by awardees against project milestones and operational activities. + Review supporting documentation, download verified files, and authorize completion sign-offs. +
+Loading verification queue...
++ No deliverable evidence found for the chosen project, milestone, activity, or submitter. Try adjusting your filter parameters or search terms. +
++ File Version: v{inspectEvidence.version} • Size: {inspectEvidence.fileSize || '3.5 MB'} • Submitted: {formatDate(inspectEvidence.createdAt)} +
++ Signed canonical deliverable submitted by awardee {getUserEmail(inspectEvidence.createdBy)}. + Tamper-evident verification status: Valid cryptographic signature. +
++ Review the deliverable document against contractual requirements. If the evidence does not satisfy requirements, reject the submission using the endpoint action below. Approved evidence validates progress towards milestone completion. +
+ ++ {parsed.message} +
+ )} +{parsed.message}
- )} - - {/* Multiple errors from ProblemDetails displayed directly */} - {parsed.errorsList && parsed.errorsList.length > 1 && ( -diff --git a/PostFundManagement.ConsoleUI/src/components/ui/Toast.tsx b/PostFundManagement.ConsoleUI/src/components/ui/Toast.tsx index e4a741c..55ea192 100644 --- a/PostFundManagement.ConsoleUI/src/components/ui/Toast.tsx +++ b/PostFundManagement.ConsoleUI/src/components/ui/Toast.tsx @@ -155,16 +155,21 @@ const ToastCard: React.FC<{ )} - {/* Display errors directly if multiple, or single message directly */} - {toast.errorsList && toast.errorsList.length > 1 ? ( -
{toast.message}
+ )} +
{toast.message}
diff --git a/PostFundManagement.ConsoleUI/src/lib/formatters.ts b/PostFundManagement.ConsoleUI/src/lib/formatters.ts
index 07fef42..349551e 100644
--- a/PostFundManagement.ConsoleUI/src/lib/formatters.ts
+++ b/PostFundManagement.ConsoleUI/src/lib/formatters.ts
@@ -512,6 +512,7 @@ export const getRiskScoreColor = (likelihood: RiskLikelihood | number, impact: R
// ==========================================
const USER_EMAIL_CACHE: Record
+ Real-time portfolio overview, disbursement tracking, risk heatmap, and projects requiring governance action.
+
- Real-time portfolio overview, disbursement tracking, risk heatmap, and projects requiring governance action.
- Loading portfolios... Loading portfolios... No portfolios directly linked to this organisation. No portfolios directly linked to this organisation. {port.description} {portfolioFreshDetail?.description || selectedPortfolioForDetail?.description || 'None provided'}
- Drag & drop or browse files. Accepted formats: PDF, JPG, DOCX, XLSX (Max 25MB).
-
- Approval auto-triggers payment eligibility check.
-
- The integration sync endpoint provisions and synchronizes authenticated accounts with the backend security directory. To avoid hotspotting the backend during frequent navigation, synchronizations are locally persisted in the browser and refreshed on demand or when roles update.
+ The integration sync service provisions and synchronizes authenticated accounts with the backend security directory. To avoid hotspotting the backend during frequent navigation, synchronizations are locally persisted in the browser and refreshed on demand or when roles update.
- Executive Portfolio Dashboard
-
-
+ Executive Portfolio Dashboard
+
+
- Linked Portfolios (GET /v1/api/governance/organisations/{selectedOrgForDetail?.id}/portfolio)
- {orgPortfolios.length} linked
-
+ Linked Portfolios
+
+ {orgPortfolios.length} linked
+
+ Upload Evidence
- Attached Evidence (v2)
- {evidenceList.length} files loaded
- Programme Manager Review
-
-