openapi: 3.0.4 info: title: Bench AccountActivities ProjectWorkforceSpendReports API description: "

Versioning

\n

\n The API is currently at version 1.0. All API endpoints (other than\n authentication) require you to specify the API version as part of the path.\n

\n\n

URL Paths

\n

\n Authentication requests should be made to /auth/signin,\n as documented below. All other API requests should be made to\n sub-paths of /rp/api/1.0/....\n

\n\n

Authentication

\n

\n API requests are authenticated using an OAuth Bearer token.\n You can get a token by authenticating your user by sending a\n POST request to /auth/signin, with \"username and \"password\"\n parameters form-encoded in the body of the request.\n\n POST /auth/signin HTTP/1.1\n Content-Type: application/x-www-form-urlencoded\n\n username=user@example.com&password=some-secret-password\n

\n

\n The response will be a JSON object including both\n \"access_token\" and \"refresh_token\" property.\n All other requests against the Bench API should include an\n authorization header: Authorization: Bearer xxxYYYzzz,\n where xxxYYYzzz is the value of \"access_token\" in the response.\n

\n For example:\n\n $ curl https://bench.gobridgit.com/auth/signin -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'username=someone@example.com' --data-urlencode 'password=[...snip...]'\n {\n \"access_token\": \"...snip...\",\n \"token_type\": \"Bearer\",\n \"refresh_token\": \"...snip...\"\n \"expiry\": \"2020-01-01T00:00:00.413440849Z\"\n }\n\n

\n\n

\n The refresh token can be used to generate new session by request with /auth/token endpoint:\n\n POST /auth/token HTTP/1.1\n Content-Type: application/x-www-form-urlencoded\n\n grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA\n

\n

\n Note that once the refresh token is used, the previous access and refresh token is no longer valid.\n

\n For example:\n\n $ curl https://bench.gobridgit.com/auth/token -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=refresh_token' --data-urlencode 'refresh_token=[...snip...]'\n {\n \"access_token\": \"...snip...\",\n \"token_type\": \"Bearer\",\n \"refresh_token\": \"...snip...\"\n \"expiry\": \"2020-01-01T00:00:00.413440849Z\"\n }\n

\n\n

Pagination

\n

\n Several of the API endpoints are paginated. These are denoted by\n including the offset (zero-based offset) and limit query\n parameters. For example, to request the 10 items,\n set the offset=0 to limit=10.\n
\n NOTE: the result set contains items with index of 0-9\n
\n To request the next 10 items (starting at index 10),\n set the offset=10 to limit=10\n

\n

\n Responses to paginated API endpoints return a JSON array of objects.\n If there are results beyond the page you have requested, the server\n will set a query-has-more: true header in the response.\n

\n\n

Request Encoding

\n

\n GET and DELETE requests should have parameters encoded as URL query\n parameters. Boolean values should be encoded as true and\n false, not as 1 and 0.\n

\n\n

Errors

\n

\n Errors are returned for some response codes such as 400 Bad Request in the\n following format:\n\n {\n \"errors\": [\n {\n \"errorType\": \"ValidationError\",\n \"description\": \"The value of Name must be a string with a minimum length of 1 and a maximum length of 8 and not whitespace.\",\n \"field\": \"Name\",\n \"values\": [\n null\n ]\n }\n ],\n \"title\": \"One or more validation errors occurred.\",\n \"status\": 400,\n \"instance\": \"api/v1/accounts/0/persons\",\n \"requestUid\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n

\n" version: '1.0' servers: - url: https://bench.gobridgit.com description: Bridgit Bench production security: - {} tags: - name: ProjectWorkforceSpendReports paths: /rp/api/v1/accounts/{accountId}/projects/{projectId}/workforce-spend-reports/hours-breakdown: post: tags: - ProjectWorkforceSpendReports summary: Get the workforce spend reports (salaried only) on hours with breakdown, grouped by role name, period, then by assignee, given the project ID description: 'NOTE: If there are more workforce spend reports in the project than were returned, there will be a "query-has-more" header that will be set to true.
Permissions
Project: Read
Person: Read
Role: Read' operationId: ProjectWorkforceSpendReports_GetWorkforceSpendReportsBreakdownHours parameters: - name: accountId in: path description: The Account ID required: true schema: type: integer format: int32 - name: projectId in: path description: The project ID the workforce belongs to required: true schema: type: integer format: int64 requestBody: description: The request information for the workforce spend reports on hours with breakdown content: application/json-patch+json: schema: $ref: '#/components/schemas/BreakdownRequest' application/json: schema: $ref: '#/components/schemas/BreakdownRequest' text/json: schema: $ref: '#/components/schemas/BreakdownRequest' application/*+json: schema: $ref: '#/components/schemas/BreakdownRequest' required: true responses: '200': description: 'Success: Workforce spend hours breakdown in the project in the account' content: text/plain: schema: $ref: '#/components/schemas/HoursBreakdownResponse' application/json: schema: $ref: '#/components/schemas/HoursBreakdownResponse' text/json: schema: $ref: '#/components/schemas/HoursBreakdownResponse' '400': description: Bad Request '401': description: Unauthorized '403': description: Forbidden /rp/api/v1/accounts/{accountId}/projects/{projectId}/workforce-spend-reports/hours-overview: post: tags: - ProjectWorkforceSpendReports summary: Get the workforce spend reports (salaried only) on hours with overview on elapsed, remainder, grouped by role name, and assignee, given the project ID description: 'NOTE: If there are more workforce spend reports in the project than were returned, there will be a "query-has-more" header that will be set to true.
Permissions
Project: Read
Person: Read
Role: Read' operationId: ProjectWorkforceSpendReports_GetWorkforceSpendReportsOverviewHours parameters: - name: accountId in: path description: The Account ID required: true schema: type: integer format: int32 - name: projectId in: path description: The project ID the workforce belongs to required: true schema: type: integer format: int64 requestBody: description: The request information for the workforce spend reports on hours with overview content: application/json-patch+json: schema: $ref: '#/components/schemas/OverviewRequest' application/json: schema: $ref: '#/components/schemas/OverviewRequest' text/json: schema: $ref: '#/components/schemas/OverviewRequest' application/*+json: schema: $ref: '#/components/schemas/OverviewRequest' required: true responses: '200': description: 'Success: Workforce spend hours overview in the project in the account' content: text/plain: schema: $ref: '#/components/schemas/HoursOverviewResponse' application/json: schema: $ref: '#/components/schemas/HoursOverviewResponse' text/json: schema: $ref: '#/components/schemas/HoursOverviewResponse' '400': description: Bad Request '401': description: Unauthorized '403': description: Forbidden components: schemas: PersonWorkforceSpendHoursOverview: type: object properties: personId: type: integer format: int64 personName: type: string nullable: true personElapsedHours: type: integer format: int64 personRemainderHours: type: integer format: int64 personTotalHours: type: integer format: int64 additionalProperties: false RoleWorkforceSpendHoursOverview: type: object properties: roleNameId: type: integer format: int64 roleName: type: string nullable: true workforceSpendHoursElapsedFilled: type: integer format: int64 workforceSpendHoursElapsedUnfilled: type: integer format: int64 workforceSpendHoursRemainderFilled: type: integer format: int64 workforceSpendHoursRemainderUnfilled: type: integer format: int64 workforceSpendHoursElapsed: type: integer format: int64 workforceSpendHoursRemainder: type: integer format: int64 workforceSpendHoursTotal: type: integer format: int64 personWorkforceSpendHoursOverview: type: array items: $ref: '#/components/schemas/PersonWorkforceSpendHoursOverview' nullable: true additionalProperties: false PersonWorkforceSpendHoursBreakdown: type: object properties: personId: type: integer format: int64 personName: type: string nullable: true personWorkforceSpendHours: type: integer format: int64 additionalProperties: false HoursOverviewResponse: type: object properties: workforceSpendHoursOverview: type: array items: $ref: '#/components/schemas/RoleWorkforceSpendHoursOverview' nullable: true totalWorkforceSpendHoursElapsed: type: integer format: int64 totalWorkforceSpendHoursRemainder: type: integer format: int64 totalWorkforceSpendHours: type: integer format: int64 additionalProperties: false PeriodWorkforceSpendHoursBreakdown: type: object properties: startDate: type: string format: date-time endDate: type: string format: date-time personWorkforceSpendHoursBreakdown: type: array items: $ref: '#/components/schemas/PersonWorkforceSpendHoursBreakdown' nullable: true periodWorkforceSpendHoursFilled: type: integer format: int64 periodWorkforceSpendHoursUnfilled: type: integer format: int64 periodWorkforceSpendHoursTotal: type: integer format: int64 additionalProperties: false OverviewRequest: type: object properties: offset: type: integer format: int32 example: 0 limit: type: integer format: int32 example: 1000 startDate: type: string format: date-time example: '2020-01-01T00:00:00Z' endDate: type: string format: date-time example: '2021-12-31T00:00:00Z' relativeDate: type: string format: date-time example: '2020-08-01T00:00:00Z' roleNameIds: type: array items: type: integer format: int64 description: 'RoleNameIds to filter by. [] for all. [1, 2, 3]' nullable: true roleType: enum: - Salaried - Hourly - All type: string description: RoleType to filter by. Salaried by default. Hourly is not supported. salariedRoleType: enum: - Operations - Preconstruction - All type: string description: SalariedRoleType to filter by. All by default. opsPreconFilter: enum: - 0 - 1 - 2 - 3 type: integer description: ResourcePlanning.Contracts.OverviewRequest.OpsPreconFilter to filter by. ResourcePlanning.Contracts.OpsPreconFilter.OperationsPrecon by default. format: int32 additionalProperties: false HoursBreakdownResponse: type: object properties: workforceSpendHoursBreakdown: type: array items: $ref: '#/components/schemas/RoleWorkforceSpendHoursBreakdown' nullable: true totalWorkforceSpendHoursFilled: type: integer format: int64 totalWorkforceSpendHoursUnfilled: type: integer format: int64 totalWorkforceSpendHours: type: integer format: int64 additionalProperties: false RoleWorkforceSpendHoursBreakdown: type: object properties: roleNameId: type: integer format: int64 roleName: type: string nullable: true workforceSpendHoursFilled: type: integer format: int64 workforceSpendHoursUnfilled: type: integer format: int64 workforceSpendHoursTotal: type: integer format: int64 periodWorkforceSpendHoursBreakdown: type: array items: $ref: '#/components/schemas/PeriodWorkforceSpendHoursBreakdown' nullable: true additionalProperties: false BreakdownRequest: type: object properties: offset: type: integer format: int32 example: 0 limit: type: integer format: int32 example: 1000 startDate: type: string format: date-time example: '2020-01-01T00:00:00Z' endDate: type: string format: date-time example: '2021-12-31T00:00:00Z' period: enum: - Annual - Quarter - Month - Week type: string example: '0' bounded: type: boolean example: false roleNameIds: type: array items: type: integer format: int64 description: 'RoleNameIds to filter by. [] for all. [1, 2, 3]' nullable: true roleType: enum: - Salaried - Hourly - All type: string description: RoleType to filter by. Salaried by default. Hourly is not supported. salariedRoleType: enum: - Operations - Preconstruction - All type: string description: SalariedRoleType to filter by. All by default. opsPreconFilter: enum: - 0 - 1 - 2 - 3 type: integer description: ResourcePlanning.Contracts.BreakdownRequest.OpsPreconFilter to filter by. ResourcePlanning.Contracts.OpsPreconFilter.OperationsPrecon by default. format: int32 additionalProperties: false securitySchemes: Bearer: type: http description: Standard Authorization header using the Bearer scheme scheme: bearer bearerFormat: JWT