openapi: 3.0.3 info: title: My24Service API version: 1.0.0 description: My24Service API documentation paths: /api/accounts/change-password/: post: operationId: accounts_change_password_create description: Change the user password. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/ChangePasswordRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ChangePasswordRequest' multipart/form-data: schema: $ref: '#/components/schemas/ChangePasswordRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ChangePassword' description: '' /api/accounts/login/: post: operationId: accounts_login_create description: Logs in the user via given login and password. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/DefaultLoginRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DefaultLoginRequest' multipart/form-data: schema: $ref: '#/components/schemas/DefaultLoginRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/DefaultLogin' description: '' /api/accounts/logout/: post: operationId: accounts_logout_create description: |- Logs out the user. returns an error if the user is not authenticated. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/LogoutRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LogoutRequest' multipart/form-data: schema: $ref: '#/components/schemas/LogoutRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Logout' description: '' /api/accounts/register/: post: operationId: accounts_register_create description: Register new user. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/StudentUserRegisterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StudentUserRegisterRequest' multipart/form-data: schema: $ref: '#/components/schemas/StudentUserRegisterRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUserRegister' description: '' /api/accounts/register-email/: post: operationId: accounts_register_email_create description: Register new email. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/DefaultRegisterEmailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DefaultRegisterEmailRequest' multipart/form-data: schema: $ref: '#/components/schemas/DefaultRegisterEmailRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DefaultRegisterEmail' description: '' /api/accounts/reset-password/: post: operationId: accounts_reset_password_create description: Reset password, given the signature and timestamp from the link. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/ResetPasswordRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ResetPasswordRequest' multipart/form-data: schema: $ref: '#/components/schemas/ResetPasswordRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResetPassword' description: '' /api/accounts/send-reset-password-link/: post: operationId: accounts_send_reset_password_link_create description: Send email with reset password link. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/SendResetPasswordLinkRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SendResetPasswordLinkRequest' multipart/form-data: schema: $ref: '#/components/schemas/SendResetPasswordLinkRequest' security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/SendResetPasswordLink' description: '' /api/accounts/verify-email/: post: operationId: accounts_verify_email_create description: Verify email via signature. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/VerifyEmailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/VerifyEmailRequest' multipart/form-data: schema: $ref: '#/components/schemas/VerifyEmailRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/VerifyEmail' description: '' /api/accounts/verify-registration/: post: operationId: accounts_verify_registration_create description: Verify registration via signature. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/VerifyRegistrationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/VerifyRegistrationRequest' multipart/form-data: schema: $ref: '#/components/schemas/VerifyRegistrationRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/VerifyRegistration' description: '' /api/change-password/: post: operationId: change_password_create tags: - change-password requestBody: content: application/json: schema: $ref: '#/components/schemas/ChangePasswordRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ChangePasswordRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/ChangePasswordRequestRequest' required: true security: - {} responses: '200': description: No response body /api/company/activity/: get: operationId: company_activity_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -text - created - text description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedActivityList' description: '' post: operationId: company_activity_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/ActivityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ActivityRequest' multipart/form-data: schema: $ref: '#/components/schemas/ActivityRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Activity' description: '' /api/company/activity/{id}/: get: operationId: company_activity_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this activity. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Activity' description: '' patch: operationId: company_activity_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this activity. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedActivityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedActivityRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedActivityRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Activity' description: '' delete: operationId: company_activity_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this activity. required: true tags: - company responses: '204': description: No response body /api/company/apiuser/: get: operationId: company_apiuser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedApiUserList' description: '' post: operationId: company_apiuser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/ApiUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ApiUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/ApiUserRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/ApiUser' description: '' /api/company/apiuser/{id}/: get: operationId: company_apiuser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ApiUser' description: '' patch: operationId: company_apiuser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedApiUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedApiUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedApiUserRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ApiUser' description: '' delete: operationId: company_apiuser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/apiuser/{id}/renew_token/: post: operationId: company_apiuser_renew_token_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/ApiUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ApiUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/ApiUserRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/company/apiuser/{id}/revoke/: post: operationId: company_apiuser_revoke_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/company/apiuser/dummy_endpoint/: get: operationId: company_apiuser_dummy_endpoint_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/company/branch/: get: operationId: company_branch_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -address - -city - -contact - -country_code - -name - -tel - address - city - contact - country_code - name - tel description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedBranchList' description: '' post: operationId: company_branch_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/BranchRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BranchRequest' multipart/form-data: schema: $ref: '#/components/schemas/BranchRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' /api/company/branch-my/: get: operationId: company_branch_my_retrieve description: GET + PATCH single-object view; no PUT. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' patch: operationId: company_branch_my_partial_update description: GET + PATCH single-object view; no PUT. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedBranchRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedBranchRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedBranchRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' /api/company/branch/{id}/: get: operationId: company_branch_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this branch. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' patch: operationId: company_branch_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this branch. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedBranchRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedBranchRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedBranchRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' delete: operationId: company_branch_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this branch. required: true tags: - company responses: '204': description: No response body /api/company/branch/{id}/dashboard/: get: operationId: company_branch_dashboard_retrieve description: 'One payload for the branch view: the branch head, one page of its orders, and the four stats blocks the insights tab charts.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this branch. required: true - in: query name: orders_page schema: type: integer description: Orders page number (20 rows per page, default 1). - in: query name: orders_search schema: type: string description: Free-text filter on the orders page; matches the order list ?q=. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/BranchDashboardResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/company/branch/autocomplete/: get: operationId: company_branch_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: id schema: type: string description: Only the branches with these primary keys, comma-separated - the rows behind a filter a client restores from a URL. - in: query name: q schema: type: string description: Case-insensitive substring match on name, address, city or email. tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/BranchAutocomplete' description: '' /api/company/branch/first/: get: operationId: company_branch_first_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Branch' description: '' /api/company/budget/: get: operationId: company_budget_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedBudgetList' description: '' post: operationId: company_budget_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/BudgetRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BudgetRequest' multipart/form-data: schema: $ref: '#/components/schemas/BudgetRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Budget' description: '' /api/company/budget/{id}/: get: operationId: company_budget_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this budget. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Budget' description: '' patch: operationId: company_budget_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this budget. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedBudgetRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedBudgetRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedBudgetRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Budget' description: '' delete: operationId: company_budget_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this budget. required: true tags: - company responses: '204': description: No response body /api/company/budget/{id}/costs/: get: operationId: company_budget_costs_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this budget. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/BudgetCostsResponse' description: '' /api/company/budget/{id}/expected_costs/: get: operationId: company_budget_expected_costs_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this budget. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/BudgetExpectedCostsResponse' description: '' /api/company/customeruser/: get: operationId: company_customeruser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedCustomerUserList' description: '' post: operationId: company_customeruser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CustomerUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/CustomerUserRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/CustomerUser' description: '' /api/company/customeruser/{id}/: get: operationId: company_customeruser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerUser' description: '' patch: operationId: company_customeruser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedCustomerUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedCustomerUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedCustomerUserRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerUser' description: '' delete: operationId: company_customeruser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/dispatch-assignedorders-user-list-v4/: get: operationId: company_dispatch_assignedorders_user_list_v4_retrieve description: |- return response for dispatch view: [ { 'assignedorders': [], 'full_name': 'blabla', 'is_partner': True/False } ] parameters: - in: query name: start_date schema: type: string format: date description: First day of the window; defaults to today. tags: - company responses: '200': content: application/json: schema: type: object description: '{''data'': [row]} - one row per user with assigned orders in the date window. Own users and partner users differ in id types (integers vs "tenantid_userid" strings) and in which keys they carry; v4 adds leave/sick to own-user rows.' properties: data: type: array items: type: object additionalProperties: true properties: full_name: type: string is_partner: type: boolean assignedorders: type: array items: {} required: - full_name - is_partner - assignedorders required: - data description: '' /api/company/employeeuser/: get: operationId: company_employeeuser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEmployeeUserList' description: '' post: operationId: company_employeeuser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EmployeeUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EmployeeUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/EmployeeUserRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/EmployeeUser' description: '' /api/company/employeeuser/{id}/: get: operationId: company_employeeuser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmployeeUser' description: '' patch: operationId: company_employeeuser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEmployeeUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEmployeeUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEmployeeUserRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmployeeUser' description: '' delete: operationId: company_employeeuser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/engineer/: get: operationId: company_engineer_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEngineerList' description: '' post: operationId: company_engineer_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Engineer' description: '' /api/company/engineer-event-type/: get: operationId: company_engineer_event_type_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEngineerEventTypeList' description: '' post: operationId: company_engineer_event_type_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerEventTypeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerEventTypeRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerEventTypeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/EngineerEventType' description: '' /api/company/engineer-event-type/{id}/: get: operationId: company_engineer_event_type_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer event type. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerEventType' description: '' patch: operationId: company_engineer_event_type_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer event type. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEngineerEventTypeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEngineerEventTypeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEngineerEventTypeRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerEventType' description: '' delete: operationId: company_engineer_event_type_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer event type. required: true tags: - company responses: '204': description: No response body /api/company/engineer-event-type/stats/: get: operationId: company_engineer_event_type_stats_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: engineer schema: type: integer - name: q required: false in: query description: A search term. schema: type: string - in: query name: year schema: type: integer tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/EngineerEventType' description: '' /api/company/engineer-export-xls/: get: operationId: company_engineer_export_xls_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. tags: - company responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/company/engineer/{id}/: get: operationId: company_engineer_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Engineer' description: '' patch: operationId: company_engineer_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEngineerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEngineerRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEngineerRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Engineer' description: '' delete: operationId: company_engineer_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/engineer/{id}/info/: get: operationId: company_engineer_info_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Engineer' description: '' /api/company/engineer/{id}/store_lon_lat/: post: operationId: company_engineer_store_lon_lat_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/engineer/device/: get: operationId: company_engineer_device_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerDeviceResponse' description: '' /api/company/engineer/get_locations/: get: operationId: company_engineer_get_locations_list description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/EngineerLocation' description: '' /api/company/engineer/list-for-select/: get: operationId: company_engineer_list_for_select_list tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/EngineerForSelect' description: '' /api/company/engineerevent/: get: operationId: company_engineerevent_list parameters: - in: query name: engineer schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - company security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEngineerEventList' description: '' post: operationId: company_engineerevent_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerEventRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerEventRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerEventRequest' required: true security: - {} responses: '201': content: application/json: schema: type: integer description: '' /api/company/engineerevent-update/{id}/: get: operationId: company_engineerevent_update_retrieve description: GET + PATCH single-object view; no PUT. parameters: - in: path name: id schema: type: integer required: true tags: - company security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerEvent' description: '' patch: operationId: company_engineerevent_update_partial_update description: GET + PATCH single-object view; no PUT. parameters: - in: path name: id schema: type: integer required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEngineerEventAttachOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEngineerEventAttachOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEngineerEventAttachOrderRequest' security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/engineerevent/{id}/: delete: operationId: company_engineerevent_destroy parameters: - in: path name: id schema: type: integer required: true tags: - company security: - {} responses: '204': description: No response body /api/company/engineerevent/{id}/create-order/: post: operationId: company_engineerevent_create_order_create description: |- Atomic replacement for the order-create + assign-user + attach-to-event sequence `EngineerEventOrderForm.vue` used to do as three separate requests. A failure at any step (order validation, assignment, or the `handle_event` statuscode/measurement side effects) rolls the whole thing back, so a retry after a failure cannot leave an orphan order behind. The request body is the order-create body (`order_create_serializer_for_tenant`, plus `notify_user`); this view carries no separate `order` envelope key, because a POST body here is already a create-order body and nothing else. Order-field validation errors therefore come back wrapped as `{'order': {: [...]}}` - one level of nesting so a caller can tell an order-field error apart from anything this endpoint might validate about the event itself in the future. `engineer` is not a body field: `EngineerEvent.engineer` already names it, and the order is always assigned to that engineer - unlike `assign-user//`, which can assign any role's submodel to any order, this endpoint only ever assigns the event's own engineer to the order it just created. `notify_user` is a body boolean defaulting to true: send the engineer the same websocket notification `assign-user//?notify_user=1` sends (see `AssignUserView.post`). Pass `notify_user: false` to skip it. Same permission class as the sibling engineer-event views (`EngineerEventListCreate`, `EngineerEventUpdate`): `AllowAny`, because the mobile app calls these without a planning session either. parameters: - in: path name: id schema: type: integer required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerEventCreateOrderRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerEventCreateOrderRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerEventCreateOrderRequestRequest' security: - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/EngineerEventCreateOrderResponse' description: '' '400': content: application/json: schema: $ref: '#/components/schemas/EngineerEventCreateOrderError' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' /api/company/events-export-xls/: get: operationId: company_events_export_xls_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. tags: - company responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/company/iban-check/: post: operationId: company_iban_check_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/IbanCheckRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/IbanCheckRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/IbanCheckRequestRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/IbanValidation' description: '' /api/company/import/: get: operationId: company_import_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedImportList' description: '' post: operationId: company_import_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/ImportRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ImportRequest' multipart/form-data: schema: $ref: '#/components/schemas/ImportRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Import' description: '' /api/company/import/{id}/: get: operationId: company_import_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Import' description: '' patch: operationId: company_import_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedImportRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedImportRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedImportRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Import' description: '' delete: operationId: company_import_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company responses: '204': description: No response body /api/company/import/{id}/do/: post: operationId: company_import_do_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ImportResult' description: '' /api/company/import/{id}/preview/: get: operationId: company_import_preview_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ImportResult' description: '' /api/company/import/{id}/revert/: post: operationId: company_import_revert_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this import. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ImportRevert' description: '' /api/company/import/get_allowed_extensions/: get: operationId: company_import_get_allowed_extensions_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: type: array items: type: string description: '' /api/company/import/get_lookup_fields/: get: operationId: company_import_get_lookup_fields_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: '' /api/company/import/required/: get: operationId: company_import_required_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: '' /api/company/leave-type/: get: operationId: company_leave_type_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedLeaveTypeList' description: '' post: operationId: company_leave_type_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/LeaveTypeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LeaveTypeRequest' multipart/form-data: schema: $ref: '#/components/schemas/LeaveTypeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/LeaveType' description: '' /api/company/leave-type/{id}/: get: operationId: company_leave_type_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this leave type. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/LeaveType' description: '' patch: operationId: company_leave_type_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this leave type. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedLeaveTypeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedLeaveTypeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedLeaveTypeRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/LeaveType' description: '' delete: operationId: company_leave_type_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this leave type. required: true tags: - company responses: '204': description: No response body /api/company/leave-type/list_for_select/: get: operationId: company_leave_type_list_for_select_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/LeaveType' description: '' /api/company/partner/: get: operationId: company_partner_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -partner__name - created - partner__name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPartnerDetailList' description: '' post: operationId: company_partner_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PartnerDetailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PartnerDetailRequest' multipart/form-data: schema: $ref: '#/components/schemas/PartnerDetailRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/PartnerDetail' description: '' /api/company/partner-request/: get: operationId: company_partner_request_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPartnerRequestList' description: '' post: operationId: company_partner_request_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PartnerRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PartnerRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/PartnerRequestRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PartnerRequest' description: '' /api/company/partner-request/{id}/: get: operationId: company_partner_request_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner request. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerRequest' description: '' patch: operationId: company_partner_request_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner request. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPartnerRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPartnerRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPartnerRequestRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerRequest' description: '' delete: operationId: company_partner_request_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner request. required: true tags: - company responses: '204': description: No response body /api/company/partner-request/{id}/accept/: patch: operationId: company_partner_request_accept_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner request. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/company/partner-request/{id}/reject/: patch: operationId: company_partner_request_reject_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner request. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/company/partner-request/received/: get: operationId: company_partner_request_received_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -from_member__name - -status - -to_member__name - created - from_member__name - status - to_member__name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPartnerRequestList' description: '' /api/company/partner-request/sent/: get: operationId: company_partner_request_sent_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -from_member__name - -status - -to_member__name - created - from_member__name - status - to_member__name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPartnerRequestList' description: '' post: operationId: company_partner_request_sent_create description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -from_member__name - -status - -to_member__name - created - from_member__name - status - to_member__name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PartnerRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PartnerRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/PartnerRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPartnerRequestList' description: '' /api/company/partner/{id}/: get: operationId: company_partner_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerDetail' description: '' patch: operationId: company_partner_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPartnerDetailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPartnerDetailRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPartnerDetailRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerDetail' description: '' delete: operationId: company_partner_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company responses: '204': description: No response body /api/company/partner/{id}/branch_create_from_customer/: post: operationId: company_partner_branch_create_from_customer_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' multipart/form-data: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerBranchCreateFromCustomer' description: '' /api/company/partner/{id}/branches/: get: operationId: company_partner_branches_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerBranches' description: '' /api/company/partner/{id}/copy_customer_orders/: post: operationId: company_partner_copy_customer_orders_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this partner. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' multipart/form-data: schema: $ref: '#/components/schemas/PartnerCustomerIdRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/PartnerCopyCustomerOrders' description: '' /api/company/picture/: get: operationId: company_picture_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: ordering schema: type: array items: type: string enum: - -created - -name - created - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPictureList' description: '' post: operationId: company_picture_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PictureRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PictureRequest' multipart/form-data: schema: $ref: '#/components/schemas/PictureRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Picture' description: '' /api/company/picture/{id}/: get: operationId: company_picture_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this picture. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Picture' description: '' patch: operationId: company_picture_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this picture. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPictureRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPictureRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPictureRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Picture' description: '' delete: operationId: company_picture_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this picture. required: true tags: - company responses: '204': description: No response body /api/company/planninguser/: get: operationId: company_planninguser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPlanningUserList' description: '' post: operationId: company_planninguser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PlanningUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PlanningUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PlanningUserRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PlanningUser' description: '' /api/company/planninguser/{id}/: get: operationId: company_planninguser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PlanningUser' description: '' patch: operationId: company_planninguser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPlanningUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPlanningUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPlanningUserRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PlanningUser' description: '' delete: operationId: company_planninguser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/project/: get: operationId: company_project_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: name schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedProjectList' description: '' post: operationId: company_project_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/ProjectRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectRequest' multipart/form-data: schema: $ref: '#/components/schemas/ProjectRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /api/company/project/{id}/: get: operationId: company_project_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this project. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' patch: operationId: company_project_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this project. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedProjectRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedProjectRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedProjectRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' delete: operationId: company_project_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this project. required: true tags: - company responses: '204': description: No response body /api/company/project/list_for_select/: get: operationId: company_project_list_for_select_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: name schema: type: string - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Project' description: '' /api/company/public-pictures/: get: operationId: company_public_pictures_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - company security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPicturePublicList' description: '' /api/company/salesuser/: get: operationId: company_salesuser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSalesUserList' description: '' post: operationId: company_salesuser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/SalesUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SalesUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/SalesUserRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SalesUser' description: '' /api/company/salesuser/{id}/: get: operationId: company_salesuser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SalesUser' description: '' patch: operationId: company_salesuser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSalesUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSalesUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSalesUserRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SalesUser' description: '' delete: operationId: company_salesuser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/salesusercustomer/: get: operationId: company_salesusercustomer_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: user schema: type: integer tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSalesUserCustomerExpandedList' description: '' post: operationId: company_salesusercustomer_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/SalesUserCustomerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SalesUserCustomerRequest' multipart/form-data: schema: $ref: '#/components/schemas/SalesUserCustomerRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SalesUserCustomer' description: '' /api/company/salesusercustomer/{id}/: get: operationId: company_salesusercustomer_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SalesUserCustomer' description: '' patch: operationId: company_salesusercustomer_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SalesUserCustomer' description: '' delete: operationId: company_salesusercustomer_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company responses: '204': description: No response body /api/company/salesusercustomer/my/: get: operationId: company_salesusercustomer_my_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSalesUserCustomerExpandedList' description: '' post: operationId: company_salesusercustomer_my_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/SalesUserMyCustomerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SalesUserMyCustomerRequest' multipart/form-data: schema: $ref: '#/components/schemas/SalesUserMyCustomerRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SalesUserMyCustomer' description: '' /api/company/salesusercustomer/my/{id}/: get: operationId: company_salesusercustomer_my_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/SalesUserCustomerExpanded' description: '' patch: operationId: company_salesusercustomer_my_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerExpandedRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerExpandedRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSalesUserCustomerExpandedRequest' responses: '400': description: No response body delete: operationId: company_salesusercustomer_my_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this sales user customer. required: true tags: - company responses: '204': description: No response body /api/company/stream-info/: get: operationId: company_stream_info_retrieve tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/StreamInfoResponse' description: '' /api/company/stream-private-channel-create/: post: operationId: company_stream_private_channel_create_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/CreatePrivateChannelRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CreatePrivateChannelRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/CreatePrivateChannelRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ChannelCreatedResponse' description: '' /api/company/student-export-xls/: get: operationId: company_student_export_xls_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. tags: - company responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/company/studentuser/: get: operationId: company_studentuser_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedStudentUserList' description: '' post: operationId: company_studentuser_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/StudentUserWriteRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StudentUserWriteRequest' multipart/form-data: schema: $ref: '#/components/schemas/StudentUserWriteRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/StudentUser' description: '' /api/company/studentuser/{id}/: get: operationId: company_studentuser_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUser' description: '' patch: operationId: company_studentuser_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUser' description: '' delete: operationId: company_studentuser_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user. required: true tags: - company responses: '204': description: No response body /api/company/template/: get: operationId: company_template_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: name schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTemplateList' description: '' post: operationId: company_template_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/TemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/TemplateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Template' description: '' /api/company/template/{id}/: get: operationId: company_template_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this template. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/Template' description: '' patch: operationId: company_template_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this template. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTemplateRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Template' description: '' delete: operationId: company_template_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this template. required: true tags: - company responses: '204': description: No response body /api/company/template/preview_template_pdf/: post: operationId: company_template_preview_template_pdf_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/TemplatePreviewRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TemplatePreviewRequest' multipart/form-data: schema: $ref: '#/components/schemas/TemplatePreviewRequest' required: true responses: '200': content: application/pdf: schema: type: string format: binary description: '' /api/company/time-registration/: get: operationId: company_time_registration_retrieve parameters: - in: query name: mode schema: type: string description: 'Window shown: week (default), month or year.' - in: query name: month schema: type: integer description: Calendar month (1-12) the window is computed for. Honoured for month. - in: query name: start_date schema: type: string description: Anchor date (YYYY-MM-DD); the window is computed from it. Honoured for week and month, ignored for year. - in: query name: user schema: type: integer description: User id the totals are computed for. Planning/staff only; everyone else always sees their own rows. - in: query name: year schema: type: integer description: Calendar year the window is computed for. Honoured for month and year. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/TimeRegistrationListResponse' description: '' /api/company/time-registration/time-correction/{id}/: patch: operationId: company_time_registration_time_correction_partial_update description: GET + PATCH single-object view; no PUT. parameters: - in: path name: id schema: type: integer required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTimeCorrectionRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTimeCorrectionRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTimeCorrectionRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/time-registration/top-users-for-customer/: get: operationId: company_time_registration_top_users_for_customer_retrieve parameters: - in: query name: customer schema: type: integer description: Only rows for this customer id. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/TopUsersForCustomerResponse' description: '' /api/company/user-device-token/: post: operationId: company_user_device_token_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/DeviceTokenRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DeviceTokenRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/DeviceTokenRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeviceTokenCreated' description: '' /api/company/user-info-me/: get: operationId: company_user_info_me_retrieve tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserInfoResponse' description: '' /api/company/user-info/{id}/: get: operationId: company_user_info_retrieve parameters: - in: path name: id schema: type: integer required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserInfoDetailResponse' description: '' /api/company/user-leave-hours/: get: operationId: company_user_leave_hours_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserLeaveHoursList' description: '' post: operationId: company_user_leave_hours_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' /api/company/user-leave-hours/{id}/: get: operationId: company_user_leave_hours_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' patch: operationId: company_user_leave_hours_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursNoPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursNoPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursNoPlanningRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' delete: operationId: company_user_leave_hours_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '204': description: No response body /api/company/user-leave-hours/admin/: get: operationId: company_user_leave_hours_admin_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserLeaveHoursList' description: '' post: operationId: company_user_leave_hours_admin_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLeaveHoursPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLeaveHoursPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLeaveHoursPlanningRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' /api/company/user-leave-hours/admin/{id}/: get: operationId: company_user_leave_hours_admin_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' patch: operationId: company_user_leave_hours_admin_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserLeaveHoursPlanningRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserLeaveHours' description: '' delete: operationId: company_user_leave_hours_admin_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '204': description: No response body /api/company/user-leave-hours/admin/{id}/set_accepted/: post: operationId: company_user_leave_hours_admin_set_accepted_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/user-leave-hours/admin/{id}/set_rejected/: post: operationId: company_user_leave_hours_admin_set_rejected_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user leave hours. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/user-leave-hours/admin/all_not_accepted/: get: operationId: company_user_leave_hours_admin_all_not_accepted_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserLeaveHoursList' description: '' /api/company/user-leave-hours/admin/all_not_accepted_count/: get: operationId: company_user_leave_hours_admin_all_not_accepted_count_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/company/user-leave-hours/admin/get_totals/: post: operationId: company_user_leave_hours_admin_get_totals_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/LeaveHoursTotals' description: '' /api/company/user-leave-hours/all_not_accepted/: get: operationId: company_user_leave_hours_all_not_accepted_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserLeaveHoursList' description: '' /api/company/user-leave-hours/all_not_accepted_count/: get: operationId: company_user_leave_hours_all_not_accepted_count_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/company/user-leave-hours/get_totals/: post: operationId: company_user_leave_hours_get_totals_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLeaveHoursNoPlanningRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/LeaveHoursTotals' description: '' /api/company/user-list/: get: operationId: company_user_list_list parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on username, first name or last name. - in: query name: user_type schema: type: string enum: - sales_user - planning_user - customer_user - engineer - student_user - api_user - employee_user description: Only users carrying this user-type submodel. tags: - company responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/UserSelectRow' description: '' /api/company/user-settings/: get: operationId: company_user_settings_retrieve description: GET + PATCH single-object view; no PUT. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/AppUserSettings' description: '' patch: operationId: company_user_settings_partial_update description: GET + PATCH single-object view; no PUT. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAppUserSettingsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAppUserSettingsRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAppUserSettingsRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AppUserSettings' description: '' /api/company/user-sick-leave/: get: operationId: company_user_sick_leave_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserSickLeaveList' description: '' post: operationId: company_user_sick_leave_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserSickLeaveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserSickLeaveRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserSickLeaveRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' /api/company/user-sick-leave/{id}/: get: operationId: company_user_sick_leave_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' patch: operationId: company_user_sick_leave_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' delete: operationId: company_user_sick_leave_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '204': description: No response body /api/company/user-sick-leave/admin/: get: operationId: company_user_sick_leave_admin_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: user schema: type: integer tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserSickLeaveList' description: '' post: operationId: company_user_sick_leave_admin_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserSickLeaveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserSickLeaveRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserSickLeaveRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' /api/company/user-sick-leave/admin/{id}/: get: operationId: company_user_sick_leave_admin_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' patch: operationId: company_user_sick_leave_admin_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserSickLeaveRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserSickLeave' description: '' delete: operationId: company_user_sick_leave_admin_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '204': description: No response body /api/company/user-sick-leave/admin/{id}/end_sick/: post: operationId: company_user_sick_leave_admin_end_sick_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/user-sick-leave/admin/{id}/set_confirmed/: post: operationId: company_user_sick_leave_admin_set_confirmed_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user sick leave. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/user-sick-leave/admin/all_sick/: get: operationId: company_user_sick_leave_admin_all_sick_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: user schema: type: integer tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserSickLeaveList' description: '' /api/company/user-sick-leave/admin/all_sick_count/: get: operationId: company_user_sick_leave_admin_all_sick_count_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/company/user-sick-leave/admin/all_unconfirmed/: get: operationId: company_user_sick_leave_admin_all_unconfirmed_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: user schema: type: integer tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserSickLeaveList' description: '' /api/company/user-sick-leave/admin/all_unconfirmed_count/: get: operationId: company_user_sick_leave_admin_all_unconfirmed_count_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/company/user-sick-leave/end_sick/: post: operationId: company_user_sick_leave_end_sick_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserSickLeaveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserSickLeaveRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserSickLeaveRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/company/user-workhours/: get: operationId: company_user_workhours_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string description: First day of the week shown (YYYY-MM-DD); defaults to today. - in: query name: user schema: type: integer tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserWorkHoursList' description: '' post: operationId: company_user_workhours_create description: Viewset that supports all normal viewset functionality. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/UserWorkHoursRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserWorkHoursRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserWorkHoursRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserWorkHours' description: '' /api/company/user-workhours/{id}/: get: operationId: company_user_workhours_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user work hours. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserWorkHours' description: '' patch: operationId: company_user_workhours_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user work hours. required: true tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserWorkHoursRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserWorkHoursRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserWorkHoursRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserWorkHours' description: '' delete: operationId: company_user_workhours_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user work hours. required: true tags: - company responses: '204': description: No response body /api/company/user-workhours/list_totals/: get: operationId: company_user_workhours_list_totals_retrieve description: Viewset that supports all normal viewset functionality. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserWorkHoursListTotalsResponse' description: '' /api/company/user/delete-me/{id}/: delete: operationId: company_user_delete_me_destroy parameters: - in: path name: id schema: type: integer required: true tags: - company responses: '204': description: No response body '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/company/username-exists/: get: operationId: company_username_exists_retrieve parameters: - in: query name: username schema: type: string description: The username to check. required: true tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/AvailabilityResponse' description: '' /api/company/users/student/profile/{uuid}/: get: operationId: company_users_student_profile_retrieve parameters: - in: path name: uuid schema: type: string pattern: ^[^/]+$ required: true tags: - company security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUserUserPublic' description: '' /api/company/users/student/profile/me/: get: operationId: company_users_student_profile_me_retrieve description: GET + PATCH single-object view; no PUT. tags: - company responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUser' description: '' patch: operationId: company_users_student_profile_me_partial_update description: GET + PATCH single-object view; no PUT. tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedStudentUserWriteRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/StudentUser' description: '' /api/company/users/student/register/fetch-user/: post: operationId: company_users_student_register_fetch_user_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/WordPressUserFetchRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/WordPressUserFetchRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/WordPressUserFetchRequestRequest' required: true security: - {} responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever WordPress keeps for this user. description: '' /api/company/users/verify-recaptcha/: post: operationId: company_users_verify_recaptcha_create tags: - company requestBody: content: application/json: schema: $ref: '#/components/schemas/RecaptchaVerifyRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/RecaptchaVerifyRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/RecaptchaVerifyRequestRequest' required: true security: - {} responses: '200': content: application/json: schema: type: object additionalProperties: true description: Google's siteverify answer, forwarded verbatim. description: '' /api/connector/gripp-settings/: get: operationId: connector_gripp_settings_retrieve description: The Gripp connector settings of the tenant; secrets are write-only. tags: - connector responses: '200': content: application/json: schema: $ref: '#/components/schemas/GrippSettings' description: '' patch: operationId: connector_gripp_settings_partial_update description: The Gripp connector settings of the tenant; secrets are write-only. tags: - connector requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedGrippSettingsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedGrippSettingsRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedGrippSettingsRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/GrippSettings' description: '' /api/customer/customer/: get: operationId: customer_customer_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: city schema: type: string - in: query name: contact schema: type: string - in: query name: name schema: type: string - in: query name: num_orders schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -city - -customer_id - -name - -num_orders - -remarks - city - customer_id - name - num_orders - remarks description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: remarks schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: name, city, num_orders, remarks, customer_id.' tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedCustomerList' description: '' post: operationId: customer_customer_create description: Create a customer parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CustomerCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/CustomerCreateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/CustomerCreate' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/customer/customer-my/: get: operationId: customer_customer_my_retrieve description: GET + PATCH single-object view; no PUT. tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/Customer' description: '' patch: operationId: customer_customer_my_partial_update description: GET + PATCH single-object view; no PUT. tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedCustomerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedCustomerRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedCustomerRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Customer' description: '' /api/customer/customer/{id}/: get: operationId: customer_customer_retrieve description: Get a customer parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this customer. required: true tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/Customer' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' patch: operationId: customer_customer_partial_update description: Partially update a customer parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this customer. required: true tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedCustomerRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedCustomerRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedCustomerRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Customer' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' delete: operationId: customer_customer_destroy description: Delete a customer parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this customer. required: true tags: - customer responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' /api/customer/customer/{id}/custom_detail/: get: operationId: customer_customer_custom_detail_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this customer. required: true tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/Customer' description: '' /api/customer/customer/{id}/dashboard/: get: operationId: customer_customer_dashboard_retrieve description: 'One payload for the customer view: the customer head, one page of its orders, and the four stats blocks the insights tab charts. The stats blocks are the same inner shapes the dedicated stats endpoints answer with.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this customer. required: true - in: query name: orders_page schema: type: integer description: Orders head page number (20 rows per page, default 1). tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerDashboardResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/customer/customer/autocomplete/: get: operationId: customer_customer_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: city schema: type: string - in: query name: contact schema: type: string - in: query name: customer_id schema: type: integer description: Only the customer with this customer_id. - in: query name: id schema: type: string description: Only the customers with these primary keys, comma-separated - the rows behind a filter a client restores from a URL. - in: query name: name schema: type: string - in: query name: num_orders schema: type: string - in: query name: q schema: type: string description: Case-insensitive substring match on name, address, city or email. - in: query name: remarks schema: type: string tags: - customer responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/CustomerAutocomplete' description: '' /api/customer/customer/check_customer_id_handling/: get: operationId: customer_customer_check_customer_id_handling_retrieve description: Viewset that supports all normal viewset functionality. tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerIdHandling' description: '' /api/customer/customer/get_new_customer_id_from_latest/: get: operationId: customer_customer_get_new_customer_id_from_latest_retrieve description: Viewset that supports all normal viewset functionality. tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/NewCustomerId' description: '' /api/customer/document/: get: operationId: customer_document_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedCustomerDocumentList' description: '' post: operationId: customer_document_create description: Viewset that supports all normal viewset functionality. tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CustomerDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/CustomerDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/CustomerDocument' description: '' /api/customer/document/{id}/: get: operationId: customer_document_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this customer document. required: true tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerDocument' description: '' patch: operationId: customer_document_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this customer document. required: true tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedCustomerDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedCustomerDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedCustomerDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/CustomerDocument' description: '' delete: operationId: customer_document_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this customer document. required: true tags: - customer responses: '204': description: No response body /api/customer/export/: get: operationId: customer_export_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on name, email, address, customer_id or city. tags: - customer responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/customer/maintenance-contract/: get: operationId: customer_maintenance_contract_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -customer_view_name - -name - -remarks - -sum_tariffs - created - customer_view_name - name - remarks - sum_tariffs description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: remarks schema: type: string tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMaintenanceContractList' description: '' post: operationId: customer_maintenance_contract_create description: Viewset that supports all normal viewset functionality. tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/MaintenanceContractRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MaintenanceContractRequest' multipart/form-data: schema: $ref: '#/components/schemas/MaintenanceContractRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/MaintenanceContract' description: '' /api/customer/maintenance-contract/{id}/: get: operationId: customer_maintenance_contract_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance contract. required: true tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaintenanceContract' description: '' patch: operationId: customer_maintenance_contract_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance contract. required: true tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMaintenanceContractRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMaintenanceContractRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMaintenanceContractRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaintenanceContract' description: '' delete: operationId: customer_maintenance_contract_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance contract. required: true tags: - customer responses: '204': description: No response body /api/customer/maintenance-contract/{id}/with-equipment/: post: operationId: customer_maintenance_contract_with_equipment_update description: Update a maintenance contract and replace its equipment set parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance contract. required: true tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentResponse' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/customer/maintenance-contract/with-equipment/: post: operationId: customer_maintenance_contract_with_equipment_create description: Create a maintenance contract with its equipment rows parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentRequestRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/MaintenanceContractWithEquipmentResponse' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/customer/maintenance-equipment/: get: operationId: customer_maintenance_equipment_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: contract schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMaintenanceEquipmentList' description: '' post: operationId: customer_maintenance_equipment_create description: Viewset that supports all normal viewset functionality. tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/MaintenanceEquipmentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MaintenanceEquipmentRequest' multipart/form-data: schema: $ref: '#/components/schemas/MaintenanceEquipmentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/MaintenanceEquipment' description: '' /api/customer/maintenance-equipment/{id}/: get: operationId: customer_maintenance_equipment_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance equipment. required: true tags: - customer responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaintenanceEquipment' description: '' patch: operationId: customer_maintenance_equipment_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance equipment. required: true tags: - customer requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMaintenanceEquipmentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMaintenanceEquipmentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMaintenanceEquipmentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaintenanceEquipment' description: '' delete: operationId: customer_maintenance_equipment_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this maintenance equipment. required: true tags: - customer responses: '204': description: No response body /api/equipment/building/: get: operationId: equipment_building_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: created schema: type: string - in: query name: customer schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: modified schema: type: string - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -modified - -name - created - modified - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedBuildingList' description: '' post: operationId: equipment_building_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/BuildingCreateRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BuildingCreateRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/BuildingCreateRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/BuildingCreateRequest' description: '' /api/equipment/building/{id}/: get: operationId: equipment_building_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this building. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/Building' description: '' patch: operationId: equipment_building_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this building. required: true tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedBuildingRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedBuildingRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedBuildingRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Building' description: '' delete: operationId: equipment_building_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this building. required: true tags: - equipment responses: '204': description: No response body /api/equipment/building/{id}/dashboard/: get: operationId: equipment_building_dashboard_retrieve description: 'One payload for the building view: the building head, one page of its orders, and the four stats blocks the insights tab charts.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this building. required: true - in: query name: orders_page schema: type: integer description: Orders page number (20 rows per page, default 1). - in: query name: orders_search schema: type: string description: Free-text filter on the orders page; matches the order list ?q=. tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/BuildingDashboardResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/equipment/building/autocomplete/: get: operationId: equipment_building_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: type: integer description: Only rows for this branch id. - in: query name: created schema: type: string - in: query name: customer schema: type: integer description: Only rows for this customer id. - in: query name: modified schema: type: string - in: query name: name schema: type: string - in: query name: q schema: type: string description: Case-insensitive substring match on the name. tags: - equipment responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/BuildingAutocomplete' description: '' /api/equipment/building/list_for_select/: get: operationId: equipment_building_list_for_select_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: created schema: type: string - in: query name: customer schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: modified schema: type: string - in: query name: name schema: type: string - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Building' description: '' /api/equipment/equipment/: get: operationId: equipment_equipment_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: brand schema: type: string - in: query name: customer schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: description schema: type: string - in: query name: identifier schema: type: string - in: query name: location schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: name schema: type: string - in: query name: num_orders schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -brand - -description - -identifier - -name - -num_orders - -serialnumber - -type - brand - description - identifier - name - num_orders - serialnumber - type description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: serialnumber schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: name, brand, identifier, serialnumber, description, type, num_orders.' - in: query name: type schema: type: string enum: - facility - technical description: |- * `technical` - Technical * `facility` - Facility tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEquipmentList' description: '' post: operationId: equipment_equipment_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/EquipmentCreateRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EquipmentCreateRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/EquipmentCreateRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/EquipmentCreateRequest' description: '' /api/equipment/equipment-document/: get: operationId: equipment_equipment_document_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: equipment schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEquipmentDocumentList' description: '' post: operationId: equipment_equipment_document_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/EquipmentDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EquipmentDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/EquipmentDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/EquipmentDocument' description: '' /api/equipment/equipment-document/{id}/: get: operationId: equipment_equipment_document_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment document. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/EquipmentDocument' description: '' patch: operationId: equipment_equipment_document_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment document. required: true tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEquipmentDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEquipmentDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEquipmentDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EquipmentDocument' description: '' delete: operationId: equipment_equipment_document_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment document. required: true tags: - equipment responses: '204': description: No response body /api/equipment/equipment-export-qr/: get: operationId: equipment_equipment_export_qr_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on the name. - in: query name: type schema: type: string enum: - facility - technical description: Only rows for this equipment type. tags: - equipment responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/equipment/equipment-state/: get: operationId: equipment_equipment_state_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEquipmentStateList' description: '' post: operationId: equipment_equipment_state_create tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/EquipmentStateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EquipmentStateRequest' multipart/form-data: schema: $ref: '#/components/schemas/EquipmentStateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/EquipmentState' description: '' /api/equipment/equipment/{id}/: get: operationId: equipment_equipment_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/Equipment' description: '' patch: operationId: equipment_equipment_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment. required: true tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEquipmentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEquipmentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEquipmentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Equipment' description: '' delete: operationId: equipment_equipment_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment. required: true tags: - equipment responses: '204': description: No response body /api/equipment/equipment/{id}/create_qr/: post: operationId: equipment_equipment_create_qr_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this equipment. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/QrCreateResponse' description: '' /api/equipment/equipment/{id}/dashboard/: get: operationId: equipment_equipment_dashboard_retrieve description: 'One payload for the equipment view: the equipment head, one page of its orders, and the four stats blocks the insights tab charts.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this equipment. required: true - in: query name: orders_page schema: type: integer description: Orders page number (20 rows per page, default 1). - in: query name: orders_search schema: type: string description: Free-text filter on the orders page; matches the order list ?q=. tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/EquipmentDashboardResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/equipment/equipment/{uuid}/uuid/: get: operationId: equipment_equipment_uuid_retrieve parameters: - in: path name: uuid schema: type: string pattern: ^[0-9A-Za-z_\-=]+$ required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/Equipment' description: '' /api/equipment/equipment/autocomplete/: get: operationId: equipment_equipment_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: type: integer description: Only rows for this branch id. - in: query name: brand schema: type: string - in: query name: customer schema: type: integer description: Only rows for this customer id. - in: query name: description schema: type: string - in: query name: identifier schema: type: string - in: query name: location schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: name schema: type: string - in: query name: num_orders schema: type: string - in: query name: q schema: type: string description: Case-insensitive substring match on the name. - in: query name: serialnumber schema: type: string - in: query name: type schema: type: string enum: - facility - technical description: |- * `technical` - Technical * `facility` - Facility tags: - equipment responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/EquipmentAutocomplete' description: '' /api/equipment/equipment/create_quick/: post: operationId: equipment_equipment_create_quick_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/EquipmentCreateQuickRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EquipmentCreateQuickRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/EquipmentCreateQuickRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/CreateQuickResponse' description: '' /api/equipment/location/: get: operationId: equipment_location_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: created schema: type: string - in: query name: customer schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: modified schema: type: string - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -modified - -name - created - modified - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedLocationList' description: '' post: operationId: equipment_location_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/LocationCreateRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LocationCreateRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/LocationCreateRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/LocationCreateRequest' description: '' /api/equipment/location-document/: get: operationId: equipment_location_document_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: location schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedLocationDocumentList' description: '' post: operationId: equipment_location_document_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/LocationDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LocationDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/LocationDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/LocationDocument' description: '' /api/equipment/location-document/{id}/: get: operationId: equipment_location_document_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location document. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/LocationDocument' description: '' patch: operationId: equipment_location_document_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location document. required: true tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedLocationDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedLocationDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedLocationDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/LocationDocument' description: '' delete: operationId: equipment_location_document_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location document. required: true tags: - equipment responses: '204': description: No response body /api/equipment/location-export-qr/: get: operationId: equipment_location_export_qr_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on the name. tags: - equipment responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/equipment/location/{id}/: get: operationId: equipment_location_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/Location' description: '' patch: operationId: equipment_location_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location. required: true tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedLocationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedLocationRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedLocationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Location' description: '' delete: operationId: equipment_location_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location. required: true tags: - equipment responses: '204': description: No response body /api/equipment/location/{id}/create_qr/: post: operationId: equipment_location_create_qr_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this location. required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/QrCreateResponse' description: '' /api/equipment/location/{id}/dashboard/: get: operationId: equipment_location_dashboard_retrieve description: 'One payload for the location view: the location head, one page of its orders, and the four stats blocks the insights tab charts.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this location. required: true - in: query name: orders_page schema: type: integer description: Orders page number (20 rows per page, default 1). - in: query name: orders_search schema: type: string description: Free-text filter on the orders page; matches the order list ?q=. tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/LocationDashboardResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/equipment/location/{uuid}/uuid/: get: operationId: equipment_location_uuid_retrieve parameters: - in: path name: uuid schema: type: string pattern: ^[0-9A-Za-z_\-=]+$ required: true tags: - equipment responses: '200': content: application/json: schema: $ref: '#/components/schemas/Location' description: '' /api/equipment/location/autocomplete/: get: operationId: equipment_location_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: type: integer description: Only rows for this branch id. - in: query name: created schema: type: string - in: query name: customer schema: type: integer description: Only rows for this customer id. - in: query name: modified schema: type: string - in: query name: name schema: type: string - in: query name: q schema: type: string description: Case-insensitive substring match on the name. tags: - equipment responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/LocationAutocomplete' description: '' /api/equipment/location/create_quick/: post: operationId: equipment_location_create_quick_create description: Viewset that supports all normal viewset functionality. tags: - equipment requestBody: content: application/json: schema: $ref: '#/components/schemas/LocationCreateQuickRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LocationCreateQuickRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/LocationCreateQuickRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/CreateQuickResponse' description: '' /api/equipment/location/list_for_select/: get: operationId: equipment_location_list_for_select_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: branch schema: type: integer description: Only rows for this branch id. - in: query name: created schema: type: string - in: query name: customer schema: type: integer description: Only rows for this customer id. - in: query name: modified schema: type: string - in: query name: name schema: type: string - name: q required: false in: query description: A search term. schema: type: string tags: - equipment responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Location' description: '' /api/frontend-version/: get: operationId: frontend_version_retrieve tags: - frontend-version security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/FrontendVersionResponse' description: '' /api/get-csrf-token/: get: operationId: get_csrf_token_retrieve tags: - get-csrf-token security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/CsrfTokenResponse' description: '' /api/get-initial-data/: get: operationId: get_initial_data_retrieve tags: - get-initial-data security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/GetInitialDataResponse' description: '' /api/get-language-vars/: get: operationId: get_language_vars_retrieve tags: - get-language-vars security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/LanguageVarsResponse' description: '' /api/get-member-new-data-room/: get: operationId: get_member_new_data_room_retrieve tags: - get-member-new-data-room responses: '200': content: application/json: schema: $ref: '#/components/schemas/RoomResponse' description: '' /api/get-member-room/: get: operationId: get_member_room_retrieve tags: - get-member-room responses: '200': content: application/json: schema: $ref: '#/components/schemas/RoomResponse' description: '' /api/get-user-room/: get: operationId: get_user_room_retrieve tags: - get-user-room responses: '200': content: application/json: schema: $ref: '#/components/schemas/RoomResponse' description: '' /api/inventory/inventory-for-material-location/: get: operationId: inventory_inventory_for_material_location_retrieve tags: - inventory security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/InventoryResponse' description: '' /api/inventory/inventory-locations/: get: operationId: inventory_inventory_locations_list parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on identifier, name, unit or stock location name. tags: - inventory security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InventoryLocations' description: '' /api/inventory/inventory-locations-for-material/: get: operationId: inventory_inventory_locations_for_material_list tags: - inventory security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InventoryLocations' description: '' /api/inventory/inventory-materials/: get: operationId: inventory_inventory_materials_list tags: - inventory security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InventoryMaterialsMinimal' description: '' /api/inventory/inventory-materials-for-location/: get: operationId: inventory_inventory_materials_for_location_list parameters: - in: query name: location schema: type: integer description: Only materials at this stock location id. - in: query name: q schema: type: string description: Case-insensitive substring match on identifier, name, unit or stock location name. tags: - inventory security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InventoryMaterials' description: '' /api/inventory/material/: get: operationId: inventory_material_list description: The statistics in this viewset actually are taken from PurchaseOrderMaterial parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: supplier_relation schema: type: integer tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMaterialList' description: '' post: operationId: inventory_material_create description: Create a material parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/MaterialCreateRequest' examples: CreateExample: value: identifier: LG S12EW show_name: LG S12EW airconditioner met wifi name: LG S12EW airconditioner met wifi name_short: airconditioner unit: '1' supplier_relation: 33 product_type: airconditioner price_purchase: '0.00' price_selling: '0.00' price_selling_alt: '0.00' external_identifier: '246985' price_purchase_ex: '675.00' price_purchase_ex_currency: EUR price_selling_ex: '800.00' price_selling_ex_currency: EUR price_selling_alt_ex: '0.00' image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqVuwg4pChOlkQFXHUKhShQqgVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi7OCk6CIl/i8ptIj14Lgf7+497t4BQr3MNKtrHNB020wl4mImuyoGXxFAGP2IIiwzy5iTpCQ6jq97+Ph6F+NZnc/9OXrVnMUAn0g8ywzTJt4gnt60Dc77xBFWlFXic+Ixky5I/Mh1xeM3zgWXBZ4ZMdOpeeIIsVhoY6WNWdHUiKeIo6qmU76Q8VjlvMVZK1dZ8578haGcvrLMdZrDSGARS5AgQkEVJZRhI0arToqFFO3HO/iHXL9ELoVcJTByLKACDbLrB/+D391a+ckJLykUBwIvjvMxAgR3gUbNcb6PHadxAvifgSu95a/UgZlP0mstLXoE9G0DF9ctTdkDLneAwSdDNmVX8tMU8nng/Yy+KQsM3AI9a15vzX2cPgBp6ip5AxwcAqMFyl7v8O7u9t7+PdPs7wdVQXKb5QbkQQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFEBEkJQkyFwYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NIrfoPAAMmAd8UXD0CAAAAAElFTkSuQmCC summary: Create example description: Example payload to create a material application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MaterialCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/MaterialCreateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/MaterialCreate' examples: CreateExample: value: identifier: LG S12EW show_name: LG S12EW airconditioner met wifi name: LG S12EW airconditioner met wifi name_short: airconditioner unit: '1' supplier_relation: 33 product_type: airconditioner price_purchase: '0.00' price_selling: '0.00' price_selling_alt: '0.00' external_identifier: '246985' price_purchase_ex: '675.00' price_purchase_ex_currency: EUR price_selling_ex: '800.00' price_selling_ex_currency: EUR price_selling_alt_ex: '0.00' image: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqVuwg4pChOlkQFXHUKhShQqgVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi7OCk6CIl/i8ptIj14Lgf7+497t4BQr3MNKtrHNB020wl4mImuyoGXxFAGP2IIiwzy5iTpCQ6jq97+Ph6F+NZnc/9OXrVnMUAn0g8ywzTJt4gnt60Dc77xBFWlFXic+Ixky5I/Mh1xeM3zgWXBZ4ZMdOpeeIIsVhoY6WNWdHUiKeIo6qmU76Q8VjlvMVZK1dZ8578haGcvrLMdZrDSGARS5AgQkEVJZRhI0arToqFFO3HO/iHXL9ELoVcJTByLKACDbLrB/+D391a+ckJLykUBwIvjvMxAgR3gUbNcb6PHadxAvifgSu95a/UgZlP0mstLXoE9G0DF9ctTdkDLneAwSdDNmVX8tMU8nng/Yy+KQsM3AI9a15vzX2cPgBp6ip5AxwcAqMFyl7v8O7u9t7+PdPs7wdVQXKb5QbkQQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFEBEkJQkyFwYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NIrfoPAAMmAd8UXD0CAAAAAElFTkSuQmCC summary: Create example description: Example payload to create a material description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/material/{id}/: get: operationId: inventory_material_retrieve description: Get a material parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this material. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/Material' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' patch: operationId: inventory_material_partial_update description: The statistics in this viewset actually are taken from PurchaseOrderMaterial parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this material. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMaterialRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Material' description: '' delete: operationId: inventory_material_destroy description: Delete a material parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this material. required: true tags: - inventory responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/material/{id}/move/: post: operationId: inventory_material_move_create description: The statistics in this viewset actually are taken from PurchaseOrderMaterial parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this material. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/MoveRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MoveRequest' multipart/form-data: schema: $ref: '#/components/schemas/MoveRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' description: '' /api/inventory/material/autocomplete/: get: operationId: inventory_material_autocomplete_list description: The statistics in this viewset actually are taken from PurchaseOrderMaterial parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on identifier, name, unit, supplier, product type or location. - in: query name: supplier schema: type: integer description: Only materials for this supplier relation id. - in: query name: supplier_relation schema: type: integer - in: query name: use_latest_year schema: type: boolean description: Use the latest year on record rather than `year`. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/MaterialAutocomplete' description: '' /api/inventory/material/stats_table/: get: operationId: inventory_material_stats_table_retrieve description: The statistics in this viewset actually are taken from PurchaseOrderMaterial parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on identifier, name, unit, supplier, product type or location. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialStatsTableResponse' description: '' /api/inventory/material/total_sales/: get: operationId: inventory_material_total_sales_retrieve description: Total sales per material for a year. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on material or order name. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialTotalSalesResponse' description: '' /api/inventory/material/total_sales_per_customer/: get: operationId: inventory_material_total_sales_per_customer_retrieve description: Total sales grouped per customer for a year. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on customer or order name. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialTotalSalesPerCustomerResponse' description: '' /api/inventory/material/total_sales_per_material_customer/: get: operationId: inventory_material_total_sales_per_material_customer_retrieve description: Total sales grouped per material and customer for a year. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on material or order name. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialTotalSalesPerMaterialCustomerResponse' description: '' /api/inventory/material/total_sales_per_supplier/: get: operationId: inventory_material_total_sales_per_supplier_retrieve description: Total sales grouped per supplier for a year. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on supplier, material or order name. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialTotalSalesPerSupplierResponse' description: '' /api/inventory/material/total_sales_per_supplier_per_material/: get: operationId: inventory_material_total_sales_per_supplier_per_material_retrieve description: Total sales grouped per supplier and material for a year. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on supplier or material name. - in: query name: year schema: type: integer description: Only data for this year. tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/MaterialTotalSalesPerSupplierPerMaterialResponse' description: '' /api/inventory/purchaseorder/: get: operationId: inventory_purchaseorder_list description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPurchaseOrderListList' description: '' post: operationId: inventory_purchaseorder_create description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderListRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseOrderListRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseOrderListRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderList' description: '' /api/inventory/purchaseorder-entry/: get: operationId: inventory_purchaseorder_entry_list description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - in: query name: purchase_order_material schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPurchaseOrderEntryList' description: '' post: operationId: inventory_purchaseorder_entry_create description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderEntryRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseOrderEntryRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseOrderEntryRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderEntry' description: '' /api/inventory/purchaseorder-entry/{id}/: get: operationId: inventory_purchaseorder_entry_retrieve description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order entry. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderEntry' description: '' patch: operationId: inventory_purchaseorder_entry_partial_update description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order entry. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseOrderEntryRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseOrderEntryRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseOrderEntryRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderEntry' description: '' delete: operationId: inventory_purchaseorder_entry_destroy description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order entry. required: true tags: - inventory responses: '204': description: No response body /api/inventory/purchaseorder-entry/bulk/: post: operationId: inventory_purchaseorder_entry_bulk_create description: |- `bulk` action for PurchaseOrderEntryViewset: create a list of entries in one atomic request instead of one POST per row. Each row still runs through PurchaseOrderEntrySerializer / PurchaseOrderEntry.save() as usual, so the per-entry stock mutation side effect still fires per row. parameters: - in: query name: purchase_order_material schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - inventory requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/PurchaseOrderEntryRequest' application/x-www-form-urlencoded: schema: type: array items: $ref: '#/components/schemas/PurchaseOrderEntryRequest' multipart/form-data: schema: type: array items: $ref: '#/components/schemas/PurchaseOrderEntryRequest' required: true responses: '201': content: application/json: schema: type: array items: $ref: '#/components/schemas/PurchaseOrderEntry' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/inventory/purchaseorder-material/: get: operationId: inventory_purchaseorder_material_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - in: query name: purchase_order schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPurchaseOrderMaterialList' description: '' post: operationId: inventory_purchaseorder_material_create description: Viewset that supports all normal viewset functionality. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseOrderMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseOrderMaterialRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderMaterial' description: '' /api/inventory/purchaseorder-material/{id}/: get: operationId: inventory_purchaseorder_material_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order material. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderMaterial' description: '' patch: operationId: inventory_purchaseorder_material_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order material. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseOrderMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseOrderMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseOrderMaterialRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderMaterial' description: '' delete: operationId: inventory_purchaseorder_material_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order material. required: true tags: - inventory responses: '204': description: No response body /api/inventory/purchaseorder-status/: get: operationId: inventory_purchaseorder_status_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - in: query name: purchase_order schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPurchaseOrderStatusList' description: '' post: operationId: inventory_purchaseorder_status_create description: Viewset that supports all normal viewset functionality. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderStatusRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseOrderStatusRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseOrderStatusRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderStatus' description: '' /api/inventory/purchaseorder-status/{id}/: get: operationId: inventory_purchaseorder_status_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order status. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderStatus' description: '' patch: operationId: inventory_purchaseorder_status_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order status. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseOrderStatusRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseOrderStatusRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseOrderStatusRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderStatus' description: '' delete: operationId: inventory_purchaseorder_status_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order status. required: true tags: - inventory responses: '204': description: No response body /api/inventory/purchaseorder/{id}/: get: operationId: inventory_purchaseorder_retrieve description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderList' description: '' patch: operationId: inventory_purchaseorder_partial_update description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseOrderListRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseOrderListRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseOrderListRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderList' description: '' delete: operationId: inventory_purchaseorder_destroy description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order. required: true tags: - inventory responses: '204': description: No response body /api/inventory/purchaseorder/{id}/with-materials/: patch: operationId: inventory_purchaseorder_with_materials_partial_update description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase order. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseOrderWithMaterialsUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseOrderWithMaterialsUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseOrderWithMaterialsUpdateRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderDetail' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/inventory/purchaseorder/with-materials/: post: operationId: inventory_purchaseorder_with_materials_create description: |- `with-materials` actions for PurchaseOrderViewset. POST .../purchaseorder/with-materials/ creates a PurchaseOrder and its materials in one atomic request. PATCH .../purchaseorder/{id}/with-materials/ updates the PurchaseOrder and replaces its materials set as a whole: a row with an `id` updates that stored PurchaseOrderMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderWithMaterialsCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseOrderWithMaterialsCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseOrderWithMaterialsCreateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/PurchaseOrderDetail' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/inventory/stats_table_export/: get: operationId: inventory_stats_table_export_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match narrowing the sales. - in: query name: year schema: type: integer description: The year the sales columns cover. Defaults to this year. tags: - inventory responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/inventory/stock-location/: get: operationId: inventory_stock_location_list description: Get locations parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedStockLocationList' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' post: operationId: inventory_stock_location_create description: Create a stock location parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/StockLocationCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StockLocationCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/StockLocationCreateUpdateRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/StockLocationCreateUpdate' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/stock-location/{id}/: get: operationId: inventory_stock_location_retrieve description: Get a location parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this stock location. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/StockLocation' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' patch: operationId: inventory_stock_location_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this stock location. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedStockLocationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedStockLocationRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedStockLocationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/StockLocation' description: '' delete: operationId: inventory_stock_location_destroy description: Delete a location parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this stock location. required: true tags: - inventory responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/stockmutationsimple-list/: get: operationId: inventory_stockmutationsimple_list_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedStockMutationSimpleList' description: '' post: operationId: inventory_stockmutationsimple_list_create tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/StockMutationSimpleRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StockMutationSimpleRequest' multipart/form-data: schema: $ref: '#/components/schemas/StockMutationSimpleRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/StockMutationSimple' description: '' /api/inventory/supplier/: get: operationId: inventory_supplier_list description: Get suppliers parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSupplierList' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' post: operationId: inventory_supplier_create description: Create a supplier parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/SupplierCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupplierCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupplierCreateUpdateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SupplierCreateUpdate' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/supplier-reservation/: get: operationId: inventory_supplier_reservation_list description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: supplier schema: type: integer tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSupplierReservationList' description: '' post: operationId: inventory_supplier_reservation_create description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/SupplierReservationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupplierReservationRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupplierReservationRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SupplierReservation' description: '' /api/inventory/supplier-reservation/{id}/: get: operationId: inventory_supplier_reservation_retrieve description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/SupplierReservation' description: '' patch: operationId: inventory_supplier_reservation_partial_update description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSupplierReservationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSupplierReservationRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSupplierReservationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SupplierReservation' description: '' delete: operationId: inventory_supplier_reservation_destroy description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation. required: true tags: - inventory responses: '204': description: No response body /api/inventory/supplier-reservation/{id}/with-materials/: patch: operationId: inventory_supplier_reservation_with_materials_partial_update description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSupplierReservationWithMaterialsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSupplierReservationWithMaterialsRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSupplierReservationWithMaterialsRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SupplierReservation' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/inventory/supplier-reservation/autocomplete/: get: operationId: inventory_supplier_reservation_autocomplete_list description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. parameters: - name: q required: false in: query description: A search term. schema: type: string - in: query name: supplier schema: type: integer tags: - inventory responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/SupplierReservationAutocomplete' description: '' /api/inventory/supplier-reservation/with-materials/: post: operationId: inventory_supplier_reservation_with_materials_create description: |- `with-materials` actions for SupplierReservationViewset. POST .../supplier-reservation/with-materials/ creates a SupplierReservation and its materials in one atomic request. PATCH .../supplier-reservation/{id}/with-materials/ updates the SupplierReservation and replaces its materials set as a whole: a row with an `id` updates that stored SupplierReservationMaterial, a row without one creates a new one, and any stored row absent from the list is deleted. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/SupplierReservationWithMaterialsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupplierReservationWithMaterialsRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupplierReservationWithMaterialsRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SupplierReservation' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/inventory/supplier-reservationmaterial/: get: operationId: inventory_supplier_reservationmaterial_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: material schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: reservation schema: type: integer tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedSupplierReservationMaterialList' description: '' post: operationId: inventory_supplier_reservationmaterial_create description: Viewset that supports all normal viewset functionality. tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/SupplierReservationMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupplierReservationMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupplierReservationMaterialRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SupplierReservationMaterial' description: '' /api/inventory/supplier-reservationmaterial/{id}/: get: operationId: inventory_supplier_reservationmaterial_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation material. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/SupplierReservationMaterial' description: '' patch: operationId: inventory_supplier_reservationmaterial_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation material. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSupplierReservationMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSupplierReservationMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSupplierReservationMaterialRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SupplierReservationMaterial' description: '' delete: operationId: inventory_supplier_reservationmaterial_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier reservation material. required: true tags: - inventory responses: '204': description: No response body /api/inventory/supplier/{id}/: get: operationId: inventory_supplier_retrieve description: Get a supplier parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this supplier. required: true tags: - inventory responses: '200': content: application/json: schema: $ref: '#/components/schemas/Supplier' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' patch: operationId: inventory_supplier_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this supplier. required: true tags: - inventory requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedSupplierRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedSupplierRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedSupplierRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Supplier' description: '' delete: operationId: inventory_supplier_destroy description: Delete a supplier parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this supplier. required: true tags: - inventory responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/inventory/supplier/autocomplete/: get: operationId: inventory_supplier_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on name, address, city or email. tags: - inventory responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/SupplierAutocomplete' description: '' /api/inventory/total_sales_per_customer_export/: get: operationId: inventory_total_sales_per_customer_export_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. tags: - inventory responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/inventory/total_sales_per_supplier_export/: get: operationId: inventory_total_sales_per_supplier_export_retrieve description: |- Mixin which allows the override of the filename being passed back to the user when the spreadsheet is downloaded. tags: - inventory responses: '200': content: application/xlsx: schema: type: string format: binary description: '' /api/invoice/email/: get: operationId: invoice_email_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInvoiceEmailList' description: '' post: operationId: invoice_email_create description: Viewset that supports all normal viewset functionality. tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/InvoiceEmailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InvoiceEmailRequest' multipart/form-data: schema: $ref: '#/components/schemas/InvoiceEmailRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/InvoiceEmail' description: '' /api/invoice/email/{id}/: get: operationId: invoice_email_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice email. required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceEmail' description: '' patch: operationId: invoice_email_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice email. required: true tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedInvoiceEmailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedInvoiceEmailRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedInvoiceEmailRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceEmail' description: '' delete: operationId: invoice_email_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice email. required: true tags: - invoice responses: '204': description: No response body /api/invoice/email/get_documents/: get: operationId: invoice_email_get_documents_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: invoiceId schema: type: integer required: true tags: - invoice responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InvoiceEmailDocument' description: '' /api/invoice/email/get_unsent_email/: get: operationId: invoice_email_get_unsent_email_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: query name: invoiceId schema: type: integer required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceEmailDraft' description: '' /api/invoice/invoice/: get: operationId: invoice_invoice_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInvoiceList' description: '' post: operationId: invoice_invoice_create description: Viewset that supports all normal viewset functionality. tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/InvoiceRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InvoiceRequest' multipart/form-data: schema: $ref: '#/components/schemas/InvoiceRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Invoice' description: '' /api/invoice/invoice-detail/{id}/: get: operationId: invoice_invoice_detail_retrieve parameters: - in: path name: id schema: type: string pattern: ^[0-9A-Za-z_\-=]+$ required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceView' description: '' /api/invoice/invoice-line/: get: operationId: invoice_invoice_line_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: invoice schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInvoiceLineList' description: '' post: operationId: invoice_invoice_line_create description: Viewset that supports all normal viewset functionality. tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/InvoiceLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InvoiceLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/InvoiceLineRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/InvoiceLine' description: '' /api/invoice/invoice-line/{id}/: get: operationId: invoice_invoice_line_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice line. required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceLine' description: '' patch: operationId: invoice_invoice_line_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice line. required: true tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedInvoiceLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedInvoiceLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedInvoiceLineRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceLine' description: '' delete: operationId: invoice_invoice_line_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice line. required: true tags: - invoice responses: '204': description: No response body /api/invoice/invoice-status/: post: operationId: invoice_invoice_status_create tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/InvoiceStatusRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InvoiceStatusRequest' multipart/form-data: schema: $ref: '#/components/schemas/InvoiceStatusRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/InvoiceStatus' description: '' /api/invoice/invoice/{id}/: get: operationId: invoice_invoice_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/Invoice' description: '' patch: operationId: invoice_invoice_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedInvoiceRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedInvoiceRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedInvoiceRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Invoice' description: '' delete: operationId: invoice_invoice_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '204': description: No response body /api/invoice/invoice/{id}/download_pdf/: post: operationId: invoice_invoice_download_pdf_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '200': content: application/pdf: schema: type: string format: binary description: '' '400': description: No response body /api/invoice/invoice/{id}/generate_preview_pdf/: post: operationId: invoice_invoice_generate_preview_pdf_create description: Endpoint to generate a preview invoice PDF parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '200': content: application/pdf: schema: type: string format: binary description: '' '400': description: No response body /api/invoice/invoice/{id}/make_definitive/: post: operationId: invoice_invoice_make_definitive_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/invoice/invoice/{id}/recreate_pdf/: post: operationId: invoice_invoice_recreate_pdf_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this invoice. required: true tags: - invoice responses: '200': description: No response body '400': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/invoice/invoice/autocomplete/: get: operationId: invoice_invoice_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - in: query name: q schema: type: string description: Case-insensitive substring match on reference, description or order name. tags: - invoice responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/InvoiceAutocomplete' description: '' /api/invoice/invoice/data/{id}/: get: operationId: invoice_invoice_data_retrieve parameters: - in: path name: id schema: type: string pattern: ^[0-9A-Za-z_\-=]+$ required: true tags: - invoice security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceDataResponse' description: '' /api/invoice/invoice/preliminary/: get: operationId: invoice_invoice_preliminary_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInvoicePreliminaryResponseList' description: '' /api/invoice/invoice/sent/: get: operationId: invoice_invoice_sent_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInvoiceList' description: '' /api/invoice/purchase/: get: operationId: invoice_purchase_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPurchaseList' description: '' post: operationId: invoice_purchase_create description: Viewset that supports all normal viewset functionality. tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/PurchaseRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PurchaseRequest' multipart/form-data: schema: $ref: '#/components/schemas/PurchaseRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Purchase' description: '' /api/invoice/purchase/{id}/: get: operationId: invoice_purchase_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase. required: true tags: - invoice responses: '200': content: application/json: schema: $ref: '#/components/schemas/Purchase' description: '' patch: operationId: invoice_purchase_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase. required: true tags: - invoice requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPurchaseRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPurchaseRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPurchaseRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Purchase' description: '' delete: operationId: invoice_purchase_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this purchase. required: true tags: - invoice responses: '204': description: No response body /api/invoice/purchase/year/: get: operationId: invoice_purchase_year_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - invoice responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/PurchaseYear' description: '' /api/jwt-token/: post: operationId: jwt_token_create description: |- Takes a set of user credentials and returns a sliding JSON web token to prove the authentication of those credentials. tags: - jwt-token requestBody: content: application/json: schema: $ref: '#/components/schemas/TokenObtainSlidingSerializerDifferentTokenRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TokenObtainSlidingSerializerDifferentTokenRequest' multipart/form-data: schema: $ref: '#/components/schemas/TokenObtainSlidingSerializerDifferentTokenRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/TokenObtainResponse' description: '' /api/jwt-token/refresh/: post: operationId: jwt_token_refresh_create description: |- Takes a sliding JSON web token and returns a new, refreshed version if the token's refresh period has not expired. tags: - jwt-token requestBody: content: application/json: schema: $ref: '#/components/schemas/TokenRefreshSlidingSerializerDifferentTokenRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TokenRefreshSlidingSerializerDifferentTokenRequest' multipart/form-data: schema: $ref: '#/components/schemas/TokenRefreshSlidingSerializerDifferentTokenRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/TokenRefreshSlidingSerializerDifferentToken' description: '' /api/location-to-address/: post: operationId: location_to_address_create tags: - location-to-address requestBody: content: application/json: schema: $ref: '#/components/schemas/LocationToAddressRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LocationToAddressRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/LocationToAddressRequestRequest' required: true responses: '200': content: application/json: schema: type: object nullable: true description: The resolved address; null or an empty object when geocoding came up empty. properties: street: type: string nullable: true city: type: string nullable: true country_code: type: string nullable: true postal: type: string nullable: true description: '' /api/member/companycode-exists/: get: operationId: member_companycode_exists_retrieve parameters: - in: query name: companycode schema: type: string description: The companycode to check. required: true tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/AvailabilityResponse' description: '' /api/member/contract/: get: operationId: member_contract_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -modified - -name - created - modified - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedContractList' description: '' post: operationId: member_contract_create description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/ContractCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ContractCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/ContractCreateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Contract' description: '' /api/member/contract/{id}/: get: operationId: member_contract_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this contract. required: true tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/Contract' description: '' patch: operationId: member_contract_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this contract. required: true tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedContractRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedContractRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedContractRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Contract' description: '' delete: operationId: member_contract_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this contract. required: true tags: - member responses: '204': description: No response body /api/member/current-detail-public/: get: operationId: member_current_detail_public_retrieve tags: - member security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/MinimalMember' description: '' /api/member/detail-public-companycode/{id}/: get: operationId: member_detail_public_companycode_retrieve parameters: - in: path name: id schema: type: string pattern: ^[-\w]+$ required: true tags: - member security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/MinimalMember' description: '' /api/member/detail-public/{id}/: get: operationId: member_detail_public_retrieve parameters: - in: path name: id schema: type: integer required: true tags: - member security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/MinimalMember' description: '' /api/member/get-module-data/: get: operationId: member_get_module_data_list tags: - member responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/ModuleData' description: '' /api/member/list-public/: get: operationId: member_list_public_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - in: query name: q schema: type: string description: Case-insensitive substring match on name or companycode. tags: - member security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMinimalMemberList' description: '' /api/member/list-public-branches/: get: operationId: member_list_public_branches_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - in: query name: q schema: type: string description: Case-insensitive substring match on name or companycode. tags: - member security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMinimalMemberList' description: '' /api/member/member/: get: operationId: member_member_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: city schema: type: string - in: query name: companycode schema: type: string - in: query name: is_deleted schema: type: boolean - in: query name: is_requested schema: type: boolean - in: query name: member_type schema: type: string enum: - maintenance - temps description: |- * `maintenance` - maintenance * `temps` - temps - in: query name: ordering schema: type: array items: type: string enum: - -city - -companycode - -created - -id - -member_type - -modified - -name - city - companycode - created - id - member_type - modified - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMemberList' description: '' post: operationId: member_member_create description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/MemberRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MemberRequest' multipart/form-data: schema: $ref: '#/components/schemas/MemberRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Member' description: '' /api/member/member/{id}/: get: operationId: member_member_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this member. required: true tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/Member' description: '' patch: operationId: member_member_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this member. required: true tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMemberRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMemberRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMemberRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Member' description: '' delete: operationId: member_member_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this member. required: true tags: - member responses: '204': description: No response body /api/member/member/get_dashboard/: get: operationId: member_member_get_dashboard_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: query name: year schema: type: integer description: Only data for this year. tags: - member responses: '200': content: application/json: schema: type: object additionalProperties: true description: 'Dashboard data keyed by widget: order_count_per_month, top_50_customers, top_materials_used, top_customer_sales_by_profit, top_material_sales_by_profit, transactions, assigned_count, order_status_counts and order_type_counts. Each value is shaped by the tenant''s status codes and order types, so only the key set is fixed.' description: '' /api/member/member/get_exclude_me/: get: operationId: member_member_get_exclude_me_list description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/MemberSelect' description: '' /api/member/member/get_for_partner_select/: get: operationId: member_member_get_for_partner_select_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: q schema: type: string description: Case-insensitive substring match on name, companycode or city. tags: - member responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/PartnerSelect' description: '' /api/member/member/get_my_settings/: get: operationId: member_member_get_my_settings_retrieve description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: type: object additionalProperties: true description: The tenant settings bag. Keys come from the defaults plus whatever the tenant added, and values range over strings, numbers and nested objects. description: '' /api/member/member/get_oci_url/: get: operationId: member_member_get_oci_url_retrieve description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/OciUrl' description: '' /api/member/member/me/: get: operationId: member_member_me_retrieve description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/Member' description: '' patch: operationId: member_member_me_partial_update description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMemberRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Member' description: '' /api/member/member/my_settings/: get: operationId: member_member_my_settings_retrieve description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/MemberSettings' description: '' patch: operationId: member_member_my_settings_partial_update description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMemberSettingsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMemberSettingsRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMemberSettingsRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/MemberSettings' description: '' /api/member/member/overview_stats/: get: operationId: member_member_overview_stats_retrieve description: |- KPI widgets for the dashboard overview page. The caller picks which widgets it needs with ?widgets=a,b,c; leaving it off returns the set the overview page shows today. Widgets that fail are left out of `widgets` and named in `errors` rather than failing the whole response. parameters: - in: query name: active_customer_months schema: type: integer minimum: 1 description: How many months back a customer must have ordered to count as active. Defaults to 12. - in: query name: low_stock_threshold schema: type: integer minimum: 0 description: Stock at or below this count counts as low. Defaults to 5. - in: query name: widgets schema: type: string description: Comma-separated widget names to build. Omitted, the overview page's own set is returned. tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/OverviewStats' description: '' /api/member/member/requested_count/: get: operationId: member_member_requested_count_retrieve description: Viewset that supports all normal viewset functionality. tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/member/module/: get: operationId: member_module_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: id schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -modified - -name - created - modified - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedModuleList' description: '' post: operationId: member_module_create description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/ModuleRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ModuleRequest' multipart/form-data: schema: $ref: '#/components/schemas/ModuleRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Module' description: '' /api/member/module-part/: get: operationId: member_module_part_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: module schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: name schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -created - -modified - -module_name - -name - created - modified - module_name - name description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedModulePartList' description: '' post: operationId: member_module_part_create description: Viewset that supports all normal viewset functionality. tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/ModulePartRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ModulePartRequest' multipart/form-data: schema: $ref: '#/components/schemas/ModulePartRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/ModulePart' description: '' /api/member/module-part/{id}/: get: operationId: member_module_part_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module part. required: true tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/ModulePart' description: '' patch: operationId: member_module_part_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module part. required: true tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedModulePartRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedModulePartRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedModulePartRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ModulePart' description: '' delete: operationId: member_module_part_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module part. required: true tags: - member responses: '204': description: No response body /api/member/module/{id}/: get: operationId: member_module_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module. required: true tags: - member responses: '200': content: application/json: schema: $ref: '#/components/schemas/Module' description: '' patch: operationId: member_module_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module. required: true tags: - member requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedModuleRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedModuleRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedModuleRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Module' description: '' delete: operationId: member_module_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this module. required: true tags: - member responses: '204': description: No response body /api/member/vat-types/: get: operationId: member_vat_types_retrieve parameters: - in: query name: country schema: type: string minLength: 2 maxLength: 2 description: Two-letter country code; defaults to the tenant's. tags: - member responses: '200': content: application/json: schema: type: array items: type: integer description: '' /api/mobile/assign-me/: post: operationId: mobile_assign_me_create tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignResultResponse' description: '' /api/mobile/assign-user-trip/{id}/: post: operationId: mobile_assign_user_trip_create parameters: - in: path name: id schema: type: integer required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignTripsRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignTripsRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignTripsRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignResultResponse' description: '' /api/mobile/assign-user/{id}/: post: operationId: mobile_assign_user_create parameters: - in: path name: id schema: type: integer required: true - in: query name: notify_user schema: type: string description: When given, send the assigned user a websocket notification per order. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignOrdersRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignOrdersResponse' description: '' /api/mobile/assignedorder/: get: operationId: mobile_assignedorder_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: engineer schema: type: integer - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: student_user schema: type: integer tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderList' description: '' post: operationId: mobile_assignedorder_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderCreateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderCreate' description: '' /api/mobile/assignedorder-workorder/: get: operationId: mobile_assignedorder_workorder_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderWorkOrderList' description: '' post: operationId: mobile_assignedorder_workorder_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderWorkOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderWorkOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderWorkOrderRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderWorkOrder' description: '' /api/mobile/assignedorder-workorder/{id}/: get: operationId: mobile_assignedorder_workorder_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order work order. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderWorkOrder' description: '' patch: operationId: mobile_assignedorder_workorder_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order work order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderWorkOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderWorkOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderWorkOrderRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderWorkOrder' description: '' delete: operationId: mobile_assignedorder_workorder_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order work order. required: true tags: - mobile responses: '204': description: No response body /api/mobile/assignedorder/{id}/: get: operationId: mobile_assignedorder_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrder' description: '' patch: operationId: mobile_assignedorder_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrder' description: '' delete: operationId: mobile_assignedorder_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile responses: '204': description: No response body /api/mobile/assignedorder/{id}/create_extra_order/: post: operationId: mobile_assignedorder_create_extra_order_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrder' description: '' /api/mobile/assignedorder/{id}/detail_change_date/: patch: operationId: mobile_assignedorder_detail_change_date_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderDatesRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderDatesRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderDatesRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/mobile/assignedorder/{id}/detail_device/: get: operationId: mobile_assignedorder_detail_device_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailDeviceResponse' description: '' /api/mobile/assignedorder/{id}/get_workorder_sign_details/: get: operationId: mobile_assignedorder_get_workorder_sign_details_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/GetWorkorderSignDetailsResponse' description: '' /api/mobile/assignedorder/{id}/no_workorder_finished/: post: operationId: mobile_assignedorder_no_workorder_finished_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrder' description: '' /api/mobile/assignedorder/{id}/report_statuscode/: post: operationId: mobile_assignedorder_report_statuscode_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/mobile/assignedorder/{id}/report_workorders_signed/: post: operationId: mobile_assignedorder_report_workorders_signed_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrder' description: '' /api/mobile/assignedorder/finished_list/: get: operationId: mobile_assignedorder_finished_list_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: engineer schema: type: integer - in: query name: month schema: type: integer description: Only finished assigned orders for this month (1-12). - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: student_user schema: type: integer - in: query name: submodel_id schema: type: integer description: Only assigned orders for this engineer/student id. - in: query name: year schema: type: integer description: Only finished assigned orders for this year. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderViewList' description: '' /api/mobile/assignedorder/list_app/: get: operationId: mobile_assignedorder_list_app_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: engineer schema: type: integer - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: student_user schema: type: integer tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderAppViewList' description: '' /api/mobile/assignedorder/list_device/: get: operationId: mobile_assignedorder_list_device_retrieve description: Viewset that supports all normal viewset functionality. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/ListDeviceResponse' description: '' /api/mobile/assignedorder/list_device_app/: get: operationId: mobile_assignedorder_list_device_app_retrieve description: Viewset that supports all normal viewset functionality. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/ListDeviceResponse' description: '' /api/mobile/assignedorder/list_timesheet_totals/: get: operationId: mobile_assignedorder_list_timesheet_totals_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: query name: mode schema: type: string description: 'Window shown: week (default), month or year.' - in: query name: month schema: type: integer description: Calendar month (1-12) the window is computed for. Honoured for month. - in: query name: start_date schema: type: string description: Anchor date (YYYY-MM-DD); the window is computed from it. Honoured for week and month, ignored for year. - in: query name: user_id schema: type: integer description: User id the totals are computed for; without it the rows span every user. - in: query name: year schema: type: integer description: Calendar year the window is computed for. Honoured for month and year. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/ListTimesheetTotalsResponse' description: '' /api/mobile/assignedorder/split/: post: operationId: mobile_assignedorder_split_create description: Viewset that supports all normal viewset functionality. parameters: - in: query name: engineer schema: type: integer - in: query name: order schema: type: integer - name: q required: false in: query description: A search term. schema: type: string - in: query name: student_user schema: type: integer tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderSplitRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderSplitRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderSplitRequestRequest' required: true responses: '201': content: application/json: schema: type: array items: $ref: '#/components/schemas/AssignedOrder' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. /api/mobile/assignedorderactivity/: get: operationId: mobile_assignedorderactivity_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: assigned_order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderActivityList' description: '' post: operationId: mobile_assignedorderactivity_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderActivityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderActivityRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderActivityRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderActivity' description: '' /api/mobile/assignedorderactivity/{id}/: get: operationId: mobile_assignedorderactivity_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order activity. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderActivity' description: '' patch: operationId: mobile_assignedorderactivity_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order activity. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderActivityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderActivityRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderActivityRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderActivity' description: '' delete: operationId: mobile_assignedorderactivity_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order activity. required: true tags: - mobile responses: '204': description: No response body /api/mobile/assignedorderdocument/: get: operationId: mobile_assignedorderdocument_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: assigned_order schema: type: integer description: Only documents for this assigned order. - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderDocumentList' description: '' post: operationId: mobile_assignedorderdocument_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderDocument' description: '' /api/mobile/assignedorderdocument/{id}/: get: operationId: mobile_assignedorderdocument_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order document. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderDocument' description: '' patch: operationId: mobile_assignedorderdocument_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order document. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderDocument' description: '' delete: operationId: mobile_assignedorderdocument_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order document. required: true tags: - mobile responses: '204': description: No response body /api/mobile/assignedordermaterial/: get: operationId: mobile_assignedordermaterial_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: assigned_order schema: type: integer description: Only materials for this assigned order. - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAssignedOrderMaterialList' description: '' post: operationId: mobile_assignedordermaterial_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/AssignedOrderMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AssignedOrderMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/AssignedOrderMaterialRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderMaterial' description: '' /api/mobile/assignedordermaterial/{id}/: get: operationId: mobile_assignedordermaterial_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order material. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderMaterial' description: '' patch: operationId: mobile_assignedordermaterial_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order material. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAssignedOrderMaterialRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAssignedOrderMaterialRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAssignedOrderMaterialRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignedOrderMaterial' description: '' delete: operationId: mobile_assignedordermaterial_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this assigned order material. required: true tags: - mobile responses: '204': description: No response body /api/mobile/assignedordermaterial/orderlines/: get: operationId: mobile_assignedordermaterial_orderlines_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/AssignedOrderMaterialRequested' description: '' /api/mobile/assignedordermaterial/quotation/: get: operationId: mobile_assignedordermaterial_quotation_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/AssignedOrderMaterialRequested' description: '' /api/mobile/trip/: get: operationId: mobile_trip_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTripList' description: '' post: operationId: mobile_trip_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/TripRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TripRequest' multipart/form-data: schema: $ref: '#/components/schemas/TripRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Trip' description: '' /api/mobile/trip-order/: get: operationId: mobile_trip_order_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTripOrderList' description: '' post: operationId: mobile_trip_order_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/TripOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TripOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/TripOrderRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/TripOrder' description: '' /api/mobile/trip-order/{id}/: get: operationId: mobile_trip_order_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip order. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripOrder' description: '' patch: operationId: mobile_trip_order_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip order. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTripOrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTripOrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTripOrderRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripOrder' description: '' delete: operationId: mobile_trip_order_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip order. required: true tags: - mobile responses: '204': description: No response body /api/mobile/trip-statuscode/: get: operationId: mobile_trip_statuscode_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTripStatuscodeList' description: '' post: operationId: mobile_trip_statuscode_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TripStatuscodeRequest' multipart/form-data: schema: $ref: '#/components/schemas/TripStatuscodeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/TripStatuscode' description: '' /api/mobile/trip-statuscode-action/: get: operationId: mobile_trip_statuscode_action_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTripStatuscodeActionList' description: '' post: operationId: mobile_trip_statuscode_action_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeActionRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TripStatuscodeActionRequest' multipart/form-data: schema: $ref: '#/components/schemas/TripStatuscodeActionRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeAction' description: '' /api/mobile/trip-statuscode-action/{id}/: get: operationId: mobile_trip_statuscode_action_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode action. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeAction' description: '' patch: operationId: mobile_trip_statuscode_action_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode action. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTripStatuscodeActionRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTripStatuscodeActionRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTripStatuscodeActionRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeAction' description: '' delete: operationId: mobile_trip_statuscode_action_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode action. required: true tags: - mobile responses: '204': description: No response body /api/mobile/trip-statuscode-action/operators/: get: operationId: mobile_trip_statuscode_action_operators_retrieve description: Viewset that supports all normal viewset functionality. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeAction' description: '' /api/mobile/trip-statuscode-action/statusoptions/: get: operationId: mobile_trip_statuscode_action_statusoptions_retrieve description: Viewset that supports all normal viewset functionality. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscodeAction' description: '' /api/mobile/trip-statuscode/{id}/: get: operationId: mobile_trip_statuscode_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscode' description: '' patch: operationId: mobile_trip_statuscode_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTripStatuscodeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTripStatuscodeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTripStatuscodeRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripStatuscode' description: '' delete: operationId: mobile_trip_statuscode_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip statuscode. required: true tags: - mobile responses: '204': description: No response body /api/mobile/trip-statuscode/autocomplete/: get: operationId: mobile_trip_statuscode_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/StatuscodeAutocompleteRow' description: '' /api/mobile/trip/{id}/: get: operationId: mobile_trip_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/Trip' description: '' patch: operationId: mobile_trip_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTripRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTripRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTripRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Trip' description: '' delete: operationId: mobile_trip_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip. required: true tags: - mobile responses: '204': description: No response body /api/mobile/trip/{id}/trip_availability_detail/: get: operationId: mobile_trip_trip_availability_detail_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this trip. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/TripAvailabilityDetailResponse' description: '' /api/mobile/trip/trip_availability/: get: operationId: mobile_trip_trip_availability_retrieve description: Viewset that supports all normal viewset functionality. tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/Trip' description: '' /api/mobile/unassign-user-trip/{id}/: post: operationId: mobile_unassign_user_trip_create parameters: - in: path name: id schema: type: integer required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/UnassignTripRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UnassignTripRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/UnassignTripRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignResultResponse' description: '' /api/mobile/unassign-user/{id}/: post: operationId: mobile_unassign_user_create parameters: - in: path name: id schema: type: integer required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/UnassignOrderRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UnassignOrderRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/UnassignOrderRequestRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignResultResponse' description: '' /api/mobile/user-order-availability/: get: operationId: mobile_user_order_availability_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserOrderAvailabilityList' description: '' post: operationId: mobile_user_order_availability_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/UserOrderAvailabilityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserOrderAvailabilityRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserOrderAvailabilityRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserOrderAvailability' description: '' /api/mobile/user-order-availability/{id}/: get: operationId: mobile_user_order_availability_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user order availability. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserOrderAvailability' description: '' patch: operationId: mobile_user_order_availability_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user order availability. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserOrderAvailabilityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserOrderAvailabilityRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserOrderAvailabilityRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserOrderAvailability' description: '' delete: operationId: mobile_user_order_availability_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user order availability. required: true tags: - mobile responses: '204': description: No response body /api/mobile/user-trip-availability/: get: operationId: mobile_user_trip_availability_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedUserTripAvailabilityList' description: '' post: operationId: mobile_user_trip_availability_create description: Viewset that supports all normal viewset functionality. tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/UserTripAvailabilityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserTripAvailabilityRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserTripAvailabilityRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserTripAvailability' description: '' /api/mobile/user-trip-availability/{id}/: get: operationId: mobile_user_trip_availability_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user trip availability. required: true tags: - mobile responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserTripAvailability' description: '' patch: operationId: mobile_user_trip_availability_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user trip availability. required: true tags: - mobile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserTripAvailabilityRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserTripAvailabilityRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserTripAvailabilityRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserTripAvailability' description: '' delete: operationId: mobile_user_trip_availability_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this user trip availability. required: true tags: - mobile responses: '204': description: No response body /api/order/cost/: get: operationId: order_cost_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: cost_type schema: type: string enum: - actual_work - call_out_costs - distance - extra_work - travel_hours - used_materials - work_hours description: |- * `used_materials` - used_materials * `work_hours` - work_hours * `travel_hours` - travel_hours * `distance` - distance * `extra_work` - extra_work * `actual_work` - actual_work * `call_out_costs` - call_out_costs - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderCostList' description: '' post: operationId: order_cost_create description: Viewset that supports all normal viewset functionality. tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderCostRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderCostRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderCostRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderCost' description: '' /api/order/cost/{id}/: get: operationId: order_cost_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderCost' description: '' patch: operationId: order_cost_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOrderCostRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOrderCostRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOrderCostRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderCost' description: '' delete: operationId: order_cost_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - order responses: '204': description: No response body /api/order/cost/order/{order_id}/{cost_type}/: post: operationId: order_cost_order_create description: Replace the costs of one type on an order parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: cost_type schema: type: string pattern: ^\w+$ required: true - in: query name: cost_type schema: type: string enum: - actual_work - call_out_costs - distance - extra_work - travel_hours - used_materials - work_hours description: |- * `used_materials` - used_materials * `work_hours` - work_hours * `travel_hours` - travel_hours * `distance` - distance * `extra_work` - extra_work * `actual_work` - actual_work * `call_out_costs` - call_out_costs - in: query name: order schema: type: integer - in: path name: order_id schema: type: string pattern: ^\d+$ required: true - name: q required: false in: query description: A search term. schema: type: string tags: - order requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderCostRowRequest' application/x-www-form-urlencoded: schema: type: array items: $ref: '#/components/schemas/OrderCostRowRequest' multipart/form-data: schema: type: array items: $ref: '#/components/schemas/OrderCostRowRequest' required: true responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderCost' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/document/: get: operationId: order_document_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDocumentList' description: '' post: operationId: order_document_create description: Viewset that supports all normal viewset functionality. tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderDocument' description: '' /api/order/document/{id}/: get: operationId: order_document_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order document. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderDocument' description: '' patch: operationId: order_document_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order document. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOrderDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOrderDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOrderDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderDocument' description: '' delete: operationId: order_document_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order document. required: true tags: - order responses: '204': description: No response body /api/order/filter/: get: operationId: order_filter_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderFilterList' description: '' post: operationId: order_filter_create description: Viewset that supports all normal viewset functionality. tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderFilterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderFilterRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderFilterRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' /api/order/filter/{id}/: get: operationId: order_filter_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order filter. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' patch: operationId: order_filter_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order filter. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOrderFilterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOrderFilterRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOrderFilterRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' delete: operationId: order_filter_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order filter. required: true tags: - order responses: '204': description: No response body /api/order/filter/get_base_filter_options/: get: operationId: order_filter_get_base_filter_options_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' /api/order/filter/get_examples/: get: operationId: order_filter_get_examples_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderFilterExample' description: '' /api/order/filter/get_fields/: get: operationId: order_filter_get_fields_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilterFields' description: '' /api/order/filter/get_non_text_field_types/: get: operationId: order_filter_get_non_text_field_types_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' /api/order/filter/get_operators/: get: operationId: order_filter_get_operators_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilterOperators' description: '' /api/order/filter/get_status_fields/: get: operationId: order_filter_get_status_fields_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderFilter' description: '' /api/order/filter/get_statuses/: get: operationId: order_filter_get_statuses_retrieve description: Viewset that supports all normal viewset functionality. tags: - order responses: '200': content: application/json: schema: type: array items: type: string description: '' /api/order/filter/simple_list/: get: operationId: order_filter_simple_list_list description: Viewset that supports all normal viewset functionality. parameters: - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderFilterSimple' description: '' /api/order/infoline/: get: operationId: order_infoline_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEngineerInfoLineList' description: '' post: operationId: order_infoline_create description: Viewset that supports all normal viewset functionality. tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/EngineerInfoLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EngineerInfoLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/EngineerInfoLineRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/EngineerInfoLine' description: '' /api/order/infoline/{id}/: get: operationId: order_infoline_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer info line. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerInfoLine' description: '' patch: operationId: order_infoline_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer info line. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEngineerInfoLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEngineerInfoLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEngineerInfoLineRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EngineerInfoLine' description: '' delete: operationId: order_infoline_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this engineer info line. required: true tags: - order responses: '204': description: No response body /api/order/order/: get: operationId: order_order_list description: |- Get order list. Filtering, ordering and pagination are all driven by query parameters: * **Filter** on a column with its bare name, e.g. `?order_name=ikea&order_type=service`. Text columns match a case-insensitive substring; `assigned_count` takes an exact number or a `..`/`...` range; `start_date`/`end_date` take a date, month or year (`2026-09-15`, `2026-09`, `2026`), a `..`/`...` range over those, or the one-sided `start_date__from`/`start_date__until` word spellings. Parameters combine with AND. * **Search** across a fixed set of text columns with `?q=`. * **Order** with `?ordering=`, comma-separated, `-` for descending, e.g. `?ordering=-start_date,order_name`. * **Paginate** with `?page=`/`?page_size=`, or with `?limit=`/`?offset=` for windowed access. Both cap out at 1000 rows per request. The parameters documented explicitly below predate this scheme and are kept for existing callers. parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. - in: query name: mode schema: type: string enum: - all - dispatch - equipment_location - finished - inprogress - past - sales_orders - unaccepted - unassigned description: 'Which order set to list. `all` is the default and behaves as if the parameter were omitted. Every other value selects the set one of the old list actions used to serve: `unaccepted` (not yet accepted by the customer), `dispatch` / `inprogress` / `finished` (the dispatch board sets), `past`, `sales_orders`, `unassigned` (assignable to an engineer), `equipment_location` (filtered by `?equipment=` / `?location=`). Unknown values are a 400.' - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_by schema: type: string enum: - default - last_update - start_date description: Legacy sorting. Superseded by `ordering`, which takes precedence when both are given. - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - in: query name: orders schema: type: string description: Comma-separated order pks. When given, no other filtering is applied beyond the caller's own role scoping. Equivalent to `id__in`. - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: since schema: type: string format: date description: Only orders whose `start_date` is on or after this date. - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string - in: query name: user_filter schema: type: integer description: Id of a saved OrderFilter. When given, it replaces the base queryset entirely and the equipment and branch parameters below are not applied. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' post: operationId: order_order_create description: Create an order parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderCreateRequestRequest' examples: CreateExample_: value: customer_id: '1263' order_name: Fictie B.V. order_address: Metaalweg 4 order_postal: 3751LS order_city: Bunschoten-Spakenburg order_country_code: NL customer_relation: 1167 order_type: Storing order_reference: ref-1 order_tel: 0650008 order_mobile: '+316123456789' order_email: test@test.com order_contact: L. Welling start_date: '2023-10-17' end_date: '2023-10-24' remarks: My remarks summary: 'Create example ' description: Example payload to create an order application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderCreateRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderCreateRequestRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderCreateRequest' examples: CreateExample_: value: customer_id: '1263' order_name: Fictie B.V. order_address: Metaalweg 4 order_postal: 3751LS order_city: Bunschoten-Spakenburg order_country_code: NL customer_relation: 1167 order_type: Storing order_reference: ref-1 order_tel: 0650008 order_mobile: '+316123456789' order_email: test@test.com order_contact: L. Welling start_date: '2023-10-17' end_date: '2023-10-24' remarks: My remarks summary: 'Create example ' description: Example payload to create an order description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/{id}/: get: operationId: order_order_retrieve description: Get an order by pk or uuid parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: string description: Order pk or uuid. A uuid addresses the order the emailed link carries; the answer is the full detail either way. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderDetail' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' patch: operationId: order_order_partial_update description: Partially update an order parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOrderUpdateVariantRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOrderUpdateVariantRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOrderUpdateVariantRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderUpdateVariant' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' delete: operationId: order_order_destroy description: Delete an order parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/{id}/assign_me/: post: operationId: order_order_assign_me_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AssignResultResponse' description: '' /api/order/order/{id}/create_pdf_background/: post: operationId: order_order_create_pdf_background_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Order' description: '' /api/order/order/{id}/order_availability_detail/: get: operationId: order_order_order_availability_detail_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderAvailabilityDetailResponse' description: '' /api/order/order/{id}/recreate_pdf/: post: operationId: order_order_recreate_pdf_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: gotenberg schema: type: integer description: Legacy flag accepted for compatibility; unused by this action. - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/order/order/{id}/recreate_pdf_background/: post: operationId: order_order_recreate_pdf_background_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Order' description: '' /api/order/order/{id}/set_order_accepted/: post: operationId: order_order_set_order_accepted_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/SetOrderAcceptedResponse' description: '' /api/order/order/{id}/set_order_rejected/: post: operationId: order_order_set_order_rejected_create description: PDF generation methods for :class:`OrderViewset`. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/order/order/all_for_customer_not_accepted/: get: operationId: order_order_all_for_customer_not_accepted_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' /api/order/order/all_for_customer_not_accepted_count/: get: operationId: order_order_all_for_customer_not_accepted_count_retrieve description: PDF generation methods for :class:`OrderViewset`. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountResponse' description: '' /api/order/order/all_for_customer_v2/: get: operationId: order_order_all_for_customer_v2_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderCustomerHistoryList' description: '' /api/order/order/all_for_equipment_location/: get: operationId: order_order_all_for_equipment_location_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' /api/order/order/assignable/: get: operationId: order_order_assignable_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/autocomplete/: get: operationId: order_order_autocomplete_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: q schema: type: string description: Case-insensitive substring match on the order name, address or city. - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderAutocomplete' description: '' /api/order/order/counts_year_order_type_stats/: get: operationId: order_order_counts_year_order_type_stats_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only statistics for this branch id. Planning/staff only. - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: customer schema: type: integer description: Only statistics for this customer id. Planning/staff only. - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/CountsYearOrderTypeStatsResponse' description: '' /api/order/order/dispatch_list_all/: get: operationId: order_order_dispatch_list_all_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/dispatch_list_finished/: get: operationId: order_order_dispatch_list_finished_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/dispatch_list_inprogress/: get: operationId: order_order_dispatch_list_inprogress_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/dispatch_list_unassigned/: get: operationId: order_order_dispatch_list_unassigned_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string description: 'Only rows whose end_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `end_date=2026-09...2026-10` the inclusive months, `end_date=2026-09..2026-11` the exclusive same, `end_date=2026-11...` open-ended.' - in: query name: end_date__from schema: type: string description: Only rows whose end_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: end_date__until schema: type: string description: Only rows whose end_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -assigned_count - -branch__name - -created - -customer_id - -customer_relation__name - -end_date - -id - -last_status_qs - -last_update_qs - -modified - -order_city - -order_id - -order_name - -order_type - -start_date - -total_price_selling - assigned_count - branch__name - created - customer_id - customer_relation__name - end_date - id - last_status_qs - last_update_qs - modified - order_city - order_id - order_name - order_type - start_date - total_price_selling description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. Takes precedence over the legacy `order_by`. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: order_id, order_name, order_type, start_date, last_status_qs, assigned_count, id, end_date, order_city, customer_id, customer_relation__name, branch__name, total_price_selling, created, modified, last_update_qs.' - in: query name: start_date schema: type: string description: 'Only rows whose start_date falls in this period. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. A range over periods: `start_date=2026-09...2026-10` the inclusive months, `start_date=2026-09..2026-11` the exclusive same, `start_date=2026-11...` open-ended.' - in: query name: start_date__from schema: type: string description: Only rows whose start_date is on or after this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the first day of the period it spells. - in: query name: start_date__until schema: type: string description: Only rows whose start_date is on or before this. A date YYYY-MM-DD, month YYYY-MM or year YYYY. Partial values name the whole period they spell. Snaps to the last day of the period it spells. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/get_top_x_customers/: get: operationId: order_order_get_top_x_customers_retrieve description: PDF generation methods for :class:`OrderViewset`. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/TopCustomersResponse' description: '' /api/order/order/get_within_range/: get: operationId: order_order_get_within_range_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderDispatchList' description: '' /api/order/order/maintenance_orders/: get: operationId: order_order_maintenance_orders_list description: Orders with order lines under a maintenance contract, newest first parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: contract schema: type: integer description: Only orders with order lines under this maintenance contract. Omit for orders under any maintenance contract. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - in: query name: page schema: type: integer description: Page number. - in: query name: page_size schema: type: integer description: Rows per page (max 1000). - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/maintenance_orders_events/: get: operationId: order_order_maintenance_orders_events_retrieve description: PDF generation methods for :class:`OrderViewset`. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/Order' description: '' /api/order/order/month_events/: get: operationId: order_order_month_events_list description: Calendar events (FullCalendar shape) for orders in a date range. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end schema: type: string description: Inclusive end bound (YYYY-MM-DD). required: true - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: q required: false in: query description: A search term. schema: type: string - in: query name: start schema: type: string description: Inclusive start bound (YYYY-MM-DD). required: true - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderEvent' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/month_list/: get: operationId: order_order_month_list_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only orders for this branch id. - in: query name: customer schema: type: integer description: Only orders for this customer id. - in: query name: month schema: type: integer description: Which month to aggregate. Defaults to now. - in: query name: order_type schema: type: string description: Restrict to one order type; "all" disables that filter. - in: query name: year schema: type: integer description: Which year to aggregate. Defaults to now. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/MonthListResponse' description: '' /api/order/order/new/: get: operationId: order_order_new_retrieve description: 'One payload for a new order: the resolved branch, customer, quotation and equipment rows the form fills and stages.' parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: query name: equipment schema: type: array items: type: integer description: Equipment ids to stage order rows for. - in: query name: from_quotation schema: type: integer description: 'Quotation to create from: its customer and reference are copied over.' - in: query name: maintenance_customer schema: type: integer description: Customer the staged maintenance equipment belongs to. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderSeedResponse' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/order_availability/: get: operationId: order_order_order_availability_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderMinimalSerializerCountsList' description: '' /api/order/order/order_counts_stats/: get: operationId: order_order_order_counts_stats_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only statistics for this branch id. Planning/staff only. - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: customer schema: type: integer description: Only statistics for this customer id. Planning/staff only. - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderCountsStatsResponse' description: '' /api/order/order/order_types/: get: operationId: order_order_order_types_retrieve description: Order types parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - order responses: '200': content: application/json: schema: type: array items: type: string examples: OrderTypesExample: value: - storing - project summary: Order types example description: Example order types response description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/order/order_types_month_stats/: get: operationId: order_order_order_types_month_stats_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only statistics for this branch id. Planning/staff only. - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: customer schema: type: integer description: Only statistics for this customer id. Planning/staff only. - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderTypesMonthStatsResponse' description: '' /api/order/order/order_types_stats/: get: operationId: order_order_order_types_stats_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only statistics for this branch id. Planning/staff only. - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: customer schema: type: integer description: Only statistics for this customer id. Planning/staff only. - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderTypesStatsResponse' description: '' /api/order/order/past/: get: operationId: order_order_past_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' /api/order/order/sales_orders/: get: operationId: order_order_sales_orders_list description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: assigned_count schema: type: string - in: query name: branch schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: customer_reference schema: type: string - in: query name: customer_relation schema: oneOf: - type: integer - type: string description: One id, or several comma-separated ids. A single id may ride as a number (?customer=12); more than one, and an id list restored from a shared address, is the comma-joined string, where a comma inside an item is escaped \,. - in: query name: end_date schema: type: string - in: query name: end_date__from schema: type: string - in: query name: end_date__until schema: type: string - in: query name: external_identifier schema: type: string - in: query name: last_status schema: type: string - name: limit required: false in: query description: Number of results to return per page, counting from `offset`. Supplying this switches the endpoint from page-number to limit/offset pagination. Capped at 1000. schema: type: integer maximum: 1000 minimum: 0 - name: offset required: false in: query description: The initial index from which to return the results. Only read when `limit` is supplied. schema: type: integer minimum: 0 - in: query name: order_address schema: type: string - in: query name: order_city schema: type: string - in: query name: order_id schema: type: string - in: query name: order_name schema: type: string - in: query name: order_reference schema: type: string - in: query name: order_type schema: type: string - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: start_date schema: type: string - in: query name: start_date__from schema: type: string - in: query name: start_date__until schema: type: string - in: query name: year schema: type: integer description: Only orders with sales mutations in this year. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderList' description: '' /api/order/order/user_filter_count/: get: operationId: order_order_user_filter_count_retrieve description: PDF generation methods for :class:`OrderViewset`. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/Order' description: '' /api/order/order/year_list/: get: operationId: order_order_year_list_retrieve description: PDF generation methods for :class:`OrderViewset`. parameters: - in: query name: branch schema: type: integer description: Only orders for this branch id. - in: query name: customer schema: type: integer description: Only orders for this customer id. - in: query name: order_type schema: type: string description: Restrict to one order type; "all" disables that filter. - in: query name: year schema: type: integer description: Which year to aggregate. Defaults to now. tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/YearListResponse' description: '' /api/order/orderline/: get: operationId: order_orderline_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: order schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderLineDetailList' description: '' post: operationId: order_orderline_create description: Create an order line parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderLineCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderLineCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderLineCreateUpdateRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderLineCreateUpdate' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/orderline/{id}/: get: operationId: order_orderline_retrieve description: Get an order line parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this order line. required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderLineDetail' description: '' '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' patch: operationId: order_orderline_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this order line. required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOrderLineDetailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOrderLineDetailRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOrderLineDetailRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderLineDetail' description: '' delete: operationId: order_orderline_destroy description: Delete an order line parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: path name: id schema: type: integer description: A unique integer value identifying this order line. required: true tags: - order responses: '204': description: No response body '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/orderline/assigned_order/{assigned_order_id}/: get: operationId: order_orderline_assigned_order_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: assigned_order_id schema: type: string pattern: ^\d+$ required: true tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderLineDetail' description: '' /api/order/orderline/latest_workorders/: get: operationId: order_orderline_latest_workorders_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: building schema: type: integer description: Only orders with an orderline on equipment in this building id. - in: query name: equipment schema: type: integer description: Only orders with an orderline on this equipment id. - in: query name: location schema: type: integer description: Only orders with an orderline on equipment at this location id. - in: query name: order schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderlineEquipmentWorkorder' description: '' /api/order/orderline/order/{order_id}/: get: operationId: order_orderline_order_list description: Get order lines for an order parameters: - in: query name: order schema: type: integer - in: path name: order_id schema: type: string pattern: ^\w+$ required: true - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderLineDetailList' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/order/status/: post: operationId: order_status_create tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/OrderStatusRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OrderStatusRequest' multipart/form-data: schema: $ref: '#/components/schemas/OrderStatusRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OrderStatus' description: '' /api/order/statuses/: get: operationId: order_statuses_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - order responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOrderStatusFullList' description: '' /api/order/workorder-data/{id}/: get: operationId: order_workorder_data_retrieve parameters: - in: path name: id schema: type: string pattern: ^[0-9A-Za-z_\-=]+$ required: true tags: - order security: - {} responses: '200': content: application/json: schema: type: object properties: order: $ref: '#/components/schemas/Order' member: $ref: '#/components/schemas/Member' copied_order_data: type: array items: $ref: '#/components/schemas/CopiedOrderData' assigned_order_activity: type: array items: type: object additionalProperties: true assigned_order_activity_totals: type: object additionalProperties: true assigned_order_extra_work: type: array items: type: object additionalProperties: true assigned_order_materials: type: array items: type: object additionalProperties: true signatures: type: object nullable: true properties: signature_user: type: string signature_name_user: type: string signature_customer: type: string signature_name_customer: type: string description_work: type: array items: type: object properties: user: type: string description_work: type: string required: - user - description_work equipment: type: array items: type: object properties: user: type: string equipment: type: string required: - user - equipment required: - order - member - copied_order_data - assigned_order_activity - assigned_order_activity_totals - assigned_order_extra_work - assigned_order_materials - description_work - equipment description: '' /api/quotation/chapter/: get: operationId: quotation_chapter_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedChapterList' description: '' post: operationId: quotation_chapter_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/ChapterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ChapterRequest' multipart/form-data: schema: $ref: '#/components/schemas/ChapterRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Chapter' description: '' /api/quotation/chapter/{id}/: get: operationId: quotation_chapter_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this chapter. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/Chapter' description: '' patch: operationId: quotation_chapter_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this chapter. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedChapterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedChapterRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedChapterRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Chapter' description: '' delete: operationId: quotation_chapter_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this chapter. required: true tags: - quotation responses: '204': description: No response body /api/quotation/cost/: get: operationId: quotation_cost_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: chapter schema: type: integer - in: query name: cost_type schema: type: string enum: - actual_work - call_out_costs - distance - extra_work - travel_hours - used_materials - work_hours description: |- * `used_materials` - used_materials * `work_hours` - work_hours * `travel_hours` - travel_hours * `distance` - distance * `extra_work` - extra_work * `actual_work` - actual_work * `call_out_costs` - call_out_costs - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationCostList' description: '' post: operationId: quotation_cost_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationCostRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationCostRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationCostRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationCost' description: '' /api/quotation/cost/{id}/: get: operationId: quotation_cost_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationCost' description: '' patch: operationId: quotation_cost_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationCostRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationCostRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationCostRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationCost' description: '' delete: operationId: quotation_cost_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this cost. required: true tags: - quotation responses: '204': description: No response body /api/quotation/cost/quotation/{quotation_id}/{cost_type}/: post: operationId: quotation_cost_quotation_create description: Replace the costs of one type on a quotation, optionally scoped to one chapter with `?chapter=` parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: query name: chapter schema: type: integer - in: path name: cost_type schema: type: string pattern: ^\w+$ required: true - in: query name: cost_type schema: type: string enum: - actual_work - call_out_costs - distance - extra_work - travel_hours - used_materials - work_hours description: |- * `used_materials` - used_materials * `work_hours` - work_hours * `travel_hours` - travel_hours * `distance` - distance * `extra_work` - extra_work * `actual_work` - actual_work * `call_out_costs` - call_out_costs - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer - in: path name: quotation_id schema: type: string pattern: ^\d+$ required: true tags: - quotation requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationCostRowRequest' application/x-www-form-urlencoded: schema: type: array items: $ref: '#/components/schemas/QuotationCostRowRequest' multipart/form-data: schema: type: array items: $ref: '#/components/schemas/QuotationCostRowRequest' required: true responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationCost' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/quotation/document/: get: operationId: quotation_document_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationDocumentList' description: '' post: operationId: quotation_document_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationDocumentRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationDocument' description: '' /api/quotation/document/{id}/: get: operationId: quotation_document_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation document. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationDocument' description: '' patch: operationId: quotation_document_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation document. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationDocumentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationDocumentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationDocument' description: '' delete: operationId: quotation_document_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation document. required: true tags: - quotation responses: '204': description: No response body /api/quotation/offer/: get: operationId: quotation_offer_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedOfferList' description: '' post: operationId: quotation_offer_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/OfferRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OfferRequest' multipart/form-data: schema: $ref: '#/components/schemas/OfferRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Offer' description: '' /api/quotation/offer/{id}/: get: operationId: quotation_offer_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this offer. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/Offer' description: '' patch: operationId: quotation_offer_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this offer. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedOfferRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedOfferRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedOfferRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Offer' description: '' delete: operationId: quotation_offer_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this offer. required: true tags: - quotation responses: '204': description: No response body /api/quotation/offer/get_unsent_offer/: get: operationId: quotation_offer_get_unsent_offer_retrieve description: |- The unsent offer of a quotation, if any, and what sending it needs: the quotation it is for and the files it goes out with. parameters: - in: query name: quotationId schema: type: integer required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/UnsentOfferResponse' description: '' /api/quotation/quotation/: get: operationId: quotation_quotation_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationList' description: '' post: operationId: quotation_quotation_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationRequest' responses: '201': content: application/json: schema: $ref: '#/components/schemas/Quotation' description: '' /api/quotation/quotation-image/: get: operationId: quotation_quotation_image_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationImageList' description: '' post: operationId: quotation_quotation_image_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationImageRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationImageRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationImageRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationImage' description: '' /api/quotation/quotation-image/{id}/: get: operationId: quotation_quotation_image_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation image. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationImage' description: '' patch: operationId: quotation_quotation_image_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation image. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationImageRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationImageRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationImageRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationImage' description: '' delete: operationId: quotation_quotation_image_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation image. required: true tags: - quotation responses: '204': description: No response body /api/quotation/quotation-line/: get: operationId: quotation_quotation_line_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: chapter schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationLineList' description: '' post: operationId: quotation_quotation_line_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationLineRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationLine' description: '' /api/quotation/quotation-line-image/: get: operationId: quotation_quotation_line_image_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation_line schema: type: integer tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationLineImageList' description: '' post: operationId: quotation_quotation_line_image_create description: Viewset that supports all normal viewset functionality. tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationLineImageRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationLineImageRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationLineImageRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationLineImage' description: '' /api/quotation/quotation-line-image/{id}/: get: operationId: quotation_quotation_line_image_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line image. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationLineImage' description: '' patch: operationId: quotation_quotation_line_image_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line image. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationLineImageRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationLineImageRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationLineImageRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationLineImage' description: '' delete: operationId: quotation_quotation_line_image_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line image. required: true tags: - quotation responses: '204': description: No response body /api/quotation/quotation-line/{id}/: get: operationId: quotation_quotation_line_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationLine' description: '' patch: operationId: quotation_quotation_line_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationLineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationLineRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationLineRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationLine' description: '' delete: operationId: quotation_quotation_line_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation line. required: true tags: - quotation responses: '204': description: No response body /api/quotation/quotation-line/chapter/{chapter_id}/: post: operationId: quotation_quotation_line_chapter_create description: Replace the lines of one chapter parameters: - in: header name: Authorization schema: type: string description: Authorization token examples: HeaderExample: value: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjBfRmpHQUQ3d0YzU19pc0pULXVWUmpxOVBJS0ZvQm5SVHp5SHBWbHhsaDgiLCJ0eXAiOiJKV1QifQ.eyJ0b2tlbl90eXBlIjoic2xpZGluZyIsImV4cCI6MTcxNjMxNzU3MiwiaWF0IjoxNzE1NzA1NTcyLCJqdGkiOiIxNWVmM2IzZDUyNDg0ZDg5OGM0MzFjYTc5ZGNiMTc0OSIsInJlZnJlc2hfZXhwIjoxNzE2OTE1MTcyLCJpc3MiOiJodHRwczovL2FwaS5teTI0c2VydmljZS5jb20vIiwidXNlcl90eXBlIjoiYXBpX3VzZXIiLCJ1c2VyX2lkIjoiYzY2YzYyMGYtZDM0YS00OGYwLTk4MmMtMjljNTNmZWRjNGRmIn0.dVD_6IbWQJTqIFQt5dGcpza13j089QLAV7Lmc3Nlu_1g424z5uKKB3SA4JQoiO38ZZhWWBO_p1uXKyGEopEa-BfhRXdFiexP5NJvyWMqBdwRgk5k8xl3XoXo6HpvRwN7wtDV1xYDWij1cz7Of_NaTsDvLuAfKbw1TYLGd0lqfYHzHu9YPTz1NRZA-gD0rl0ctF5aSiEoUks0iZOHUeHBnl0HnR7VbABTl5Fy3zeHRt4_-2tZbiFkPGCW8EuBgbyQRLFIvlKsb2k2IJxA36bHf9xrnfpYAUvb1Byn07uZ7L4e61AkME356gqsFEapIJEB6WKeLsYgvxltSgCEelKcwdGC0seaVei96WqhiuZaWMkzVNxw0Hm6qcnSlP-P0ugmeI_CyX5DZoq7A0OQOPaBY4Mnw5VRk0MPtOFhnol7-6j4Wfxv7TSMpLDmQCV_hrvIcLGGfc7RySV3qD45Z-9Usw66LDSrsx86eXaHmF4W2w7Qo2tftOIvVfHhR_n6fl4hpCcOyrj4JmPLaoW6RIlsAhpt58kuyzM6432n83_xEp7JtdO1HQwX4wct5Fe2AM7c4yMZgfbM4fFagZW6SQiBNtmGEmB7qi-p48hh9dwNSYMfjJF7pqefx2Rm3GVLT5kRe-gdvIsYNNmy8YuCtGXycUC_3UO8zAVJL7MjBt_EyaU summary: Header example description: example value for the Authorization header - in: query name: chapter schema: type: integer - in: path name: chapter_id schema: type: string pattern: ^\d+$ required: true - name: q required: false in: query description: A search term. schema: type: string - in: query name: quotation schema: type: integer tags: - quotation requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationLineRowRequest' application/x-www-form-urlencoded: schema: type: array items: $ref: '#/components/schemas/QuotationLineRowRequest' multipart/form-data: schema: type: array items: $ref: '#/components/schemas/QuotationLineRowRequest' required: true responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationLine' description: '' '400': content: application/json: schema: type: object additionalProperties: type: array items: type: string description: Validation error. '404': content: application/json: schema: $ref: '#/components/schemas/NotFoundResponse' description: '' '401': content: application/json: schema: $ref: '#/components/schemas/UnauthorizedResponse' description: '' '403': content: application/json: schema: $ref: '#/components/schemas/ForbiddenResponse' description: '' /api/quotation/quotation/{id}/: get: operationId: quotation_quotation_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/Quotation' description: '' patch: operationId: quotation_quotation_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedQuotationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedQuotationRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedQuotationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Quotation' description: '' delete: operationId: quotation_quotation_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation responses: '204': description: No response body /api/quotation/quotation/{id}/download_definitive_pdf/: post: operationId: quotation_quotation_download_definitive_pdf_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Quotation' description: '' /api/quotation/quotation/{id}/generate_definitive_pdf/: post: operationId: quotation_quotation_generate_definitive_pdf_create description: |- Generate the definitive quotation PDF, and answer with the quotation as it now stands - carrying the new PDF's filename. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/QuotationDetail' description: '' '400': description: No response body /api/quotation/quotation/{id}/generate_preview_pdf/: post: operationId: quotation_quotation_generate_preview_pdf_create description: Endpoint to generate a preview quotation PDF parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Quotation' description: '' /api/quotation/quotation/{id}/get_materials_for_app/: get: operationId: quotation_quotation_get_materials_for_app_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationLineMaterial' description: '' /api/quotation/quotation/{id}/make_definitive/: post: operationId: quotation_quotation_make_definitive_create description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this quotation. required: true tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ResultResponse' description: '' /api/quotation/quotation/autocomplete/: get: operationId: quotation_quotation_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/QuotationAutocompleteRow' description: '' /api/quotation/quotation/not_accepted/: get: operationId: quotation_quotation_not_accepted_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationPreliminaryResponseList' description: '' /api/quotation/quotation/preliminary/: get: operationId: quotation_quotation_preliminary_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationPreliminaryResponseList' description: '' /api/quotation/quotation/sent/: get: operationId: quotation_quotation_sent_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: customer_relation schema: type: integer - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string tags: - quotation responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedQuotationPreliminaryResponseList' description: '' /api/quotation/status/: post: operationId: quotation_status_create tags: - quotation requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotationStatusRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/QuotationStatusRequest' multipart/form-data: schema: $ref: '#/components/schemas/QuotationStatusRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/QuotationStatus' description: '' /api/set-language/: post: operationId: set_language_create tags: - set-language requestBody: content: application/json: schema: $ref: '#/components/schemas/SetLanguageRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SetLanguageRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/SetLanguageRequestRequest' security: - {} responses: '204': description: No response body /api/statuscode/action/: get: operationId: statuscode_action_list description: Viewset that supports all normal viewset functionality. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: statuscode schema: type: integer tags: - statuscode responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedActionList' description: '' post: operationId: statuscode_action_create description: Viewset that supports all normal viewset functionality. tags: - statuscode requestBody: content: application/json: schema: $ref: '#/components/schemas/ActionRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ActionRequest' multipart/form-data: schema: $ref: '#/components/schemas/ActionRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Action' description: '' /api/statuscode/action/{id}/: get: operationId: statuscode_action_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this action. required: true tags: - statuscode responses: '200': content: application/json: schema: $ref: '#/components/schemas/Action' description: '' patch: operationId: statuscode_action_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this action. required: true tags: - statuscode requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedActionRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedActionRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedActionRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Action' description: '' delete: operationId: statuscode_action_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this action. required: true tags: - statuscode responses: '204': description: No response body /api/statuscode/action/operators/: get: operationId: statuscode_action_operators_retrieve description: Viewset that supports all normal viewset functionality. tags: - statuscode responses: '200': content: application/json: schema: type: array items: type: string description: '' /api/statuscode/action/statusoptions/: get: operationId: statuscode_action_statusoptions_retrieve description: Viewset that supports all normal viewset functionality. tags: - statuscode responses: '200': content: application/json: schema: type: object additionalProperties: type: string description: '' /api/statuscode/statuscode/: get: operationId: statuscode_statuscode_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: code_type schema: type: string - in: query name: description schema: type: string - in: query name: ordering schema: type: array items: type: string enum: - -code_type - -description - -statuscode - code_type - description - statuscode description: Fields to sort by, in order of precedence. Prefix a field with `-` for descending. explode: false style: form - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: 'Number of results to return per page. Capped at 1000: a larger value is clamped, not rejected.' schema: type: integer maximum: 1000 minimum: 1 - name: q required: false in: query description: A search term. schema: type: string - in: query name: sort_dir schema: type: string description: Sort direction; anything but `desc` sorts ascending. - in: query name: sort_field schema: type: string description: 'The column to sort by. Sortable columns: statuscode, description, code_type.' - in: query name: statuscode schema: type: string tags: - statuscode responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedStatuscodeList' description: '' post: operationId: statuscode_statuscode_create description: Viewset that supports all normal viewset functionality. tags: - statuscode requestBody: content: application/json: schema: $ref: '#/components/schemas/StatuscodeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StatuscodeRequest' multipart/form-data: schema: $ref: '#/components/schemas/StatuscodeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Statuscode' description: '' /api/statuscode/statuscode/{id}/: get: operationId: statuscode_statuscode_retrieve description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this statuscode. required: true tags: - statuscode responses: '200': content: application/json: schema: $ref: '#/components/schemas/Statuscode' description: '' patch: operationId: statuscode_statuscode_partial_update description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this statuscode. required: true tags: - statuscode requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedStatuscodeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedStatuscodeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedStatuscodeRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Statuscode' description: '' delete: operationId: statuscode_statuscode_destroy description: Viewset that supports all normal viewset functionality. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this statuscode. required: true tags: - statuscode responses: '204': description: No response body /api/statuscode/statuscode/autocomplete/: get: operationId: statuscode_statuscode_autocomplete_list description: Viewset that supports all normal viewset functionality. parameters: - in: query name: code_type schema: type: string - in: query name: description schema: type: string - name: q required: false in: query description: A search term. schema: type: string - in: query name: statuscode schema: type: string tags: - statuscode responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/StatuscodeAutocompleteRow' description: '' /api/statuscode/statuscode/roles/: get: operationId: statuscode_statuscode_roles_retrieve description: The settings keys a status row of ``code_type`` can carry as roles. parameters: - in: query name: code_type schema: type: string enum: - invoice - leave_hours - order - purchase_order - quotation - sick_leave - trip - work_hours required: true tags: - statuscode responses: '200': content: application/json: schema: type: array items: type: string description: '' /api/teamleader/authorize/: post: operationId: teamleader_authorize_create tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/AuthorizeResponse' description: '' /api/teamleader/business-type-list/: get: operationId: teamleader_business_type_list_retrieve tags: - teamleader responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever the Teamleader API answered for this resource; the keys and value shapes are Teamleader's. An empty object means there was no valid token to call it with. description: '' /api/teamleader/check-tokens/: post: operationId: teamleader_check_tokens_create tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/CheckTokenResponse' description: '' /api/teamleader/config/: get: operationId: teamleader_config_retrieve tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/Config' description: '' /api/teamleader/department/: get: operationId: teamleader_department_retrieve tags: - teamleader responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever the Teamleader API answered for this resource; the keys and value shapes are Teamleader's. An empty object means there was no valid token to call it with. description: '' /api/teamleader/empty-tokens/: post: operationId: teamleader_empty_tokens_create tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/StatusOkResponse' description: '' /api/teamleader/invoice-document-template/: get: operationId: teamleader_invoice_document_template_retrieve tags: - teamleader responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever the Teamleader API answered for this resource; the keys and value shapes are Teamleader's. An empty object means there was no valid token to call it with. description: '' /api/teamleader/oauth/: post: operationId: teamleader_oauth_create tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/OAuthRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OAuthRequest' multipart/form-data: schema: $ref: '#/components/schemas/OAuthRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/StatusOkResponse' description: '' /api/teamleader/product-category/: get: operationId: teamleader_product_category_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedProductCategoryList' description: '' /api/teamleader/product-category-reset/: post: operationId: teamleader_product_category_reset_create tags: - teamleader responses: '200': content: application/json: schema: type: object description: The tallies of a TaxRate/ProductCategory reset. An empty object means there was no valid token. properties: delete_result: type: array items: {} created: type: integer description: '' /api/teamleader/product-detail/: get: operationId: teamleader_product_detail_retrieve parameters: - in: query name: id schema: type: string description: The Teamleader product uuid. required: true tags: - teamleader responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever the Teamleader API answered for this resource; the keys and value shapes are Teamleader's. An empty object means there was no valid token to call it with. description: '' /api/teamleader/product-list/: get: operationId: teamleader_product_list_retrieve parameters: - in: query name: query schema: type: string description: Free-text term Teamleader filters its products on. tags: - teamleader responses: '200': content: application/json: schema: type: object additionalProperties: true description: Whatever the Teamleader API answered for this resource; the keys and value shapes are Teamleader's. An empty object means there was no valid token to call it with. description: '' /api/teamleader/tax-rate/: get: operationId: teamleader_tax_rate_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer tags: - teamleader responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedTaxRateList' description: '' /api/teamleader/tax-rate-reset/: post: operationId: teamleader_tax_rate_reset_create tags: - teamleader responses: '200': content: application/json: schema: type: object description: The tallies of a TaxRate/ProductCategory reset. An empty object means there was no valid token. properties: delete_result: type: array items: {} created: type: integer description: '' /api/teamleader/tl-product-create/: post: operationId: teamleader_tl_product_create_create tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/ProductRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProductRequest' multipart/form-data: schema: $ref: '#/components/schemas/ProductRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Product' description: '' /api/teamleader/tl-product-create-link/: post: operationId: teamleader_tl_product_create_link_create tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/TeamleaderProductCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TeamleaderProductCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/TeamleaderProductCreateRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/CreateLinkResponse' description: '' /api/teamleader/tl-product-list/: get: operationId: teamleader_tl_product_list_list parameters: - in: query name: ids schema: type: string description: Comma-separated material IDs whose linked Teamleader products are returned. tags: - teamleader responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/ProductList' description: '' /api/teamleader/travel-hours-product/: patch: operationId: teamleader_travel_hours_product_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedTravelHoursProductRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedTravelHoursProductRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedTravelHoursProductRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/TravelHoursProduct' description: '' /api/teamleader/update-department/: patch: operationId: teamleader_update_department_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedDepartmentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedDepartmentRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedDepartmentRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Department' description: '' /api/teamleader/update-enabled/: patch: operationId: teamleader_update_enabled_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEnabledRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEnabledRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEnabledRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Enabled' description: '' /api/teamleader/update-invoice-document-template/: patch: operationId: teamleader_update_invoice_document_template_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedInvoiceTemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedInvoiceTemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedInvoiceTemplateRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/InvoiceTemplate' description: '' /api/teamleader/update-product-category/: patch: operationId: teamleader_update_product_category_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedProductCategoryJsonRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedProductCategoryJsonRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedProductCategoryJsonRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProductCategoryJson' description: '' /api/teamleader/work-hours-product/: patch: operationId: teamleader_work_hours_product_partial_update description: PATCH-only single-object view; no PUT. tags: - teamleader requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedWorkHoursProductRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedWorkHoursProductRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedWorkHoursProductRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkHoursProduct' description: '' components: schemas: Action: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/ActionTypeEnum' company_partner: type: integer nullable: true json_conditions: type: array items: $ref: '#/components/schemas/ActionCondition' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer destination: type: string nullable: true readOnly: true conditions: type: string readOnly: true override_status: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true maxLength: 255 required: - conditions - destination - id - name - statuscode - type ActionCondition: type: object description: |- One row of Action.json_conditions / TripStatuscodeAction.json_conditions. Not FilterConditionSerializer despite the similar name: action conditions compare a single `value`, filter conditions carry a `values` list plus matching knobs. conditions_ok() runs every part through replace_string(), which calls .strip() before anything else - so all three are strings or the action dies evaluating itself. properties: field: type: string operator: type: string value: type: string required: - field - operator - value ActionConditionRequest: type: object description: |- One row of Action.json_conditions / TripStatuscodeAction.json_conditions. Not FilterConditionSerializer despite the similar name: action conditions compare a single `value`, filter conditions carry a `values` list plus matching knobs. conditions_ok() runs every part through replace_string(), which calls .strip() before anything else - so all three are strings or the action dies evaluating itself. properties: field: type: string minLength: 1 operator: type: string minLength: 1 value: type: string minLength: 1 required: - field - operator - value ActionRequest: type: object properties: name: type: string minLength: 1 maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/ActionTypeEnum' company_partner: type: integer nullable: true json_conditions: type: array items: $ref: '#/components/schemas/ActionConditionRequest' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer override_status: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true maxLength: 255 required: - name - statuscode - type ActionTypeEnum: enum: - email - send_sms - send_fcm - email_assigned - copy - status - email_workorders - email_ics - send_to_gripp type: string description: |- * `email` - send email * `send_sms` - send_sms * `send_fcm` - send fcm * `email_assigned` - email assigned engineers * `copy` - copy to partner * `status` - status change original order * `email_workorders` - send workorders as email * `email_ics` - send email with calendar (ics) file * `send_to_gripp` - send to Gripp Activity: type: object properties: id: type: integer readOnly: true text: type: string created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - text ActivityQuerysetTotal: type: object properties: work_total_secs: type: string work_total: type: string readOnly: true travel_to_total_secs: type: string travel_to_total: type: string readOnly: true travel_back_total_secs: type: string travel_back_total: type: string readOnly: true travel_total_secs: type: string travel_total: type: string readOnly: true distance_to_total: type: integer distance_back_total: type: integer distance_total: type: integer extra_work_total_secs: type: string extra_work_total: type: string readOnly: true distance_fixed_rate_amount: type: integer user_totals: type: array items: $ref: '#/components/schemas/ActivityUserTotal' required: - extra_work_total - travel_back_total - travel_to_total - travel_total - user_totals - work_total ActivityRequest: type: object properties: text: type: string minLength: 1 required: - text ActivityTotalAggregated: type: object properties: distance_to_total: type: integer readOnly: true nullable: true distance_back_total: type: integer readOnly: true nullable: true work_total: type: string readOnly: true travel_to_total: type: string readOnly: true travel_back_total: type: string readOnly: true required: - distance_back_total - distance_to_total - travel_back_total - travel_to_total - work_total ActivityUserTotal: type: object properties: work_total_secs: type: number format: double readOnly: true work_total: type: string readOnly: true travel_to_total_secs: type: string travel_to_total: type: string readOnly: true travel_back_total_secs: type: string travel_back_total: type: string readOnly: true travel_total_secs: type: number format: double readOnly: true travel_total: type: string readOnly: true distance_to_total: type: integer distance_back_total: type: integer distance_total: type: integer extra_work_total_secs: type: number format: double readOnly: true extra_work_total: type: string readOnly: true distance_fixed_rate_amount: type: integer full_name: type: string user_id: oneOf: - type: integer - type: string readOnly: true partner_companycode: type: string nullable: true required: - extra_work_total - extra_work_total_secs - travel_back_total - travel_to_total - travel_total - travel_total_secs - user_id - work_total - work_total_secs AddressAutocompleteRow: type: object properties: address: type: string nullable: true city: type: string nullable: true contact: type: string nullable: true country_code: type: string nullable: true email: type: string nullable: true id: type: integer mobile: type: string nullable: true name: type: string nullable: true postal: type: string nullable: true tel: type: string nullable: true value: type: string description: |- Given the *incoming* primitive data, return the value for this field that should be validated and transformed to a native value. readOnly: true required: - address - city - contact - country_code - email - id - mobile - name - postal - tel - value ApiUser: type: object properties: id: type: integer readOnly: true username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 api_user: $ref: '#/components/schemas/ApiUserSub' required: - api_user - id - username ApiUserRequest: type: object properties: username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 password: type: string writeOnly: true minLength: 1 maxLength: 128 api_user: $ref: '#/components/schemas/ApiUserSubRequest' required: - api_user - username ApiUserSub: type: object properties: uuid: type: string format: uuid readOnly: true name: type: string maxLength: 80 token: type: string readOnly: true expire_start_dt: type: string format: date expire_in_days: type: integer maximum: 2147483647 minimum: 0 token_is_revoked: type: boolean readOnly: true required: - expire_in_days - name - token - token_is_revoked - uuid ApiUserSubRequest: type: object properties: name: type: string minLength: 1 maxLength: 80 expire_start_dt: type: string format: date expire_in_days: type: integer maximum: 2147483647 minimum: 0 required: - expire_in_days - name AppUserSettings: type: object properties: pk: type: integer readOnly: true title: ID settings: type: object additionalProperties: true description: The user’s app settings bag. Keys and value shapes belong to the frontend. required: - pk - settings AssignOrdersRequestRequest: type: object description: |- The body the assign-orders actions read. `set_unavailable` marks accepted on the engineer's availability row when given. properties: order_ids: type: string minLength: 1 description: Comma-separated order ids. set_unavailable: type: boolean required: - order_ids AssignOrdersResponse: type: object description: The dict AssignUserView returns. properties: result: type: integer assigned_data: type: object additionalProperties: type: integer required: - assigned_data - result AssignResultResponse: type: object description: |- `{'result': }` - how many orders/trips an assign or unassign action processed, as the assign/unassign APIViews answer. properties: result: type: integer required: - result AssignTripsRequestRequest: type: object description: |- The body AssignUserTripView reads; every order on the trips is assigned. properties: trip_ids: type: string minLength: 1 description: Comma-separated trip ids. set_unavailable: type: boolean required: - trip_ids AssignedOrder: type: object properties: id: type: integer readOnly: true engineer: type: integer nullable: true student_user: type: integer nullable: true order: type: integer started: type: string format: date-time nullable: true ended: type: string format: date-time nullable: true rating: type: integer maximum: 32767 minimum: 0 user_full_name: type: string readOnly: true order_name: type: string readOnly: true order_city: type: string nullable: true readOnly: true order_date: type: string readOnly: true after_end_order_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true after_end_reports: type: array items: $ref: '#/components/schemas/AssignedOrderReportedCodeRow' readOnly: true assigned_userdata: type: array items: $ref: '#/components/schemas/AssignedOrderUserDataRow' readOnly: true customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true end_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true is_ended: type: boolean readOnly: true is_started: type: boolean readOnly: true quotation_id: type: integer readOnly: true nullable: true start_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true assignedorder_date: type: string readOnly: true required: - id - order - order_city - order_date - order_name - user_full_name AssignedOrderActivity: type: object properties: id: type: integer readOnly: true user: type: integer nullable: true assigned_order: type: integer full_name: type: string nullable: true readOnly: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true unforeseen_work_duration: type: string nullable: true unforeseen_work_description: type: string nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 activity_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. activity_date_iso: type: string format: date readOnly: true extra_work: type: string nullable: true extra_work_description: type: string nullable: true distance_fixed_rate_amount: type: integer maximum: 2147483647 minimum: 0 actual_work: type: string format: time nullable: true order: type: string readOnly: true required: - activity_date_iso - assigned_order - full_name - id - order AssignedOrderActivityRequest: type: object properties: user: type: integer nullable: true assigned_order: type: integer work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true unforeseen_work_duration: type: string nullable: true unforeseen_work_description: type: string nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 activity_date: type: string format: date extra_work: type: string nullable: true extra_work_description: type: string nullable: true distance_fixed_rate_amount: type: integer maximum: 2147483647 minimum: 0 actual_work: type: string format: time nullable: true required: - assigned_order AssignedOrderAppView: type: object properties: id: type: integer readOnly: true engineer: type: integer nullable: true student_user: type: integer nullable: true order: allOf: - $ref: '#/components/schemas/OrderMinimal' readOnly: true started: type: string format: date-time nullable: true ended: type: string format: date-time nullable: true assignedorder_date: type: string readOnly: true alt_start_date: type: string format: date nullable: true alt_start_time: type: string format: time nullable: true alt_end_date: type: string format: date nullable: true alt_end_time: type: string format: time nullable: true final_start_date: type: string nullable: true readOnly: true final_end_date: type: string nullable: true readOnly: true final_start_time: type: string nullable: true readOnly: true final_end_time: type: string nullable: true readOnly: true after_end_order_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true after_end_reports: type: array items: $ref: '#/components/schemas/AssignedOrderReportedCodeRow' readOnly: true assigned_userdata: type: array items: $ref: '#/components/schemas/AssignedOrderUserDataRow' readOnly: true customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true end_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true is_ended: type: boolean readOnly: true is_started: type: boolean readOnly: true quotation_id: type: integer readOnly: true nullable: true start_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true required: - assignedorder_date - final_end_date - final_end_time - final_start_date - final_start_time - id - order AssignedOrderCodesRow: type: object description: |- {id, statuscode, description} - Statuscode.objects.values() row. Defined before use: the AssignedOrder list/detail/app-view rows above carry these keys (the apps parse the detail_device bundle into the same AssignedOrder model), so the row components must exist first. properties: id: type: integer statuscode: type: string description: type: string nullable: true required: - description - id - statuscode AssignedOrderCodesRowRequest: type: object description: |- {id, statuscode, description} - Statuscode.objects.values() row. Defined before use: the AssignedOrder list/detail/app-view rows above carry these keys (the apps parse the detail_device bundle into the same AssignedOrder model), so the row components must exist first. properties: id: type: integer statuscode: type: string minLength: 1 description: type: string nullable: true minLength: 1 required: - description - id - statuscode AssignedOrderCreate: type: object properties: id: type: integer readOnly: true engineer: type: integer nullable: true student_user: type: integer nullable: true order: type: integer alt_start_date: type: string format: date nullable: true alt_start_time: type: string format: time nullable: true alt_end_date: type: string format: date nullable: true alt_end_time: type: string format: time nullable: true required: - id - order AssignedOrderCreateRequest: type: object properties: engineer: type: integer nullable: true student_user: type: integer nullable: true order: type: integer alt_start_date: type: string format: date nullable: true alt_start_time: type: string format: time nullable: true alt_end_date: type: string format: date nullable: true alt_end_time: type: string format: time nullable: true required: - order AssignedOrderDocument: type: object properties: id: type: integer readOnly: true assigned_order: type: integer name: type: string maxLength: 255 description: type: string nullable: true document: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true required: - assigned_order - created - filename - id - modified - name - url AssignedOrderDocumentRequest: type: object properties: assigned_order: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true document: type: string format: byte required: - assigned_order - name AssignedOrderMaterial: type: object properties: id: type: integer readOnly: true assigned_order: type: integer material: type: integer nullable: true location: type: integer nullable: true location_name: type: string readOnly: true amount: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 identifier: type: string readOnly: true nullable: true name: type: string readOnly: true nullable: true mutation_simple_id: type: integer nullable: true readOnly: true is_extra: type: boolean required: - assigned_order - id - identifier - location_name - mutation_simple_id - name AssignedOrderMaterialRequest: type: object properties: assigned_order: type: integer material: type: integer nullable: true location: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 is_extra: type: boolean required: - assigned_order AssignedOrderMaterialRequested: type: object properties: id: type: integer readOnly: true assigned_order: type: integer material: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 full_name: type: string readOnly: true required: - assigned_order - full_name - id AssignedOrderMaterialTotals: type: object properties: id: type: integer engineer: type: string amount: type: number format: double identifier: type: string nullable: true name: type: string nullable: true required: - amount - engineer - id - identifier - name AssignedOrderReportedCodeRow: type: object description: 'reported_codes rows: values(''statuscode_id'', ''extra_data'').' properties: statuscode_id: type: integer extra_data: type: string nullable: true required: - extra_data - statuscode_id AssignedOrderReportedCodeRowRequest: type: object description: 'reported_codes rows: values(''statuscode_id'', ''extra_data'').' properties: statuscode_id: type: integer extra_data: type: string nullable: true minLength: 1 required: - extra_data - statuscode_id AssignedOrderRequest: type: object properties: engineer: type: integer nullable: true student_user: type: integer nullable: true order: type: integer started: type: string format: date-time nullable: true ended: type: string format: date-time nullable: true rating: type: integer maximum: 32767 minimum: 0 customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true required: - order AssignedOrderSplitRequestRequest: type: object properties: order: type: integer engineers: type: array items: type: integer writeOnly: true writeOnly: true alt_start_date: type: string format: date nullable: true alt_start_time: type: string format: time nullable: true alt_end_date: type: string format: date nullable: true alt_end_time: type: string format: time nullable: true required: - engineers - order AssignedOrderUserDataRow: type: object description: fellow engineer/partner contact card assembled in detail_device(). properties: full_name: type: string date: type: string mobile: type: string required: - date - full_name - mobile AssignedOrderUserDataRowRequest: type: object description: fellow engineer/partner contact card assembled in detail_device(). properties: full_name: type: string minLength: 1 date: type: string minLength: 1 mobile: type: string minLength: 1 required: - date - full_name - mobile AssignedOrderView: type: object properties: id: type: integer readOnly: true engineer: allOf: - $ref: '#/components/schemas/EngineerMinimal' readOnly: true nullable: true student_user: allOf: - $ref: '#/components/schemas/StudentUserMinimal' readOnly: true nullable: true order: allOf: - $ref: '#/components/schemas/OrderMinimal' readOnly: true started: type: string format: date-time nullable: true ended: type: string format: date-time nullable: true activity_totals: allOf: - $ref: '#/components/schemas/ActivityTotalAggregated' readOnly: true workorders_count: type: integer readOnly: true rating: type: integer maximum: 32767 minimum: 0 after_end_order_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true after_end_reports: type: array items: $ref: '#/components/schemas/AssignedOrderReportedCodeRow' readOnly: true assigned_userdata: type: array items: $ref: '#/components/schemas/AssignedOrderUserDataRow' readOnly: true customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true end_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true is_ended: type: boolean readOnly: true is_started: type: boolean readOnly: true quotation_id: type: integer readOnly: true nullable: true start_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' readOnly: true assignedorder_date: type: string readOnly: true required: - activity_totals - engineer - id - order - student_user - workorders_count AssignedOrderWorkOrder: type: object properties: id: type: integer readOnly: true assigned_order: type: integer signature_user: type: string format: uri nullable: true signature_name_user: type: string nullable: true maxLength: 255 signature_engineer: type: string format: uri signature_name_engineer: type: string nullable: true maxLength: 255 signature_customer: type: string format: uri signature_name_customer: type: string nullable: true maxLength: 255 description_work: type: string nullable: true assigned_order_workorder_id: type: string customer_emails: type: string nullable: true equipment: type: string nullable: true required: - assigned_order - id AssignedOrderWorkOrderRequest: type: object properties: assigned_order: type: integer signature_user: type: string format: byte nullable: true signature_name_user: type: string nullable: true maxLength: 255 signature_engineer: type: string format: byte signature_name_engineer: type: string nullable: true maxLength: 255 signature_customer: type: string format: byte signature_name_customer: type: string nullable: true maxLength: 255 description_work: type: string nullable: true assigned_order_workorder_id: type: string minLength: 1 customer_emails: type: string nullable: true equipment: type: string nullable: true required: - assigned_order AssignedUserInfo: type: object description: |- The dict AssignmentInfoMixin.get_assigned_user_info builds per assigned order. properties: user_id: type: integer nullable: true full_name: type: string license_plate: type: string nullable: true required: - full_name - license_plate - user_id AssignedUserInfoWithBooked: type: object description: |- Documents the dict OrderDetailSerializer.get_assigned_user_info hand-builds per assigned order — the extended variant of AssignmentInfoMixin.get_assigned_user_info that adds a `booked` count. properties: user_id: type: integer nullable: true full_name: type: string license_plate: type: string nullable: true booked: type: integer required: - booked - full_name - license_plate - user_id AuthorizeResponse: type: object description: The dict AuthorizeView returns. properties: status: $ref: '#/components/schemas/AuthorizeResponseStatusEnum' authorization_url: type: string format: uri required: - status AuthorizeResponseStatusEnum: enum: - auth - ok type: string description: |- * `auth` - auth * `ok` - ok AutocompleteRow: type: object properties: id: type: integer name: type: string nullable: true value: type: string description: |- Given the *incoming* primitive data, return the value for this field that should be validated and transformed to a native value. readOnly: true required: - id - name - value AvailabilityEngineerUserRow: type: object description: |- EngineerMinimalSerializer output for an engineer availability row. Subclassed, not redeclared: the row IS that serializer's shape, uuid included, so the fields cannot drift apart. properties: id: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/EngineerUserMinimal' readOnly: true address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 mobile: type: string nullable: true maxLength: 100 uuid: type: string readOnly: true required: - id - user - uuid AvailabilityResponse: type: object description: |- `{'available': bool}` - whether a name is free to take. One component for every availability check (companycodes, usernames): identical single-boolean shapes under two names would be two unrelated types in the generated client. properties: available: type: boolean required: - available AvailabilityStudentUserRow: type: object description: flatten(StudentUserUserMinimalSerializer(...).data, 'student_user'). properties: id: type: integer email: type: string username: type: string last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string last_name: type: string full_name: type: string address: type: string rating_avg: type: number format: double nullable: true info: type: string picture_url: type: string nullable: true required: - address - date_joined - email - first_name - full_name - id - info - last_login - last_name - picture_url - rating_avg - username AvailabilityUserRow: anyOf: - $ref: '#/components/schemas/AvailabilityStudentUserRow' - $ref: '#/components/schemas/AvailabilityEngineerUserRow' Branch: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 address: type: string maxLength: 255 postal: type: string maxLength: 20 city: type: string maxLength: 255 country_code: type: string maxLength: 2 tel: type: string nullable: true maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true image_url: type: string nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. num_orders: type: integer nullable: true readOnly: true required: - address - city - created - id - image_url - modified - name - num_orders - postal BranchAutocomplete: allOf: - $ref: '#/components/schemas/AddressAutocompleteRow' description: The rows BranchViewset.autocomplete returns. BranchDashboardResponse: type: object properties: branch: $ref: '#/components/schemas/Branch' orders: $ref: '#/components/schemas/CustomerDashboardOrders' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - branch - counts_year_order_type_stats - order_counts_stats - order_types_month_stats - order_types_stats - orders BranchOwnerRequired: type: object properties: branch: type: integer required: - branch BranchRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 20 city: type: string minLength: 1 maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true required: - address - city - name - postal Budget: type: object properties: id: type: integer readOnly: true year: type: integer maximum: 2147483647 minimum: 0 amount: type: string format: decimal pattern: ^-?\d{0,20}(?:\.\d{0,2})?$ amount_currency: type: string readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - amount_currency - created - id - modified - year BudgetCostsResponse: type: object description: '`Budget.get_costs()` - what budget/{id}/costs answers.' properties: total: type: number format: double invoices_partners: type: object additionalProperties: type: number format: double description: Invoice total per partner companycode. purchase_invoices: type: number format: double required: - invoices_partners - purchase_invoices - total BudgetExpectedCostsResponse: type: object description: '`Budget.get_expected_costs()` - what budget/{id}/expected_costs answers.' properties: total: type: number format: double own_maintenance_contracts: type: object additionalProperties: type: number format: double description: Tariff per year, keyed by customer name. partner_maintenance_contracts: type: object additionalProperties: type: number format: double description: Partner tariff per year, keyed by member companycode. equipment_replacements: type: number format: double required: - equipment_replacements - own_maintenance_contracts - partner_maintenance_contracts - total BudgetRequest: type: object properties: year: type: integer maximum: 2147483647 minimum: 0 amount: type: string format: decimal pattern: ^-?\d{0,20}(?:\.\d{0,2})?$ required: - year Building: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 customer: type: integer nullable: true customer_branch_view: allOf: - $ref: '#/components/schemas/CustomerBranchView' nullable: true readOnly: true branch: type: integer nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer_branch_view - id - modified - name BuildingAutocomplete: allOf: - $ref: '#/components/schemas/AutocompleteRow' description: The rows BuildingViewset.autocomplete returns. BuildingBranchCreate: allOf: - $ref: '#/components/schemas/BuildingCreate' - $ref: '#/components/schemas/BranchOwnerRequired' BuildingBranchCreateRequest: type: object properties: branch: type: integer name: type: string minLength: 1 maxLength: 255 required: - branch - name BuildingCreate: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name BuildingCreateRequest: anyOf: - $ref: '#/components/schemas/BuildingBranchCreate' - $ref: '#/components/schemas/BuildingCustomerCreate' BuildingCreateRequestRequest: anyOf: - $ref: '#/components/schemas/BuildingBranchCreateRequest' - $ref: '#/components/schemas/BuildingCustomerCreateRequest' BuildingCustomerCreate: allOf: - $ref: '#/components/schemas/BuildingCreate' - $ref: '#/components/schemas/CustomerOwnerRequired' BuildingCustomerCreateRequest: type: object properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 required: - customer - name BuildingDashboardResponse: type: object properties: building: $ref: '#/components/schemas/Building' orders: $ref: '#/components/schemas/CustomerDashboardOrders' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - building - counts_year_order_type_stats - order_counts_stats - order_types_month_stats - order_types_stats - orders ChangePassword: type: object properties: old_password: type: string password: type: string required: - old_password - password ChangePasswordRequest: type: object properties: old_password: type: string minLength: 1 password: type: string minLength: 1 required: - old_password - password ChangePasswordRequestRequest: type: object description: The form fields ChangePassword reads. properties: old_password: type: string minLength: 1 new_password1: type: string minLength: 1 required: - new_password1 - old_password ChannelCreatedResponse: type: object description: |- The dict CreateStreamPrivateChannel returns. Error branches answer `{'error': ...}` instead. properties: created: type: string required: - created Chapter: type: object properties: id: type: integer readOnly: true quotation: type: integer name: type: string maxLength: 255 description: type: string nullable: true required: - id - name - quotation ChapterRequest: type: object properties: quotation: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true required: - name - quotation CheckTokenResponse: type: object description: The dict CheckTokenView returns. properties: result_ok: type: boolean required: - result_ok CodeTypeEnum: enum: - order - quotation - invoice - trip - leave_hours - sick_leave - purchase_order - work_hours type: string description: |- * `order` - order * `quotation` - quotation * `invoice` - invoice * `trip` - trip * `leave_hours` - leave_hours * `sick_leave` - sick_leave * `purchase_order` - purchase_order * `work_hours` - work_hours Config: type: object properties: has_tokens: type: boolean readOnly: true json_data: type: object additionalProperties: true description: 'The Teamleader integration’s config: the department and product category to write into, and similar.' api_enabled: type: boolean required: - has_tokens - json_data Contract: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 module_paths: type: array items: $ref: '#/components/schemas/ModulePath' modules_text: type: string readOnly: true max_users: type: integer maximum: 2147483647 minimum: 0 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - module_paths - modules_text - name ContractCreateRequest: type: object description: |- ContractSerializer as POST accepts it: at least one module path. A create has nothing stored for Contract.save() to fall back on, so the modules have to be in the body. PATCH may leave them out and keep the stored set. properties: name: type: string minLength: 1 maxLength: 255 module_paths: type: array items: $ref: '#/components/schemas/ModulePathRequest' minItems: 1 max_users: type: integer maximum: 2147483647 minimum: 0 required: - module_paths - name CopiedOrderData: type: object description: |- Documents the dict Order.get_copied_order_data hand-builds per copied order, as returned by OrderDetailSerializer.get_copied_order_data. properties: companycode: type: string order_id: type: string required: - companycode - order_id CostTypeEnum: enum: - used_materials - work_hours - travel_hours - distance - extra_work - actual_work - call_out_costs type: string description: |- * `used_materials` - used_materials * `work_hours` - work_hours * `travel_hours` - travel_hours * `distance` - distance * `extra_work` - extra_work * `actual_work` - actual_work * `call_out_costs` - call_out_costs CountResponse: type: object description: '`{''count'': int}` - a bare tally.' properties: count: type: integer required: - count CountsYearOrderTypeStatsResponse: type: object description: The `counts_year_order_type_stats` endpoint. properties: counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - counts_year_order_type_stats CreateLinkResponse: type: object description: The dict TeamleaderProductCreateLink returns. properties: is_ok: type: boolean material: type: integer error: type: string required: - is_ok - material CreatePrivateChannelRequestRequest: type: object description: The body CreateStreamPrivateChannel reads. properties: to_member_user_id: type: integer required: - to_member_user_id CreateQuickResponse: type: object description: |- The {id, name} dict EquipmentLocationMixin._create_quick hand-builds. One serializer for every `create_quick` action, because the mixin is what produces the response rather than the caller. properties: id: type: integer name: type: string required: - id - name CsrfTokenResponse: type: object description: The dict GetCsrfToken returns. properties: token: type: string required: - token CurrencyEnum: enum: - USD - EUR - GBP type: string description: |- * `USD` - USD * `EUR` - EUR * `GBP` - GBP Customer: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 address: type: string maxLength: 255 postal: type: string maxLength: 20 city: type: string maxLength: 255 country_code: type: string maxLength: 2 tel: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 time: type: string format: time nullable: true time2: type: string format: time nullable: true timealt: type: string format: time nullable: true timealt2: type: string format: time nullable: true remarks: type: string nullable: true customer_id: type: string nullable: true maxLength: 100 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. external_identifier: type: string nullable: true maxLength: 100 documents: type: array items: $ref: '#/components/schemas/CustomerDocument' readOnly: true products_without_tax: type: boolean maintenance_contract: type: string nullable: true standard_hours_hour: type: integer maximum: 2147483647 minimum: 0 standard_hours_minute: type: integer maximum: 2147483647 minimum: 0 standard_hours_txt: type: string readOnly: true rating_avg: type: number format: double nullable: true readOnly: true branch_id: type: integer maximum: 2147483647 minimum: 0 nullable: true branch_partner: type: integer nullable: true branch_view: type: object additionalProperties: true nullable: true readOnly: true use_branch_address: type: boolean num_orders: type: integer readOnly: true required: - address - branch_view - city - created - documents - id - modified - name - num_orders - postal - rating_avg - standard_hours_txt CustomerAutocomplete: allOf: - $ref: '#/components/schemas/AddressAutocompleteRow' - type: object properties: customer_id: type: string nullable: true remarks: type: string nullable: true products_without_tax: type: boolean branch_id: type: integer nullable: true required: - branch_id - customer_id - products_without_tax - remarks description: |- The rows CustomerViewset.autocomplete returns. A customer user searching their own record sees the plain label; everyone else sees it prefixed with the customer_id, which is what they are picking the row by. CustomerBranchView: anyOf: - $ref: '#/components/schemas/Customer' - $ref: '#/components/schemas/Branch' CustomerCreate: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 address: type: string maxLength: 255 postal: type: string maxLength: 20 city: type: string maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 time: type: string format: time nullable: true time2: type: string format: time nullable: true timealt: type: string format: time nullable: true timealt2: type: string format: time nullable: true remarks: type: string nullable: true customer_id: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 required: - address - city - country_code - id - name - postal CustomerCreateRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 20 city: type: string minLength: 1 maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 time: type: string format: time nullable: true time2: type: string format: time nullable: true timealt: type: string format: time nullable: true timealt2: type: string format: time nullable: true remarks: type: string nullable: true customer_id: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 required: - address - city - country_code - name - postal CustomerDashboardOrders: type: object description: |- One page of a customer's orders, in the paginated envelope the order list answers with (20 rows per page). properties: count: type: integer num_pages: type: integer next: type: string nullable: true previous: type: string nullable: true results: type: array items: $ref: '#/components/schemas/Order' required: - count - next - num_pages - previous - results CustomerDashboardResponse: type: object description: |- GET /api/customer/customer/{id}/dashboard/: the customer head, the first orders page, and the four stats blocks the customer view charts - the same inner shapes the dedicated stats endpoints answer with, so the screen reads them unchanged. properties: customer: $ref: '#/components/schemas/Customer' orders: $ref: '#/components/schemas/CustomerDashboardOrders' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - counts_year_order_type_stats - customer - order_counts_stats - order_types_month_stats - order_types_stats - orders CustomerDocument: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: id: type: integer readOnly: true customer: type: integer name: type: string maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true user_can_view: type: boolean required: - created - customer - filename - id - modified - name - url CustomerDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true file: type: string format: byte user_can_view: type: boolean required: - customer - name CustomerIdHandling: type: object description: The dict CustomerViewset.check_customer_id_handling returns. properties: customer_id: type: integer nullable: true created: type: boolean required: - created - customer_id CustomerMaterialTotalSalesRow: type: object description: |- Numeric columns every total_sales aggregate shares. Nulls cannot occur: a row only exists when at least one sales mutation joins to it and every source column (amount, both prices) is NOT NULL. properties: sum_amount: type: number format: double sum_price_purchase: type: number format: double sum_price_selling: type: number format: double profit: type: number format: double amount_perc: oneOf: - type: number - type: string amount_selling_perc: oneOf: - type: number - type: string customer_name: type: string material_name: type: string nullable: true required: - amount_perc - amount_selling_perc - customer_name - material_name - profit - sum_amount - sum_price_purchase - sum_price_selling CustomerOwnerRequired: type: object properties: customer: type: integer required: - customer CustomerRelationOwnerRequired: type: object properties: customer_relation: type: integer required: - customer_relation CustomerTotalSalesRow: type: object description: |- Numeric columns every total_sales aggregate shares. Nulls cannot occur: a row only exists when at least one sales mutation joins to it and every source column (amount, both prices) is NOT NULL. properties: sum_amount: type: number format: double sum_price_purchase: type: number format: double sum_price_selling: type: number format: double profit: type: number format: double amount_perc: oneOf: - type: number - type: string amount_selling_perc: oneOf: - type: number - type: string customer_name: type: string required: - amount_perc - amount_selling_perc - customer_name - profit - sum_amount - sum_price_purchase - sum_price_selling CustomerUser: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 customer_user: $ref: '#/components/schemas/CustomerUserSub' customer_details: allOf: - $ref: '#/components/schemas/Customer' nullable: true readOnly: true full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 required: - customer_details - customer_user - email - first_name - full_name - id - last_name - username CustomerUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 customer_user: $ref: '#/components/schemas/CustomerUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - customer_user - email - first_name - last_name - username CustomerUserSub: type: object properties: customer: type: integer nullable: true uuid: type: string readOnly: true settings_group: type: string nullable: true maxLength: 100 required: - uuid CustomerUserSubRequest: type: object properties: customer: type: integer nullable: true settings_group: type: string nullable: true maxLength: 100 DefaultLogin: type: object description: |- Default serializer used for user login. Please keep in mind that the authentication is done by separate function defined by :ref:`login-authenticator-setting` setting. By default :ref:`login-authenticator-setting` function will use :ref:`user-login-fields-setting` setting to extract the login field from the validated serializer data either by using the 'login' key (which is used here) or the specific login field name(s) (e.g. 'username', 'email'). If you want different behavior, you need to override :ref:`login-authenticator-setting` in your settings. properties: login: type: string password: type: string required: - login - password DefaultLoginRequest: type: object description: |- Default serializer used for user login. Please keep in mind that the authentication is done by separate function defined by :ref:`login-authenticator-setting` setting. By default :ref:`login-authenticator-setting` function will use :ref:`user-login-fields-setting` setting to extract the login field from the validated serializer data either by using the 'login' key (which is used here) or the specific login field name(s) (e.g. 'username', 'email'). If you want different behavior, you need to override :ref:`login-authenticator-setting` in your settings. properties: login: type: string minLength: 1 password: type: string minLength: 1 required: - login - password DefaultRegisterEmail: type: object description: Default serializer used for e-mail registration (e-mail change). properties: email: type: string format: email required: - email DefaultRegisterEmailRequest: type: object description: Default serializer used for e-mail registration (e-mail change). properties: email: type: string format: email minLength: 1 required: - email Department: type: object properties: department_uuid: type: string maxLength: 40 department_name: type: string maxLength: 255 required: - department_name - department_uuid DetailDeviceResponse: type: object description: single sign-in screen bundle built by hand in detail_device(). properties: id: type: integer engineer_id: type: integer nullable: true order: $ref: '#/components/schemas/Order' quotation_id: type: integer nullable: true is_started: type: boolean is_ended: type: boolean is_signed: type: boolean start_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' end_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' after_end_order_codes: type: array items: $ref: '#/components/schemas/AssignedOrderCodesRow' assigned_userdata: type: array items: $ref: '#/components/schemas/AssignedOrderUserDataRow' after_end_reports: type: array items: $ref: '#/components/schemas/AssignedOrderReportedCodeRow' customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true required: - after_end_order_codes - after_end_reports - assigned_userdata - customer - end_codes - engineer_id - id - is_ended - is_signed - is_started - order - quotation_id - start_codes DeviceTokenCreated: type: object description: The dict SetDeviceToken returns. properties: created: type: boolean required: - created DeviceTokenRequestRequest: type: object description: The body SetDeviceToken reads. properties: device_token: type: string minLength: 1 required: - device_token EmployeeUser: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 employee_user: $ref: '#/components/schemas/EmployeeUserSub' full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - employee_user - first_name - full_name - id - last_name - user_sick - username EmployeeUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 password: type: string writeOnly: true minLength: 1 maxLength: 128 employee_user: $ref: '#/components/schemas/EmployeeUserSubRequest' last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - employee_user - first_name - last_name - username EmployeeUserSub: type: object properties: uuid: type: string readOnly: true uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ branch: type: integer nullable: true required: - uuid EmployeeUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ branch: type: integer nullable: true Enabled: type: object properties: api_enabled: type: boolean Engineer: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 engineer: $ref: '#/components/schemas/EngineerSub' full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - engineer - first_name - full_name - id - last_name - user_sick - username EngineerDeviceResponse: type: object description: The dict EngineerViewset.device returns. properties: active: type: array items: $ref: '#/components/schemas/EngineerDeviceRow' inactive: type: array items: $ref: '#/components/schemas/EngineerDeviceRow' required: - active - inactive EngineerDeviceRow: type: object description: One row EngineerViewset.device puts in its active/inactive lists. properties: id: type: integer engineer: type: string required: - engineer - id EngineerEvent: type: object properties: id: type: integer readOnly: true engineer: type: integer engineer_name: type: string readOnly: true user_id: type: integer readOnly: true event_dts: type: string format: date-time event_type: type: string maxLength: 255 measure_last_event_type: type: string readOnly: true nullable: true secs_since_last_measure_event_type: type: number format: double readOnly: true nullable: true last_measure_event: type: integer readOnly: true nullable: true assigned_order: type: object additionalProperties: true nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - assigned_order - created - engineer - engineer_name - event_type - id - last_measure_event - measure_last_event_type - secs_since_last_measure_event_type - user_id EngineerEventCreateOrderError: type: object description: |- The 400 body of an engineer-event order create. The view wraps the order-create errors one level deep - `{'order': {: [...]}}` - so a caller can tell an order-field error from anything the endpoint validates about the event itself. Declared here because the generic 400 document describes a flat `{name: [message]}` map, which reads `order` as a list of strings while the view sends a map. The view's other 400 - a caller who may not create orders - is not an order-field error and does not carry this shape. properties: order: type: object additionalProperties: type: array items: type: string required: - order EngineerEventCreateOrderRequestRequest: anyOf: - $ref: '#/components/schemas/EngineerEventOrderCreateBranchRequest' - $ref: '#/components/schemas/EngineerEventOrderCreateCustomerRelationRequest' EngineerEventCreateOrderResponse: type: object description: The dict `EngineerEventCreateOrderView.post` returns on success. properties: order: $ref: '#/components/schemas/OrderDetail' assigned_order: type: integer event: type: integer required: - assigned_order - event - order EngineerEventOrderCreateBranchRequest: allOf: - $ref: '#/components/schemas/EngineerEventOrderCreateRequest' - $ref: '#/components/schemas/BranchOwnerRequired' description: The `branch`-mandatory variant, plus `notify_user`. EngineerEventOrderCreateCustomerRelationRequest: allOf: - $ref: '#/components/schemas/EngineerEventOrderCreateRequest' - $ref: '#/components/schemas/CustomerRelationOwnerRequired' description: The `customer_relation`-mandatory variant, plus `notify_user`. EngineerEventOrderCreateRequest: type: object properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer nullable: true customer_relation: type: integer nullable: true quotation: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' notify_user: type: boolean default: true description: 'Send the engineer the same websocket notification assign-user sends. Default: true.' required: - end_date - order_name - start_date EngineerEventRequest: type: object properties: engineer: type: integer event_dts: type: string format: date-time event_type: type: string minLength: 1 maxLength: 255 required: - engineer - event_type EngineerEventType: type: object properties: id: type: integer readOnly: true event_type: type: string maxLength: 255 measure_last_event_type: type: string nullable: true maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. statuscode: type: integer nullable: true statuscode_view: allOf: - $ref: '#/components/schemas/Statuscode' nullable: true readOnly: true num_events: type: integer nullable: true readOnly: true sum_duration: type: number format: double nullable: true readOnly: true avg_duration: type: number format: double nullable: true readOnly: true required: - avg_duration - created - event_type - id - modified - num_events - statuscode_view - sum_duration EngineerEventTypeRequest: type: object properties: event_type: type: string minLength: 1 maxLength: 255 measure_last_event_type: type: string nullable: true maxLength: 255 statuscode: type: integer nullable: true required: - event_type EngineerForSelect: type: object properties: user_id: type: integer readOnly: true full_name: type: string readOnly: true required: - full_name - user_id EngineerInfoLine: type: object properties: id: type: integer readOnly: true order: type: integer info: type: string nullable: true required: - id - order EngineerInfoLineNested: type: object properties: id: type: integer info: type: string nullable: true EngineerInfoLineNestedRequest: type: object properties: id: type: integer info: type: string nullable: true EngineerInfoLineRequest: type: object properties: order: type: integer info: type: string nullable: true required: - order EngineerLocation: type: object description: |- One pin EngineerViewset.get_locations puts on the map. Three kinds of pin share the shape: an engineer's own last known position ('user'), the last order they were at when they have no position of their own ('order'), and the fixed demo set the endpoint falls back to on a tenant with no engineers placed yet ('test'). Which keys are filled follows from `type`, so everything past the position is optional. `order`/`last_assigned_order` are full OrderMinimal rows - except when the engineer has no assigned orders yet, when they degrade to `{}`: an empty dict carries none of the row's required keys, so both stay optional rather than pretending every pin carries two complete orders. Declared here rather than in serializers.py because it nests OrderMinimalSerializer, and apps.order.serializers already reaches back into apps.company.serializers by way of apps.equipment.serializers - importing it there would close that loop. properties: lat: type: number format: double lon: type: number format: double name: type: string type: $ref: '#/components/schemas/EngineerLocationTypeEnum' order: $ref: '#/components/schemas/OrderMinimal' last_assigned_order: $ref: '#/components/schemas/OrderMinimal' required: - lat - lon - name - type EngineerLocationTypeEnum: enum: - user - order - test type: string description: |- * `user` - user * `order` - order * `test` - test EngineerMinimal: type: object properties: id: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/EngineerUserMinimal' readOnly: true address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 mobile: type: string nullable: true maxLength: 100 uuid: type: string readOnly: true required: - id - user - uuid EngineerRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 engineer: $ref: '#/components/schemas/EngineerSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - engineer - first_name - last_name - username EngineerSub: type: object properties: id: type: integer readOnly: true address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 email_tablet: type: string format: email nullable: true maxLength: 150 passport: type: string nullable: true maxLength: 100 vca: type: string nullable: true maxLength: 100 cost_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true license_plate: type: string nullable: true maxLength: 20 inspection_date_car: type: string format: date nullable: true cost_price_car: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true inspection_date_tools: type: string format: date nullable: true cost_price_tools: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true remarks: type: string nullable: true contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true uuid: type: string readOnly: true uses_time_registration: type: boolean last_event: type: object additionalProperties: true nullable: true readOnly: true preferred_location: type: integer nullable: true prefered_location: type: integer nullable: true readOnly: true hide_from_dispatch: type: boolean required: - id - last_event - prefered_location - preferred_location - uuid EngineerSubRequest: type: object properties: address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 email_tablet: type: string format: email nullable: true maxLength: 150 passport: type: string nullable: true maxLength: 100 vca: type: string nullable: true maxLength: 100 cost_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true license_plate: type: string nullable: true maxLength: 20 inspection_date_car: type: string format: date nullable: true cost_price_car: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true inspection_date_tools: type: string format: date nullable: true cost_price_tools: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true remarks: type: string nullable: true contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true uses_time_registration: type: boolean preferred_location: type: integer hide_from_dispatch: type: boolean required: - preferred_location EngineerUserMinimal: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 required: - id - username Equipment: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' uuid: type: string format: uuid customer: type: integer nullable: true branch: type: integer nullable: true customer_branch_view: allOf: - $ref: '#/components/schemas/CustomerBranchView' nullable: true readOnly: true location: type: integer nullable: true location_name: type: string nullable: true readOnly: true brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 default_replace_months: type: integer maximum: 2147483647 minimum: 0 latest_state: allOf: - $ref: '#/components/schemas/EquipmentState' nullable: true readOnly: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true qr_path: type: string nullable: true readOnly: true qr_url: type: string nullable: true readOnly: true num_orders: type: integer nullable: true readOnly: true documents: type: array items: $ref: '#/components/schemas/EquipmentDocument' readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer_branch_view - documents - id - latest_state - location_name - modified - name - num_orders - price_currency - qr_path - qr_url EquipmentAutocomplete: allOf: - $ref: '#/components/schemas/AutocompleteRow' - type: object properties: location: allOf: - $ref: '#/components/schemas/EquipmentAutocompleteLocation' nullable: true identifier: type: string nullable: true description: type: string nullable: true required: - description - identifier - location description: The rows EquipmentViewset.autocomplete returns. EquipmentAutocompleteLocation: type: object description: The trimmed location an equipment autocomplete row carries. properties: id: type: integer name: type: string required: - id - name EquipmentBranchCreate: allOf: - $ref: '#/components/schemas/EquipmentCreate' - $ref: '#/components/schemas/BranchOwnerRequired' EquipmentBranchCreateRequest: type: object properties: branch: type: integer name: type: string minLength: 1 maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 location: type: integer nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ default_replace_months: type: integer maximum: 2147483647 minimum: 0 required: - branch - name EquipmentCreate: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 location: type: integer nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true default_replace_months: type: integer maximum: 2147483647 minimum: 0 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name - price_currency EquipmentCreateQuickBranchRequest: allOf: - $ref: '#/components/schemas/EquipmentCreateQuickRequest' - $ref: '#/components/schemas/BranchOwnerRequired' EquipmentCreateQuickCustomerRequest: allOf: - $ref: '#/components/schemas/EquipmentCreateQuickRequest' - $ref: '#/components/schemas/CustomerOwnerRequired' EquipmentCreateQuickRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' required: - name EquipmentCreateQuickRequestRequest: anyOf: - $ref: '#/components/schemas/EquipmentCreateQuickBranchRequest' - $ref: '#/components/schemas/EquipmentCreateQuickCustomerRequest' EquipmentCreateRequest: anyOf: - $ref: '#/components/schemas/EquipmentBranchCreate' - $ref: '#/components/schemas/EquipmentCustomerCreate' EquipmentCreateRequestRequest: anyOf: - $ref: '#/components/schemas/EquipmentBranchCreateRequest' - $ref: '#/components/schemas/EquipmentCustomerCreateRequest' EquipmentCustomerCreate: allOf: - $ref: '#/components/schemas/EquipmentCreate' - $ref: '#/components/schemas/CustomerOwnerRequired' EquipmentCustomerCreateRequest: type: object properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 location: type: integer nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ default_replace_months: type: integer maximum: 2147483647 minimum: 0 required: - customer - name EquipmentDashboardResponse: type: object properties: equipment: $ref: '#/components/schemas/Equipment' orders: $ref: '#/components/schemas/CustomerDashboardOrders' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - counts_year_order_type_stats - equipment - order_counts_stats - order_types_month_stats - order_types_stats - orders EquipmentDocument: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: id: type: integer readOnly: true equipment: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true equipment_view: allOf: - $ref: '#/components/schemas/EquipmentOrderLine' readOnly: true required: - created - equipment - equipment_view - filename - id - modified - url EquipmentDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: equipment: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte required: - equipment EquipmentOrderLine: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 default_replace_months: type: integer maximum: 2147483647 minimum: 0 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name EquipmentQrTypeEnum: enum: - none - my24service - shltr type: string description: |- * `none` - none * `my24service` - my24service * `shltr` - shltr EquipmentState: type: object properties: id: type: integer readOnly: true equipment: type: integer state: type: string maxLength: 255 replace_months: type: integer maximum: 2147483647 minimum: 0 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - equipment - id - modified - state EquipmentStateRequest: type: object properties: equipment: type: integer state: type: string minLength: 1 maxLength: 255 replace_months: type: integer maximum: 2147483647 minimum: 0 required: - equipment - state EquipmentTypeEnum: enum: - technical - facility type: string description: |- * `technical` - Technical * `facility` - Facility FilterCondition: type: object properties: filter: type: integer field: type: string maxLength: 255 operator: type: string maxLength: 255 values: type: array items: type: object description: 'One stored filter value: `type` names the kind of thing `value` holds - text, a boolean, a date or a datetime.' properties: value: oneOf: - type: string - type: boolean type: type: string enum: - char - bool - date - datetime required: - value - type is_case_sensitive: type: boolean default: false is_exact: type: boolean default: false is_exclude: type: boolean default: false values_query_mode: type: string default: or maxLength: 3 values_not: type: boolean default: false required: - values FilterConditionRequest: type: object properties: filter: type: integer field: type: string minLength: 1 maxLength: 255 operator: type: string minLength: 1 maxLength: 255 values: type: array items: type: object description: 'One stored filter value: `type` names the kind of thing `value` holds - text, a boolean, a date or a datetime.' properties: value: oneOf: - type: string - type: boolean type: type: string enum: - char - bool - date - datetime required: - value - type is_case_sensitive: type: boolean default: false is_exact: type: boolean default: false is_exclude: type: boolean default: false values_query_mode: type: string minLength: 1 default: or maxLength: 3 values_not: type: boolean default: false required: - values ForbiddenResponse: type: object properties: detail: type: string default: You do not have permission to perform this action. FrontendVersionResponse: type: object description: The dict GetFrontendVersion returns. properties: version: type: string required: - version GetInitialDataResponse: type: object description: The bootstrap dict GetInitialData returns. properties: currencies: type: array items: type: string memberInfo: $ref: '#/components/schemas/InitialDataMember' userInfo: $ref: '#/components/schemas/UserInfoResponse' statuscodes: type: array items: $ref: '#/components/schemas/Statuscode' profile: $ref: '#/components/schemas/Profile' required: - currencies - memberInfo - profile - statuscodes GetTopUsersForCustomerView: type: object properties: full_name: type: string readOnly: true user_id: type: integer nullable: true readOnly: true bucket: type: string readOnly: true work_total: type: string readOnly: true travel_total: type: string readOnly: true distance_total: type: integer nullable: true readOnly: true required: - bucket - distance_total - full_name - travel_total - user_id - work_total GetWorkorderSignDetailsResponse: type: object description: signing-page bundle assembled by get_workorder_sign_details(). properties: order: $ref: '#/components/schemas/Order' member: $ref: '#/components/schemas/Member' user_pk: type: integer assigned_order_workorder_id: type: string nullable: true assigned_order_id: type: integer assigned_order_activity: type: array items: $ref: '#/components/schemas/WorkorderSignActivityRow' assigned_order_activity_totals: $ref: '#/components/schemas/ActivityQuerysetTotal' assigned_order_materials: type: array items: $ref: '#/components/schemas/AssignedOrderMaterialTotals' assigned_order_extra_work: type: array items: $ref: '#/components/schemas/WorkorderSignExtraWorkRow' required: - assigned_order_activity - assigned_order_activity_totals - assigned_order_extra_work - assigned_order_id - assigned_order_materials - assigned_order_workorder_id - member - order - user_pk GrippSettings: type: object description: The Gripp connector settings; the secrets are write-only. properties: gripp_api_enabled: type: boolean gripp_default_order_type: type: string gripp_default_employee: type: string gripp_project_phase_match: type: string gripp_project_phase_workorder_signed: type: string gripp_tasktype_hours: type: string gripp_tasktype_travel: type: string IbanCheckRequestRequest: type: object description: The body ValidateIBANView reads. properties: IBAN: type: string minLength: 1 required: - IBAN IbanValidation: type: object description: The dict ValidateIBANView returns. properties: valid: type: boolean IBAN: type: string required: - valid Import: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 file: type: string format: uri mapping: type: object additionalProperties: true description: How import columns map onto model fields, as the import wizard left it. filter_on: type: array items: {} description: What the wizard filtered the source rows on. result_inserts: type: object additionalProperties: type: integer description: How many rows were inserted, per model type. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - file - id - modified - name ImportError: type: object description: |- One row an import could not place. Two kinds of failure share the shape - a row missing required columns (`required_not_ok` naming them) and a row naming an owner that does not exist (`error` and `kwargs`) - so each key is optional and which ones are filled says which failure it was. properties: required_not_ok: type: array items: type: string record: type: object additionalProperties: {} row: type: object additionalProperties: {} error: type: string kwargs: type: string ImportRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 file: type: string format: byte mapping: type: object additionalProperties: true description: How import columns map onto model fields, as the import wizard left it. filter_on: type: array items: {} description: What the wizard filtered the source rows on. result_inserts: type: object additionalProperties: type: integer description: How many rows were inserted, per model type. required: - file - name ImportResult: type: object description: |- What an import run produced, per sheet. `preview` and `do` answer with the same shape: a preview is the run rolled back, not a different report. properties: branches: $ref: '#/components/schemas/ImportSheetResult' customers: $ref: '#/components/schemas/ImportSheetResult' locations: $ref: '#/components/schemas/ImportSheetResult' equipment: $ref: '#/components/schemas/ImportSheetResult' materials: $ref: '#/components/schemas/ImportSheetResult' suppliers: $ref: '#/components/schemas/ImportSheetResult' ImportRevert: type: object description: What reverting an import deleted, per sheet. properties: branches: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer customers: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer locations: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer equipment: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer materials: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer suppliers: type: array items: oneOf: - type: integer - type: object additionalProperties: type: integer ImportSheetResult: type: object description: What one sheet of an import produced. properties: errors: type: array items: $ref: '#/components/schemas/ImportError' import: type: array items: $ref: '#/components/schemas/ImportedRow' required: - errors - import ImportedRow: type: object description: |- One row an import created or matched. The body is the serialized model, which differs per sheet - a customer row against an equipment row - so only the keys every sheet produces are named. `import_created` says whether the row was created or matched to an existing one. properties: id: type: integer name: type: string import_created: type: boolean required: - id - import_created - name InitialDataMember: type: object description: |- MinimalMember plus what GetInitialData bolts onto it. The extra keys only exist for a logged-in caller, hence optional. properties: id: type: integer readOnly: true companycode: type: string maxLength: 30 companylogo_url: type: string readOnly: true name: type: string maxLength: 255 address: type: string maxLength: 255 tel: type: string maxLength: 25 fax: type: string nullable: true maxLength: 25 www: type: string format: uri maxLength: 255 postal: type: string maxLength: 10 city: type: string maxLength: 120 country_code: type: string maxLength: 2 member_type: $ref: '#/components/schemas/MemberTypeEnum' email: type: string format: email maxLength: 255 companylogo: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true activities: type: string info: type: string contacts: type: string has_api_users: type: boolean has_branches: type: boolean deep_link: type: string nullable: true maxLength: 255 pictures: type: array items: type: string member_texts: type: object additionalProperties: true order_types: type: array items: type: string countries: type: array items: type: string equipment_qr_type: type: string vat_types: type: array items: type: integer settings: $ref: '#/components/schemas/InitialDataSettings' contract: $ref: '#/components/schemas/MemberContract' required: - activities - address - city - companycode - companylogo_url - contacts - email - id - info - name - postal - tel - www InitialDataSettings: type: object description: The typed member settings plus the one key read off a member column. properties: countries: type: array items: type: string maxLength: 2 date_format: type: string maxLength: 50 default_currency: type: string maxLength: 3 invoice_default_vat: type: integer invoice_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_term_of_payment_days: type: integer quotation_default_expire_days: type: integer quotation_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_vat: type: integer quotation_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_id_autoincrement: type: boolean order_uses_equipment: type: boolean sick_leave_user_allowed_create: type: boolean sick_leave_user_allowed_end: type: boolean equipment_planning_quick_create: type: boolean equipment_quick_create: type: boolean equipment_location_planning_quick_create: type: boolean equipment_location_quick_create: type: boolean order_list_include_reference: type: boolean workorder_show_related_orders: type: boolean break_calculation: type: boolean customer_id_start: type: integer order_id: type: integer quotation_id: type: integer workorder_id: type: integer purchase_order_id: type: integer invoice_id: type: integer order_types: type: array items: type: string break_calculation_after_minutes: type: integer break_calculation_duration_minutes: type: integer app_session_token_expiry_days: type: integer mobile_hours_select_user: type: boolean InventoryLocations: type: object properties: location_id: type: integer location_name: type: string total_amount: type: integer required: - location_id - location_name - total_amount InventoryMaterials: type: object properties: material_id: type: integer material_name: type: string material_identifier: type: string supplier_name: type: string total_amount: type: integer num_sold_today: type: integer price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - material_id - material_identifier - material_name - num_sold_today - price_purchase - price_selling - price_selling_alt - supplier_name - total_amount InventoryMaterialsMinimal: type: object properties: material_id: type: integer material_name: type: string material_identifier: type: string supplier_name: type: string total_amount: type: integer required: - material_id - material_identifier - material_name - supplier_name - total_amount InventoryResponse: type: object description: The dict InventoryForMaterialLocation returns. properties: inventory: type: number format: double required: - inventory Invoice: type: object properties: id: type: integer readOnly: true invoice_id: type: string maxLength: 60 uuid: type: string format: uuid order: type: integer reference: type: string nullable: true maxLength: 120 created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 order_uuid: type: string readOnly: true description: type: string nullable: true maxLength: 255 term_of_payment_days: type: integer maximum: 2147483647 minimum: 0 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true preliminary: type: boolean invoice_email: type: string nullable: true invoice_pdf_path: type: string nullable: true maxLength: 255 invoice_pdf_from_docx_filename: type: string nullable: true maxLength: 255 last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - id - last_status - last_status_date - last_status_full - order - order_uuid - statuscode_id - text_color - total_currency - vat_currency InvoiceActivity: type: object properties: id: type: integer readOnly: true assigned_order: type: integer full_name: type: string readOnly: true activity_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. activity_date_iso: type: string format: date readOnly: true date: type: string nullable: true readOnly: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true unforeseen_work_duration: type: string nullable: true unforeseen_work_description: type: string nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 extra_work: type: string nullable: true extra_work_description: type: string nullable: true distance_fixed_rate_amount: type: integer maximum: 2147483647 minimum: 0 actual_work: type: string format: time nullable: true is_partner: type: boolean partner_companycode: type: string nullable: true required: - activity_date_iso - assigned_order - date - full_name - id - is_partner - partner_companycode InvoiceActivityTotals: type: object description: Full invoice totals, distinct from the workorder subset. properties: work_total_secs: type: string work_total: type: string readOnly: true travel_to_total_secs: type: string travel_to_total: type: string readOnly: true travel_back_total_secs: type: string travel_back_total: type: string readOnly: true travel_total_secs: type: string travel_total: type: string readOnly: true distance_to_total: type: integer distance_back_total: type: integer distance_total: type: integer extra_work_total_secs: type: string extra_work_total: type: string readOnly: true actual_work_total_secs: type: string actual_work_total: type: string readOnly: true distance_fixed_rate_amount: type: integer user_totals: type: array items: $ref: '#/components/schemas/ActivityUserTotal' required: - actual_work_total - extra_work_total - travel_back_total - travel_to_total - travel_total - user_totals - work_total InvoiceAutocomplete: type: object description: |- One row of GET invoice/invoice/autocomplete/. The action builds the rows by hand (invoice id plus the customer address it belongs to), so the component names exactly those keys rather than the invoice serializer's. properties: id: type: integer uuid: type: string format: uuid invoice_id: type: string name: type: string address: type: string postal: type: string city: type: string value: type: string required: - address - city - id - invoice_id - name - postal - uuid - value InvoiceDataResponse: type: object properties: order_pk: type: integer customer_pk: type: integer nullable: true invoice_id: type: integer order_id: type: string order_reference: type: string nullable: true invoice_default_call_out_costs: type: string nullable: true invoice_default_hourly_rate: type: string nullable: true invoice_default_price_per_km: type: string nullable: true used_materials: type: array items: $ref: '#/components/schemas/AssignedOrderMaterialTotals' material_models: type: array items: $ref: '#/components/schemas/Material' activity: type: array items: $ref: '#/components/schemas/InvoiceActivity' activity_totals: $ref: '#/components/schemas/InvoiceActivityTotals' engineer_models: type: array items: $ref: '#/components/schemas/Engineer' required: - activity - activity_totals - customer_pk - engineer_models - invoice_default_call_out_costs - invoice_default_hourly_rate - invoice_default_price_per_km - invoice_id - material_models - order_id - order_pk - order_reference - used_materials InvoiceEmail: type: object properties: id: type: integer readOnly: true invoice: type: integer sent_by_full_name: type: string nullable: true readOnly: true recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true required: - id - invoice - sent_by_full_name InvoiceEmailDocument: type: object properties: name: type: string is_pdf: type: boolean required: - is_pdf - name InvoiceEmailDraft: type: object description: Lookup can return an empty draft, without a persisted id or sender. properties: id: type: integer invoice: type: integer nullable: true sent_by_full_name: type: string nullable: true recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true required: - invoice InvoiceEmailRequest: type: object properties: invoice: type: integer recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true required: - invoice InvoiceInfo: type: object description: |- Documents the dict OrderDetailSerializer.get_invoices hand-builds per invoice. properties: id: type: integer invoice_id: type: string uuid: type: string preliminary: type: boolean required: - id - invoice_id - preliminary - uuid InvoiceLine: type: object properties: id: type: integer readOnly: true invoice: type: integer description: type: string nullable: true maxLength: 255 amount: type: string maxLength: 150 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true required: - amount - id - invoice - price_currency - total_currency - vat_currency InvoiceLineRequest: type: object properties: invoice: type: integer description: type: string nullable: true maxLength: 255 amount: type: string minLength: 1 maxLength: 150 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - amount - invoice InvoicePreliminaryResponse: type: object description: |- the row GET invoice/invoice/preliminary/ serves one invoice as. the action serialises whole invoices through InvoiceViewset.qs_to_response, but spectacular kept only the eight read-only/plainly-required fields in that component's required list - pk, order/order_uuid, both *_currency companions and the status trio - teaching clients those keys may vanish per row. they cannot: a modelserializer emits its complete field set on every row, and order (not-null fk) plus get_order_uuid mean an unset relation would be a 500, not a short row. so every key below stays required and only nullability is declared, exactly where the model column is null=true; types/format match what those very fields generate for the shared components (decimal strings, uuid, iso date-time). properties: id: type: integer invoice_id: type: string uuid: type: string format: uuid order: type: integer order_uuid: type: string reference: type: string nullable: true created_by: type: integer nullable: true created_by_fullname: type: string nullable: true description: type: string nullable: true term_of_payment_days: type: integer vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string preliminary: type: boolean invoice_email: type: string nullable: true invoice_pdf_path: type: string nullable: true invoice_pdf_from_docx_filename: type: string nullable: true last_status: type: string last_status_full: type: string nullable: true last_status_date: type: string format: date-time nullable: true statuscode_id: type: integer nullable: true color: type: string nullable: true text_color: type: string nullable: true required: - color - created_by - created_by_fullname - description - id - invoice_email - invoice_id - invoice_pdf_from_docx_filename - invoice_pdf_path - last_status - last_status_date - last_status_full - order - order_uuid - preliminary - reference - statuscode_id - term_of_payment_days - text_color - total - total_currency - uuid - vat - vat_currency - vat_type InvoiceRequest: type: object properties: invoice_id: type: string minLength: 1 maxLength: 60 uuid: type: string format: uuid order: type: integer reference: type: string nullable: true maxLength: 120 created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 description: type: string nullable: true maxLength: 255 term_of_payment_days: type: integer maximum: 2147483647 minimum: 0 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ preliminary: type: boolean invoice_email: type: string nullable: true invoice_pdf_path: type: string nullable: true maxLength: 255 invoice_pdf_from_docx_filename: type: string nullable: true maxLength: 255 required: - order InvoiceStatus: type: object properties: id: type: integer readOnly: true invoice: type: integer status: type: string maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - invoice - modified - status InvoiceStatusRequest: type: object properties: invoice: type: integer status: type: string minLength: 1 maxLength: 255 required: - invoice - status InvoiceTemplate: type: object properties: invoice_template_uuid: type: string maxLength: 40 invoice_template_name: type: string maxLength: 255 required: - invoice_template_name - invoice_template_uuid InvoiceView: type: object properties: id: type: integer readOnly: true invoice_id: type: string maxLength: 60 reference: type: string nullable: true maxLength: 120 uuid: type: string format: uuid order: type: integer member: allOf: - $ref: '#/components/schemas/Member' readOnly: true customer: allOf: - $ref: '#/components/schemas/Customer' readOnly: true invoicelines: type: array items: $ref: '#/components/schemas/InvoiceLine' created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true readOnly: true description: type: string nullable: true maxLength: 255 term_of_payment_days: type: integer maximum: 2147483647 minimum: 0 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true preliminary: type: boolean invoice_email: type: string nullable: true statuses: type: array items: $ref: '#/components/schemas/InvoiceStatus' readOnly: true invoice_pdf_from_docx_filename: type: string nullable: true maxLength: 255 last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - customer - id - invoice_id - invoicelines - last_status - last_status_date - last_status_full - member - order - order_id - order_reference - statuscode_id - statuses - text_color - total_currency - vat_currency LanguageVarsResponse: type: object description: The dict GetLanguageVars returns. properties: set_language_url: type: string languages: type: array items: type: array items: type: string current_language: type: string required: - current_language - languages - set_language_url LeaveHoursTotals: type: object description: The dict UserLeaveHoursMixin.get_totals returns. properties: result: $ref: '#/components/schemas/UserLeaveHoursData' required: - result LeaveType: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 150 counts_as_leave: type: boolean created: type: string format: date-time readOnly: true modified: type: string format: date-time readOnly: true required: - created - id - modified - name LeaveTypeRequest: type: object properties: name: type: string minLength: 1 maxLength: 150 counts_as_leave: type: boolean required: - name ListDeviceResponse: type: object description: '{user, assignedorders} envelope built by list_device().' properties: user: type: string assignedorders: type: array items: $ref: '#/components/schemas/AssignedOrderView' ListTimesheetTotalsResponse: type: object description: timesheet grid metadata plus rows, built by hand in the view. properties: day_fields: type: array items: type: string day_field_types: type: array items: type: string date_list: type: array items: type: string format: date result: type: array items: $ref: '#/components/schemas/TimesheetTotalsRow' materials: type: array items: $ref: '#/components/schemas/TimesheetMaterialRow' full_name: type: string nullable: true required: - date_list - day_field_types - day_fields - full_name - materials - result Location: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 customer: type: integer nullable: true customer_branch_view: allOf: - $ref: '#/components/schemas/CustomerBranchView' nullable: true readOnly: true branch: type: integer nullable: true building: type: integer nullable: true documents: type: array items: $ref: '#/components/schemas/LocationDocument' readOnly: true qr_path: type: string nullable: true readOnly: true qr_url: type: string nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer_branch_view - documents - id - modified - name - qr_path - qr_url LocationAutocomplete: allOf: - $ref: '#/components/schemas/AutocompleteRow' description: |- The rows LocationViewset.autocomplete returns. A location's label is just its name, so this adds nothing to the shared row beyond saying which format `value` takes. LocationBranchCreate: allOf: - $ref: '#/components/schemas/LocationCreate' - $ref: '#/components/schemas/BranchOwnerRequired' LocationBranchCreateRequest: type: object properties: branch: type: integer name: type: string minLength: 1 maxLength: 255 building: type: integer nullable: true required: - branch - name LocationCreate: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 building: type: integer nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name LocationCreateQuickBranchRequest: allOf: - $ref: '#/components/schemas/LocationCreateQuickRequest' - $ref: '#/components/schemas/BranchOwnerRequired' LocationCreateQuickCustomerRequest: allOf: - $ref: '#/components/schemas/LocationCreateQuickRequest' - $ref: '#/components/schemas/CustomerOwnerRequired' LocationCreateQuickRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 required: - name LocationCreateQuickRequestRequest: anyOf: - $ref: '#/components/schemas/LocationCreateQuickBranchRequest' - $ref: '#/components/schemas/LocationCreateQuickCustomerRequest' LocationCreateRequest: anyOf: - $ref: '#/components/schemas/LocationBranchCreate' - $ref: '#/components/schemas/LocationCustomerCreate' LocationCreateRequestRequest: anyOf: - $ref: '#/components/schemas/LocationBranchCreateRequest' - $ref: '#/components/schemas/LocationCustomerCreateRequest' LocationCustomerCreate: allOf: - $ref: '#/components/schemas/LocationCreate' - $ref: '#/components/schemas/CustomerOwnerRequired' LocationCustomerCreateRequest: type: object properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 building: type: integer nullable: true required: - customer - name LocationDashboardResponse: type: object properties: location: $ref: '#/components/schemas/Location' orders: $ref: '#/components/schemas/CustomerDashboardOrders' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' counts_year_order_type_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - counts_year_order_type_stats - location - order_counts_stats - order_types_month_stats - order_types_stats - orders LocationDocument: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: id: type: integer readOnly: true location: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true location_view: allOf: - $ref: '#/components/schemas/LocationOrderLine' readOnly: true required: - created - filename - id - location - location_view - modified - url LocationDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: location: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte required: - location LocationOrderLine: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name LocationToAddressRequestRequest: type: object description: The body LocationToAddress reads. properties: lat: type: number format: double lon: type: number format: double required: - lat - lon Logout: type: object properties: revoke_token: type: boolean default: false LogoutRequest: type: object properties: revoke_token: type: boolean default: false MaintenanceContract: type: object properties: id: type: integer readOnly: true customer: type: integer name: type: string maxLength: 255 nullable: true customer_view: allOf: - $ref: '#/components/schemas/Customer' readOnly: true sum_tariffs: oneOf: - type: number - type: string readOnly: true remarks: type: string nullable: true created_orders: type: integer nullable: true readOnly: true num_order_equipment: type: integer nullable: true readOnly: true num_equipment: type: integer readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - created_orders - customer - customer_view - id - modified - name - num_equipment - num_order_equipment - sum_tariffs MaintenanceContractRequest: type: object properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 remarks: type: string nullable: true required: - customer - name MaintenanceContractWithEquipmentRequestRequest: type: object description: |- Schema-only shape of the combined body: the actual write goes through MaintenanceContractSerializer for the contract fields and MaintenanceEquipmentReplaceSetSerializer for the rows (see MaintenanceContractWithEquipmentMixin). `equipment` is required, matching the view: the list is the whole set, so a body that leaves the key out would mean "delete every row" rather than "leave the equipment alone" (see the mixin's `_equipment_rows`). properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 remarks: type: string nullable: true equipment: type: array items: $ref: '#/components/schemas/MaintenanceEquipmentRowRequest' required: - customer - equipment - name MaintenanceContractWithEquipmentResponse: type: object properties: id: type: integer readOnly: true customer: type: integer name: type: string maxLength: 255 nullable: true customer_view: allOf: - $ref: '#/components/schemas/Customer' readOnly: true sum_tariffs: oneOf: - type: number - type: string readOnly: true remarks: type: string nullable: true created_orders: type: integer nullable: true readOnly: true num_order_equipment: type: integer nullable: true readOnly: true num_equipment: type: integer readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. equipment: type: array items: $ref: '#/components/schemas/MaintenanceEquipment' readOnly: true required: - created - created_orders - customer - customer_view - equipment - id - modified - name - num_equipment - num_order_equipment - sum_tariffs MaintenanceEquipment: type: object properties: id: type: integer readOnly: true contract: type: integer nullable: true equipment: type: integer nullable: true equipment_name: type: string maxLength: 255 times_per_year: type: integer maximum: 2147483647 minimum: 1 remarks: type: string nullable: true tariff: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ tariff_currency: type: string readOnly: true created_orders: type: integer nullable: true readOnly: true num_order_equipment: type: integer nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - created_orders - equipment - equipment_name - id - modified - num_order_equipment - tariff - tariff_currency MaintenanceEquipmentRequest: type: object properties: contract: type: integer nullable: true equipment: type: integer equipment_name: type: string minLength: 1 maxLength: 255 times_per_year: type: integer maximum: 2147483647 minimum: 1 remarks: type: string nullable: true tariff: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - equipment - equipment_name - tariff MaintenanceEquipmentRowRequest: type: object properties: id: type: integer equipment: type: integer equipment_name: type: string minLength: 1 maxLength: 255 times_per_year: type: integer maximum: 2147483647 minimum: 1 remarks: type: string nullable: true tariff: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ tariff_currency: $ref: '#/components/schemas/CurrencyEnum' required: - equipment - equipment_name - tariff Material: type: object properties: id: type: integer readOnly: true identifier: type: string nullable: true maxLength: 255 show_name: type: string readOnly: true name: type: string nullable: true maxLength: 255 name_short: type: string nullable: true maxLength: 255 unit: type: string nullable: true maxLength: 100 supplier: type: string nullable: true maxLength: 100 supplier_relation: type: integer nullable: true product_type: type: string nullable: true maxLength: 100 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ external_identifier: type: string nullable: true maxLength: 100 price_purchase_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_purchase_ex_currency: type: string readOnly: true price_selling_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_ex_currency: type: string readOnly: true price_selling_alt_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true supplier_name: type: string nullable: true readOnly: true location: type: string nullable: true maxLength: 100 latest_year: type: integer nullable: true readOnly: true year_used: type: integer nullable: true readOnly: true required: - id - latest_year - modified - price_purchase - price_purchase_ex - price_purchase_ex_currency - price_selling - price_selling_alt - price_selling_alt_ex - price_selling_ex - price_selling_ex_currency - show_name - supplier_name - year_used MaterialAutocomplete: allOf: - $ref: '#/components/schemas/AutocompleteRow' - type: object properties: identifier: type: string nullable: true price_purchase: type: string readOnly: true price_selling: type: string readOnly: true price_selling_alt: type: string readOnly: true image: type: string readOnly: true required: - identifier - image - price_purchase - price_selling - price_selling_alt description: |- The rows MaterialViewset.autocomplete returns. The prices are strings rather than numbers: they are rendered with `%s` off the Decimal, which is not the fixed-point form a DecimalField would emit, and the picker shows them as-is. MaterialCreate: type: object properties: id: type: integer readOnly: true identifier: type: string nullable: true maxLength: 255 show_name: type: string nullable: true readOnly: true name: type: string nullable: true maxLength: 255 name_short: type: string nullable: true maxLength: 255 unit: type: string nullable: true maxLength: 100 supplier: type: string nullable: true maxLength: 100 supplier_relation: type: integer nullable: true product_type: type: string nullable: true maxLength: 100 price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_purchase_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_alt: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt_currency: $ref: '#/components/schemas/CurrencyEnum' price_purchase_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_purchase_ex_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_ex_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_alt_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt_ex_currency: $ref: '#/components/schemas/CurrencyEnum' external_identifier: type: string nullable: true maxLength: 100 image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true required: - id - name - show_name MaterialCreateRequest: type: object properties: identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 name_short: type: string nullable: true maxLength: 255 unit: type: string nullable: true maxLength: 100 supplier: type: string nullable: true maxLength: 100 supplier_relation: type: integer nullable: true product_type: type: string nullable: true maxLength: 100 price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_purchase_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_alt: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt_currency: $ref: '#/components/schemas/CurrencyEnum' price_purchase_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_purchase_ex_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_ex_currency: $ref: '#/components/schemas/CurrencyEnum' price_selling_alt_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt_ex_currency: $ref: '#/components/schemas/CurrencyEnum' external_identifier: type: string nullable: true maxLength: 100 image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true required: - name MaterialStatsTable: type: object properties: id: type: integer readOnly: true name: type: string nullable: true maxLength: 255 supplier: $ref: '#/components/schemas/Supplier' num_entries: type: integer nullable: true readOnly: true num_sales: type: number format: double readOnly: true turnover: type: number format: double readOnly: true profit: type: number format: double readOnly: true sum_price_purchase: type: number format: double readOnly: true margin_product: type: number format: double readOnly: true current_stock: type: number format: double readOnly: true sum_inventory: type: object additionalProperties: type: number readOnly: true num_purchase: type: integer readOnly: true required: - current_stock - id - margin_product - num_entries - num_purchase - num_sales - profit - sum_inventory - sum_price_purchase - supplier - turnover MaterialStatsTableResponse: type: object description: The dict MaterialViewset.stats_table returns. properties: results: type: array items: $ref: '#/components/schemas/MaterialStatsTable' inventory_keys: type: object additionalProperties: true required: - inventory_keys - results MaterialTotalSalesPerCustomerResponse: type: object description: The dict MaterialViewset.total_sales_per_customer returns. properties: result: type: array items: $ref: '#/components/schemas/CustomerTotalSalesRow' num_pages: type: integer required: - num_pages - result MaterialTotalSalesPerMaterialCustomerResponse: type: object description: The dict MaterialViewset.total_sales_per_material_customer returns. properties: result: type: array items: $ref: '#/components/schemas/CustomerMaterialTotalSalesRow' num_pages: type: integer required: - num_pages - result MaterialTotalSalesPerSupplierPerMaterialResponse: type: object description: The dict MaterialViewset.total_sales_per_supplier_per_material returns. properties: result: type: array items: $ref: '#/components/schemas/SupplierMaterialTotalSalesRow' num_pages: type: integer required: - num_pages - result MaterialTotalSalesPerSupplierResponse: type: object description: The dict MaterialViewset.total_sales_per_supplier returns. properties: result: type: array items: $ref: '#/components/schemas/SupplierTotalSalesRow' num_pages: type: integer required: - num_pages - result MaterialTotalSalesResponse: type: object description: The dict MaterialViewset.total_sales returns; num_pages is always 1. properties: result: type: array items: $ref: '#/components/schemas/MaterialTotalSalesRow' num_pages: type: integer required: - num_pages - result MaterialTotalSalesRow: type: object description: |- Numeric columns every total_sales aggregate shares. Nulls cannot occur: a row only exists when at least one sales mutation joins to it and every source column (amount, both prices) is NOT NULL. properties: sum_amount: type: number format: double sum_price_purchase: type: number format: double sum_price_selling: type: number format: double profit: type: number format: double amount_perc: oneOf: - type: number - type: string amount_selling_perc: oneOf: - type: number - type: string material_name: type: string nullable: true required: - amount_perc - amount_selling_perc - material_name - profit - sum_amount - sum_price_purchase - sum_price_selling Member: type: object properties: id: type: integer readOnly: true companycode: type: string maxLength: 30 minLength: 2 name: type: string maxLength: 255 address: type: string maxLength: 255 tel: type: string maxLength: 25 fax: type: string nullable: true maxLength: 25 www: type: string format: uri maxLength: 255 postal: type: string maxLength: 10 city: type: string maxLength: 120 country_code: type: string maxLength: 2 email: type: string format: email maxLength: 255 contract_text: type: string readOnly: true contract: type: integer nullable: true contacts: type: string is_deleted: type: boolean member_type: $ref: '#/components/schemas/MemberTypeEnum' companylogo: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true companylogo_url: type: string readOnly: true companylogo_workorder: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true companylogo_workorder_url: type: string nullable: true readOnly: true activities: type: string info: type: string is_public: type: boolean has_api_users: type: boolean has_branches: type: boolean chamber_of_commerce: type: string nullable: true maxLength: 100 vat_number: type: string nullable: true maxLength: 100 deep_link: type: string nullable: true maxLength: 255 equipment_qr_type: $ref: '#/components/schemas/EquipmentQrTypeEnum' is_requested: type: boolean has_mobile_activity_user_select: type: boolean created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - activities - address - city - companycode - companylogo_url - companylogo_workorder_url - contacts - contract_text - created - email - id - info - modified - name - postal - tel - www MemberContract: type: object properties: member_type: type: string readOnly: true member_contract: type: string readOnly: true required: - member_contract - member_type MemberRequest: type: object properties: companycode: type: string minLength: 2 maxLength: 30 name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 tel: type: string minLength: 1 maxLength: 25 fax: type: string nullable: true maxLength: 25 www: type: string format: uri minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 10 city: type: string minLength: 1 maxLength: 120 country_code: type: string minLength: 1 maxLength: 2 email: type: string format: email minLength: 1 maxLength: 255 contract: type: integer nullable: true contacts: type: string minLength: 1 is_deleted: type: boolean member_type: $ref: '#/components/schemas/MemberTypeEnum' companylogo: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true companylogo_workorder: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true activities: type: string minLength: 1 info: type: string minLength: 1 is_public: type: boolean has_api_users: type: boolean has_branches: type: boolean chamber_of_commerce: type: string nullable: true maxLength: 100 vat_number: type: string nullable: true maxLength: 100 deep_link: type: string nullable: true maxLength: 255 equipment_qr_type: $ref: '#/components/schemas/EquipmentQrTypeEnum' is_requested: type: boolean has_mobile_activity_user_select: type: boolean required: - activities - address - city - companycode - contacts - email - info - name - postal - tel - www MemberSelect: type: object description: |- The rows MemberViewset.get_exclude_me returns. Every public, non-requested member except the caller's own. No `city`, unlike PartnerSelectSerializer: this picker folds the companycode into the label and stops there. properties: id: type: integer name: type: string readOnly: true required: - id - name MemberSettings: type: object description: The tenant settings the web settings screen edits, typed. properties: countries: type: array items: type: string maxLength: 2 date_format: type: string maxLength: 50 default_currency: type: string maxLength: 3 invoice_default_vat: type: integer invoice_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_term_of_payment_days: type: integer quotation_default_expire_days: type: integer quotation_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_vat: type: integer quotation_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_id_autoincrement: type: boolean order_uses_equipment: type: boolean sick_leave_user_allowed_create: type: boolean sick_leave_user_allowed_end: type: boolean equipment_planning_quick_create: type: boolean equipment_quick_create: type: boolean equipment_location_planning_quick_create: type: boolean equipment_location_quick_create: type: boolean order_list_include_reference: type: boolean workorder_show_related_orders: type: boolean break_calculation: type: boolean customer_id_start: type: integer order_id: type: integer quotation_id: type: integer workorder_id: type: integer purchase_order_id: type: integer invoice_id: type: integer order_types: type: array items: type: string break_calculation_after_minutes: type: integer break_calculation_duration_minutes: type: integer app_session_token_expiry_days: type: integer MemberTypeEnum: enum: - maintenance - temps type: string description: |- * `maintenance` - maintenance * `temps` - temps MinimalMember: type: object properties: id: type: integer readOnly: true companycode: type: string maxLength: 30 companylogo_url: type: string readOnly: true name: type: string maxLength: 255 address: type: string maxLength: 255 tel: type: string maxLength: 25 fax: type: string nullable: true maxLength: 25 www: type: string format: uri maxLength: 255 postal: type: string maxLength: 10 city: type: string maxLength: 120 country_code: type: string maxLength: 2 member_type: $ref: '#/components/schemas/MemberTypeEnum' email: type: string format: email maxLength: 255 companylogo: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true activities: type: string info: type: string contacts: type: string has_api_users: type: boolean has_branches: type: boolean deep_link: type: string nullable: true maxLength: 255 required: - activities - address - city - companycode - companylogo_url - contacts - email - id - info - name - postal - tel - www MinimalUser: type: object description: User model w/o password properties: pk: type: integer readOnly: true title: ID username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 email: type: string format: email readOnly: true title: Email address first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 sales_user: type: integer customer_user: type: integer planning_user: type: integer engineer: type: integer student_user: type: integer employee_user: type: integer full_name: type: string readOnly: true is_staff: type: boolean title: Staff status description: Designates whether the user can log into this admin site. is_superuser: type: boolean title: Superuser status description: Designates that this user has all permissions without explicitly assigning them. required: - customer_user - email - employee_user - engineer - full_name - pk - planning_user - sales_user - student_user - username Module: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - name ModuleData: type: object description: |- The rows GetAllModuleData returns. Deliberately not ModuleSerializer: that component belongs to the module CRUD endpoints and carries created/modified, which this hand-built payload has never sent - while its `parts` array is what this endpoint exists for. properties: id: type: integer name: type: string parts: type: array items: $ref: '#/components/schemas/ModuleDataPart' required: - id - name - parts ModuleDataPart: type: object description: The rows in the `parts` list GetAllModuleData returns. properties: id: type: integer name: type: string is_always_selected: type: boolean required: - id - is_always_selected - name ModulePart: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 module: type: integer module_name: type: string readOnly: true is_always_selected: type: boolean created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - module - module_name - name ModulePartRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 module: type: integer is_always_selected: type: boolean required: - module - name ModulePath: type: object description: One module of a contract with the parts it grants. properties: module: type: integer parts: type: array items: type: integer required: - module - parts ModulePathRequest: type: object description: One module of a contract with the parts it grants. properties: module: type: integer parts: type: array items: type: integer required: - module - parts ModuleRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 required: - name MonthListMonthData: type: object description: |- OrderStatsBuilder.build_month_data's totals: one string-perc tally per week-of-year bucket. properties: total: type: integer items: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc required: - items - total MonthListResponse: type: object description: |- The `month_list` endpoint. statuses_data maps week -> statuscode breakdown and assigned_orders_data maps week -> assigned-count breakdown; both carry numeric perc because build_month_data rounds rather than formats them. properties: month_data: $ref: '#/components/schemas/MonthListMonthData' statuses_data: type: object additionalProperties: type: object properties: items: type: object additionalProperties: type: object properties: count: type: integer perc: type: number required: - count - perc total: type: integer required: - items - total assigned_orders_data: type: object additionalProperties: type: object properties: items: type: object additionalProperties: type: object properties: count: type: integer perc: type: number required: - count - perc total: type: integer required: - items - total required: - assigned_orders_data - month_data - statuses_data MoveRequest: type: object properties: from_location_id: type: integer to_location_id: type: integer amount: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - amount - from_location_id - to_location_id MutationTypeEnum: enum: - sales - purchase - move-out - move-in - correction-out - correction-in type: string description: |- * `sales` - sales * `purchase` - purchase * `move-out` - move-out * `move-in` - move-in * `correction-out` - correction-out * `correction-in` - correction-in NewCustomerId: type: object description: The dict CustomerViewset.get_new_customer_id_from_latest returns. properties: result: type: object additionalProperties: type: integer required: - result NotFoundResponse: type: object properties: detail: type: string default: Not found. NumDaysOperatorEnum: enum: - < - <= - '>' - '>=' type: string description: |- * `<` - < * `<=` - <= * `>` - > * `>=` - >= OAuthRequest: type: object properties: code: type: string minLength: 1 state: type: string minLength: 1 required: - code - state OciUrl: type: object description: The dict MemberViewset.get_oci_url returns. properties: url: type: string required: - url Offer: type: object properties: id: type: integer readOnly: true quotation: type: integer sent_by_full_name: type: string nullable: true readOnly: true recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true required: - id - quotation - sent_by_full_name OfferAttachment: type: object description: |- One file an offer is sent with: the quotation's generated PDF (no id, it is not a stored document) or one of its uploaded documents. properties: id: type: integer nullable: true name: type: string is_pdf: type: boolean required: - id - is_pdf - name OfferQuotation: type: object description: The quotation an offer is sent for, as the offer form shows it. properties: id: type: integer readOnly: true quotation_id: type: string maxLength: 50 quotation_name: type: string nullable: true maxLength: 255 quotation_email: type: string format: email nullable: true maxLength: 180 required: - id OfferRequest: type: object properties: quotation: type: integer recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true required: - quotation Order: type: object description: Main Order serializer for list views with all standard fields. properties: id: type: integer readOnly: true uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. documents: type: array items: $ref: '#/components/schemas/OrderDocument' readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' readOnly: true workorder_pdf_url: type: string nullable: true readOnly: true total_price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_relation: type: integer nullable: true customer_rate_avg: oneOf: - type: number - type: string nullable: true readOnly: true assigned_user_info: type: array items: $ref: '#/components/schemas/AssignedUserInfo' readOnly: true required_assigned: type: string readOnly: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 user_order_available_set_count: type: integer readOnly: true assigned_count: type: integer readOnly: true workorder_url: type: string readOnly: true workorder_pdf_url_partner: type: array items: $ref: '#/components/schemas/WorkorderUrlPartner' readOnly: true customer_order_accepted: type: boolean workorder_documents: type: array items: $ref: '#/components/schemas/WorkorderDocument' readOnly: true infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLine' readOnly: true statuses: type: array items: $ref: '#/components/schemas/OrderStatus' readOnly: true branch: type: integer nullable: true quotation: type: integer nullable: true last_update: type: string format: date-time readOnly: true order_email_extra: type: array items: type: string format: email materials: type: array items: $ref: '#/components/schemas/AssignedOrderMaterial' readOnly: true copied_order_data: type: array items: $ref: '#/components/schemas/CopiedOrderData' readOnly: true parent_order_data: allOf: - $ref: '#/components/schemas/ParentOrderData' readOnly: true start_date_iso: type: string format: date readOnly: true end_date_iso: type: string format: date readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - assigned_count - assigned_user_info - color - copied_order_data - created - customer_rate_avg - documents - end_date - end_date_iso - id - infolines - last_status - last_status_date - last_status_full - materials - modified - order_date - order_name - orderlines - parent_order_data - required_assigned - start_date - start_date_iso - statuscode_id - statuses - text_color - user_order_available_set_count - workorder_documents - workorder_pdf_url - workorder_pdf_url_partner - workorder_url OrderAutocomplete: type: object description: |- The rows OrderViewset.autocomplete returns. Not built on the shared autocomplete row: this endpoint spells the order's name `orderName` and keeps a separate `order_id`, so there is no block the two have in common to factor out. The camelCase keys are what the picker already reads and are left alone. `orderDate` is a string, not a date - `Order.order_date` is a property that formats the start and end date and time in the tenant's date format. properties: id: type: integer order_id: type: string nullable: true orderName: type: string nullable: true orderAddress: type: string nullable: true orderPostal: type: string nullable: true orderCity: type: string nullable: true orderCountryCode: type: string nullable: true orderDate: type: string nullable: true value: type: string description: |- Given the *incoming* primitive data, return the value for this field that should be validated and transformed to a native value. readOnly: true required: - id - orderAddress - orderCity - orderCountryCode - orderDate - orderName - orderPostal - order_id - value OrderAvailabilityDetailResponse: type: object description: |- The `{id}/order_availability_detail` body: a minimal order plus two arrays of minimal user rows. properties: order: $ref: '#/components/schemas/OrderMinimal' assigned_users: type: array items: $ref: '#/components/schemas/AvailabilityUserRow' available_users: type: array items: $ref: '#/components/schemas/AvailabilityUserRow' required: - assigned_users - available_users - order OrderCost: type: object properties: id: type: integer readOnly: true order: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true user_full_name: type: string nullable: true maxLength: 150 material: type: integer nullable: true material_name: type: string nullable: true readOnly: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true amount_duration_read: type: string nullable: true readOnly: true amount_duration_secs: type: number format: double nullable: true readOnly: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ readOnly: true vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ readOnly: true total_currency: type: string readOnly: true required: - amount_duration_read - amount_duration_secs - cost_type - id - material_name - order - price_currency - total - total_currency - vat - vat_currency OrderCostRequest: type: object properties: order: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true user_full_name: type: string nullable: true maxLength: 150 material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - cost_type - order OrderCostRowRequest: type: object properties: id: type: integer user: type: integer nullable: true user_full_name: type: string nullable: true maxLength: 150 material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: $ref: '#/components/schemas/CurrencyEnum' vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ OrderCountsStatsData: type: object description: Counts per month, keyed by month number. properties: total: type: integer order_counts: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc required: - order_counts - total OrderCountsStatsResponse: type: object description: The `order_counts_stats` endpoint. properties: order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' required: - order_counts_stats OrderCreate: type: object properties: id: type: integer readOnly: true customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer nullable: true customer_relation: type: integer nullable: true quotation: type: integer nullable: true order_email_extra: type: array items: type: string format: email planning_remarks: type: string nullable: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNested' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNested' required: - color - end_date - id - last_status - last_status_date - last_status_full - order_date - order_id - order_name - start_date - statuscode_id - text_color OrderCreateBranch: allOf: - $ref: '#/components/schemas/OrderCreate' - $ref: '#/components/schemas/BranchOwnerRequired' description: '`branch` mandatory: the variant a tenant with branches gets.' OrderCreateBranchEmployee: type: object description: 'The order a branch employee creates: their own branch, no customer.' properties: id: type: integer readOnly: true customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer nullable: true order_email_extra: type: array items: type: string format: email planning_remarks: type: string nullable: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNested' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNested' required: - color - end_date - id - last_status - last_status_date - last_status_full - order_date - order_id - order_name - start_date - statuscode_id - text_color OrderCreateBranchEmployeeRequest: type: object description: 'The order a branch employee creates: their own branch, no customer.' properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' required: - end_date - order_name - start_date OrderCreateBranchRequest: type: object description: '`branch` mandatory: the variant a tenant with branches gets.' properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer customer_relation: type: integer nullable: true quotation: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' required: - branch - end_date - order_name - start_date OrderCreateCustomer: type: object description: |- Base for the order create serializers. Subclasses define only Meta and inherit the model: class Meta(BaseOrderCreateSerializer.Meta): fields = ORDER_CORE_FIELDS + (...) extra_kwargs = {'order_id': {'read_only': True}, ...} Add ``order_email_extra = email_list_field()`` on the subclasses that expose it - all of them do, so the column never reaches the schema as its raw untyped JSONField self. properties: id: type: integer readOnly: true customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true order_email_extra: type: array items: type: string format: email planning_remarks: type: string nullable: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNested' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNested' required: - color - end_date - id - last_status - last_status_date - last_status_full - order_date - order_id - order_name - start_date - statuscode_id - text_color OrderCreateCustomerRelation: allOf: - $ref: '#/components/schemas/OrderCreate' - $ref: '#/components/schemas/CustomerRelationOwnerRequired' description: '`customer_relation` mandatory: the variant a tenant without gets.' OrderCreateCustomerRelationRequest: type: object description: '`customer_relation` mandatory: the variant a tenant without gets.' properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true branch: type: integer nullable: true customer_relation: type: integer quotation: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' required: - customer_relation - end_date - order_name - start_date OrderCreateCustomerRequest: type: object description: |- Base for the order create serializers. Subclasses define only Meta and inherit the model: class Meta(BaseOrderCreateSerializer.Meta): fields = ORDER_CORE_FIELDS + (...) extra_kwargs = {'order_id': {'read_only': True}, ...} Add ``order_email_extra = email_list_field()`` on the subclasses that expose it - all of them do, so the column never reaches the schema as its raw untyped JSONField self. properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' required: - end_date - order_name - start_date OrderCreateRequest: anyOf: - $ref: '#/components/schemas/OrderCreateBranch' - $ref: '#/components/schemas/OrderCreateCustomerRelation' - $ref: '#/components/schemas/OrderCreateCustomer' - $ref: '#/components/schemas/OrderCreateBranchEmployee' OrderCreateRequestRequest: anyOf: - $ref: '#/components/schemas/OrderCreateBranchRequest' - $ref: '#/components/schemas/OrderCreateCustomerRelationRequest' - $ref: '#/components/schemas/OrderCreateCustomerRequest' - $ref: '#/components/schemas/OrderCreateBranchEmployeeRequest' OrderCustomerHistory: type: object description: |- Overrides to_representation to localise start_date and end_date via the tenant's date_format setting. Set ``format_times = True`` on a subclass to also localise start_time and end_time. The localised fields are planned wall-clock values at the tenant, not absolute instants - the schema descriptions on the read side say so (see BaseOrderReadSerializer ISO twins for the machine-readable form). properties: id: type: integer readOnly: true order_id: type: string maxLength: 60 order_date: type: string readOnly: true order_type: type: string nullable: true maxLength: 30 order_reference: type: string nullable: true maxLength: 255 workorder_pdf_url: type: string nullable: true readOnly: true workorder_pdf_url_partner: type: array items: $ref: '#/components/schemas/WorkorderUrlPartner' readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' quotation: type: integer nullable: true last_update: type: string format: date-time readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - id - last_status - last_status_date - last_status_full - last_update - order_date - order_id - orderlines - statuscode_id - text_color - workorder_pdf_url - workorder_pdf_url_partner OrderDetail: type: object description: Full detail serializer with additional fields for org orders, invoices, etc. properties: id: type: integer readOnly: true uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. documents: type: array items: $ref: '#/components/schemas/OrderDocument' readOnly: true statuses: type: array items: $ref: '#/components/schemas/OrderStatus' readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' readOnly: true workorder_pdf_url: type: string nullable: true readOnly: true total_price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_relation: type: integer nullable: true customer_rate_avg: oneOf: - type: number - type: string nullable: true readOnly: true required_assigned: type: string readOnly: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 user_order_available_set_count: type: integer readOnly: true assigned_count: type: integer readOnly: true workorder_url: type: string readOnly: true workorder_pdf_url_partner: type: array items: $ref: '#/components/schemas/WorkorderUrlPartner' readOnly: true customer_order_accepted: type: boolean workorder_documents: type: array items: $ref: '#/components/schemas/WorkorderDocument' readOnly: true infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLine' readOnly: true assigned_user_info: type: array items: $ref: '#/components/schemas/AssignedUserInfoWithBooked' readOnly: true branch: type: integer nullable: true external_identifier: type: string nullable: true maxLength: 100 quotation: type: integer nullable: true planning_remarks: type: string nullable: true last_update: type: string format: date-time readOnly: true order_email_extra: type: array items: type: string format: email workorder_url_org_order: allOf: - $ref: '#/components/schemas/WorkorderUrlOrgOrder' nullable: true readOnly: true workorder_documents_partners: type: array items: $ref: '#/components/schemas/WorkorderDocument' readOnly: true workorder_documents_org_order: type: array items: $ref: '#/components/schemas/WorkorderDocument' readOnly: true invoices: type: array items: $ref: '#/components/schemas/InvoiceInfo' readOnly: true copied_order_data: type: array items: $ref: '#/components/schemas/CopiedOrderData' readOnly: true parent_order_data: allOf: - $ref: '#/components/schemas/ParentOrderData' readOnly: true reported_codes_extra_data: type: array items: $ref: '#/components/schemas/ReportedCodeExtraData' readOnly: true start_date_iso: type: string format: date readOnly: true end_date_iso: type: string format: date readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - assigned_count - assigned_user_info - color - copied_order_data - created - customer_rate_avg - documents - end_date - end_date_iso - id - infolines - invoices - last_status - last_status_date - last_status_full - last_update - modified - order_date - order_name - orderlines - parent_order_data - reported_codes_extra_data - required_assigned - start_date - start_date_iso - statuscode_id - statuses - text_color - user_order_available_set_count - workorder_documents - workorder_documents_org_order - workorder_documents_partners - workorder_pdf_url - workorder_pdf_url_partner - workorder_url - workorder_url_org_order OrderDispatch: type: object description: Serializer for dispatch view with availability info. properties: id: type: integer readOnly: true uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_time: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true workorder_pdf_url: type: string nullable: true readOnly: true documents: type: array items: $ref: '#/components/schemas/OrderDocument' readOnly: true user_order_is_available: type: boolean readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. statuses: type: array items: $ref: '#/components/schemas/OrderStatus' readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' required_assigned: type: string readOnly: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 user_order_available_set_count: type: integer readOnly: true assigned_count: type: integer readOnly: true customer_relation: type: integer nullable: true customer_rate_avg: oneOf: - type: number - type: string nullable: true readOnly: true workorder_url: type: string readOnly: true infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLine' workorder_documents: type: array items: $ref: '#/components/schemas/WorkorderDocument' readOnly: true branch: type: integer nullable: true assigned_user_info: type: array items: $ref: '#/components/schemas/AssignedUserInfo' readOnly: true last_update: type: string format: date-time readOnly: true start_date_iso: type: string format: date readOnly: true end_date_iso: type: string format: date readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - assigned_count - assigned_user_info - color - created - customer_rate_avg - documents - end_date - end_date_iso - id - infolines - last_status - last_status_date - last_status_full - last_update - order_date - order_name - orderlines - required_assigned - start_date - start_date_iso - statuscode_id - statuses - text_color - user_order_available_set_count - user_order_is_available - workorder_documents - workorder_pdf_url - workorder_url OrderDocument: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: id: type: integer readOnly: true order: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true required: - created - filename - id - modified - order - url OrderDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: order: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte required: - order OrderEvent: type: object description: |- Overrides to_representation to localise start_date and end_date via the tenant's date_format setting. Set ``format_times = True`` on a subclass to also localise start_time and end_time. The localised fields are planned wall-clock values at the tenant, not absolute instants - the schema descriptions on the read side say so (see BaseOrderReadSerializer ISO twins for the machine-readable form). properties: id: type: integer readOnly: true title: type: string readOnly: true start: type: string format: date-time description: 'Wall-clock time at the tenant: the planned start of the work, not an absolute instant. No timezone offset is attached; do not convert it between zones.' readOnly: true end: type: string format: date-time nullable: true description: 'Wall-clock time at the tenant: the planned end of the work, not an absolute instant. No timezone offset is attached; do not convert it between zones.' readOnly: true groupId: type: string readOnly: true last_status: type: string nullable: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - end - groupId - id - last_status_date - last_status_full - start - statuscode_id - text_color - title OrderFilter: type: object properties: id: type: integer readOnly: true nullable: true name: type: string maxLength: 255 json_conditions: type: array items: $ref: '#/components/schemas/FilterCondition' querymode: $ref: '#/components/schemas/QuerymodeEnum' base_filter: type: string maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - json_conditions - modified - name OrderFilterExample: type: object description: 'A worked example the filter builder offers: what it does, and the filter.' properties: description: type: string filter: $ref: '#/components/schemas/OrderFilter' required: - description - filter OrderFilterFields: type: object description: |- `OrderFilter.filter_fields` - the columns a filter may be built on. Two fixed keys holding lists of field names: `model` for Order's own columns and `related` for the ones reached through a relation. A hand-written dict rather than serializer output, so this describes it rather than producing it. properties: model: type: array items: type: string related: type: array items: type: string required: - model - related OrderFilterOperator: type: object description: The {value, text} pair OrderFilter.OPERATORS lists per operator. properties: value: type: string text: type: string required: - text - value OrderFilterOperators: type: object description: |- `OrderFilter.OPERATORS` - the operators the filter builder offers. Two fixed keys, `model` for Order's own columns and `related` for the ones reached through a relation, each holding {value, text} pairs - not the flat string list its statuscode namesake answers. A hand-written dict rather than serializer output, so this describes it rather than producing it; see OrderFilterFieldsSerializer for the same arrangement over filter_fields. properties: model: type: array items: $ref: '#/components/schemas/OrderFilterOperator' related: type: array items: $ref: '#/components/schemas/OrderFilterOperator' required: - model - related OrderFilterRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 json_conditions: type: array items: $ref: '#/components/schemas/FilterConditionRequest' querymode: $ref: '#/components/schemas/QuerymodeEnum' base_filter: type: string minLength: 1 maxLength: 255 required: - json_conditions - name OrderFilterSimple: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 required: - id - name OrderLine: type: object description: Shared price fields for the OrderLine serializer family. properties: id: type: integer readOnly: true product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true equipment: type: integer nullable: true equipment_view: allOf: - $ref: '#/components/schemas/EquipmentOrderLine' nullable: true readOnly: true equipment_location: type: integer nullable: true equipment_location_view: allOf: - $ref: '#/components/schemas/LocationOrderLine' nullable: true readOnly: true maintenance_contract: type: integer nullable: true org_orderline_pk: type: integer maximum: 2147483647 minimum: 0 nullable: true org_member: type: integer nullable: true required: - equipment_location_view - equipment_view - id OrderLineCreateUpdate: type: object description: Shared price fields for the OrderLine serializer family. properties: id: type: integer readOnly: true order: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true required: - id - order OrderLineCreateUpdateRequest: type: object description: Shared price fields for the OrderLine serializer family. properties: order: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true required: - order OrderLineDetail: type: object description: Shared price fields for the OrderLine serializer family. properties: id: type: integer readOnly: true order: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true required: - id - order OrderLineNested: type: object description: Shared price fields for the OrderLine serializer family. properties: id: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true amount: type: integer maximum: 2147483647 minimum: -2147483648 price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true OrderLineNestedRequest: type: object description: Shared price fields for the OrderLine serializer family. properties: id: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true amount: type: integer maximum: 2147483647 minimum: -2147483648 price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true OrderLineRequest: type: object description: Shared price fields for the OrderLine serializer family. properties: product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true maintenance_contract: type: integer nullable: true org_orderline_pk: type: integer maximum: 2147483647 minimum: 0 nullable: true org_member: type: integer nullable: true OrderMinimal: type: object description: |- Overrides to_representation to localise start_date and end_date via the tenant's date_format setting. Set ``format_times = True`` on a subclass to also localise start_time and end_time. The localised fields are planned wall-clock values at the tenant, not absolute instants - the schema descriptions on the read side say so (see BaseOrderReadSerializer ISO twins for the machine-readable form). properties: id: type: integer readOnly: true uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_time: type: string format: time nullable: true end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 branch: type: integer nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. total_price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ last_update: type: string format: date-time readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - end_date - id - last_status - last_status_date - last_status_full - order_date - order_name - start_date - statuscode_id - text_color OrderMinimalSerializerCounts: type: object description: |- Overrides to_representation to localise start_date and end_date via the tenant's date_format setting. Set ``format_times = True`` on a subclass to also localise start_time and end_time. The localised fields are planned wall-clock values at the tenant, not absolute instants - the schema descriptions on the read side say so (see BaseOrderReadSerializer ISO twins for the machine-readable form). properties: id: type: integer readOnly: true uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_time: type: string format: time nullable: true end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 available_count: type: integer nullable: true readOnly: true assigned_count: type: integer readOnly: true last_update: type: string format: date-time readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - assigned_count - available_count - color - created - end_date - id - last_status - last_status_date - last_status_full - last_update - order_date - order_name - start_date - statuscode_id - text_color OrderRequest: type: object description: Main Order serializer for list views with all standard fields. properties: uuid: type: string format: uuid customer_id: type: string nullable: true maxLength: 100 order_id: type: string minLength: 1 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string nullable: true maxLength: 30 customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true total_price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_relation: type: integer nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 customer_order_accepted: type: boolean branch: type: integer nullable: true quotation: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 required: - end_date - order_name - start_date OrderSeedQuotation: type: object properties: id: type: integer customer_relation: type: integer nullable: true quotation_reference: type: string nullable: true required: - customer_relation - id - quotation_reference OrderSeedResponse: type: object properties: branch: allOf: - $ref: '#/components/schemas/Branch' nullable: true customer: allOf: - $ref: '#/components/schemas/Customer' nullable: true quotation: allOf: - $ref: '#/components/schemas/OrderSeedQuotation' nullable: true equipment: type: array items: $ref: '#/components/schemas/Equipment' required: - branch - customer - equipment - quotation OrderStatus: type: object properties: id: type: integer readOnly: true order: type: integer status: type: string maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - order - status OrderStatusFull: type: object properties: id: type: integer readOnly: true order_id: type: string readOnly: true order_name: type: string readOnly: true status: type: string maxLength: 255 status_full: type: string readOnly: true modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - order_id - order_name - status - status_full OrderStatusRequest: type: object properties: order: type: integer status: type: string minLength: 1 maxLength: 255 required: - order - status OrderTypesByPeriodData: type: object description: |- Counts per order type within each period. `order_counts` is keyed by period - month number for the month endpoint, year for the year one - and each entry is keyed by order type. `order_types` lists the types that appeared, so a caller can lay out columns without walking every period. properties: total: type: integer order_counts: type: object additionalProperties: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc order_types: type: array items: type: string required: - order_counts - order_types - total OrderTypesMonthStatsResponse: type: object description: The `order_types_month_stats` endpoint. properties: order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' required: - order_types_month_stats OrderTypesStatsData: type: object description: Counts per order type, over the whole range. properties: total: type: integer order_types: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc required: - order_types - total OrderTypesStatsResponse: type: object description: The `order_types_stats` endpoint. properties: order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' required: - order_types_stats OrderUpdate: type: object description: Full update serializer with customer_relation. properties: id: type: integer readOnly: true customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true customer_relation: type: integer nullable: true order_email_extra: type: array items: type: string format: email planning_remarks: type: string nullable: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNested' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNested' required: - color - id - last_status - last_status_date - last_status_full - order_date - order_id - statuscode_id - text_color OrderUpdateCustomer: type: object description: Customer update serializer without customer_relation. properties: id: type: integer readOnly: true customer_reference: type: string nullable: true maxLength: 255 order_id: type: string readOnly: true order_reference: type: string nullable: true maxLength: 255 order_type: type: string description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true order_date: type: string readOnly: true remarks: type: string nullable: true order_name: type: string maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true order_email_extra: type: array items: type: string format: email planning_remarks: type: string nullable: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNested' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNested' required: - color - id - last_status - last_status_date - last_status_full - order_date - order_id - statuscode_id - text_color OrderUpdateVariant: anyOf: - $ref: '#/components/schemas/OrderUpdate' - $ref: '#/components/schemas/OrderUpdateCustomer' OrderlineEquipmentWorkorder: type: object properties: equipment: allOf: - $ref: '#/components/schemas/EquipmentOrderLine' nullable: true readOnly: true order: $ref: '#/components/schemas/WorkorderOrder' location: allOf: - $ref: '#/components/schemas/LocationOrderLine' nullable: true readOnly: true required: - equipment - location - order OverviewStats: type: object description: |- The dict MemberViewset.overview_stats returns. `widgets` stays an open map on purpose: every widget registered on DashboardStatsBuilder carries its own shape, so a fixed schema would go stale with the next tile. `errors` names the widgets that raised. properties: widgets: type: object additionalProperties: true errors: type: array items: type: string required: - errors - widgets PaginatedActionList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Action' PaginatedActivityList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Activity' PaginatedApiUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ApiUser' PaginatedAssignedOrderActivityList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderActivity' PaginatedAssignedOrderAppViewList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderAppView' PaginatedAssignedOrderDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderDocument' PaginatedAssignedOrderList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrder' PaginatedAssignedOrderMaterialList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderMaterial' PaginatedAssignedOrderViewList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderView' PaginatedAssignedOrderWorkOrderList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AssignedOrderWorkOrder' PaginatedBranchList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Branch' PaginatedBudgetList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Budget' PaginatedBuildingList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Building' PaginatedChapterList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Chapter' PaginatedContractList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Contract' PaginatedCustomerDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/CustomerDocument' PaginatedCustomerList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Customer' PaginatedCustomerUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/CustomerUser' PaginatedEmployeeUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EmployeeUser' PaginatedEngineerEventList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EngineerEvent' PaginatedEngineerEventTypeList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EngineerEventType' PaginatedEngineerInfoLineList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EngineerInfoLine' PaginatedEngineerList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Engineer' PaginatedEquipmentDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EquipmentDocument' PaginatedEquipmentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Equipment' PaginatedEquipmentStateList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EquipmentState' PaginatedImportList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Import' PaginatedInvoiceEmailList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InvoiceEmail' PaginatedInvoiceLineList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InvoiceLine' PaginatedInvoiceList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Invoice' PaginatedInvoicePreliminaryResponseList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InvoicePreliminaryResponse' PaginatedLeaveTypeList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/LeaveType' PaginatedLocationDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/LocationDocument' PaginatedLocationList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Location' PaginatedMaintenanceContractList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MaintenanceContract' PaginatedMaintenanceEquipmentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MaintenanceEquipment' PaginatedMaterialList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Material' PaginatedMemberList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Member' PaginatedMinimalMemberList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MinimalMember' PaginatedModuleList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Module' PaginatedModulePartList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ModulePart' PaginatedOfferList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Offer' PaginatedOrderCostList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderCost' PaginatedOrderCustomerHistoryList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderCustomerHistory' PaginatedOrderDispatchList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderDispatch' PaginatedOrderDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderDocument' PaginatedOrderFilterList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderFilter' PaginatedOrderLineDetailList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderLineDetail' PaginatedOrderList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Order' PaginatedOrderMinimalSerializerCountsList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderMinimalSerializerCounts' PaginatedOrderStatusFullList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/OrderStatusFull' PaginatedPartnerDetailList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PartnerDetail' PaginatedPartnerRequestList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PartnerRequest' PaginatedPictureList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Picture' PaginatedPicturePublicList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PicturePublic' PaginatedPlanningUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PlanningUser' PaginatedProductCategoryList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ProductCategory' PaginatedProjectList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Project' PaginatedPurchaseList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Purchase' PaginatedPurchaseOrderEntryList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PurchaseOrderEntry' PaginatedPurchaseOrderListList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PurchaseOrderList' PaginatedPurchaseOrderMaterialList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PurchaseOrderMaterial' PaginatedPurchaseOrderStatusList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PurchaseOrderStatus' PaginatedQuotationCostList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationCost' PaginatedQuotationDocumentList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationDocument' PaginatedQuotationImageList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationImage' PaginatedQuotationLineImageList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationLineImage' PaginatedQuotationLineList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationLine' PaginatedQuotationList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Quotation' PaginatedQuotationPreliminaryResponseList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/QuotationPreliminaryResponse' PaginatedSalesUserCustomerExpandedList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/SalesUserCustomerExpanded' PaginatedSalesUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/SalesUser' PaginatedStatuscodeList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Statuscode' PaginatedStockLocationList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/StockLocation' PaginatedStockMutationSimpleList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/StockMutationSimple' PaginatedStudentUserList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/StudentUser' PaginatedSupplierList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Supplier' PaginatedSupplierReservationList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/SupplierReservation' PaginatedSupplierReservationMaterialList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/SupplierReservationMaterial' PaginatedTaxRateList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/TaxRate' PaginatedTemplateList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Template' PaginatedTripList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Trip' PaginatedTripOrderList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/TripOrder' PaginatedTripStatuscodeActionList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/TripStatuscodeAction' PaginatedTripStatuscodeList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/TripStatuscode' PaginatedUserLeaveHoursList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/UserLeaveHours' PaginatedUserOrderAvailabilityList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/UserOrderAvailability' PaginatedUserSickLeaveList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/UserSickLeave' PaginatedUserTripAvailabilityList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/UserTripAvailability' PaginatedUserWorkHoursList: type: object properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/UserWorkHours' ParentOrderData: type: object description: |- Documents the dict Order.get_parent_order_data returns, as surfaced by OrderDetailSerializer.get_parent_order_data. Order.get_parent_order_data can also return {} (order not copied, or its partner cannot be found), so every field is effectively optional on the wire. properties: companycode: type: string order_id: type: string PartnerBranchCreateFromCustomer: type: object description: The dict PartnerViewset.branch_create_from_customer returns. properties: branch: $ref: '#/components/schemas/Branch' required: - branch PartnerBranches: type: object description: The dict PartnerViewset.branches returns. properties: branches: type: array items: $ref: '#/components/schemas/Branch' required: - branches PartnerCopyCustomerOrders: type: object description: The dict PartnerViewset.copy_customer_orders returns. properties: num_copied: type: integer required: - num_copied PartnerCustomerIdRequest: type: object description: |- The request body branch_create_from_customer/copy_customer_orders read. Named without a Request suffix: COMPONENT_SPLIT_REQUEST appends one, so the component reads PartnerCustomerIdRequest. properties: customer_id: type: integer required: - customer_id PartnerDetail: type: object properties: id: type: integer readOnly: true partner: type: integer nullable: true partner_view: allOf: - $ref: '#/components/schemas/MinimalMember' readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - partner_view PartnerDetailRequest: type: object properties: partner: type: integer nullable: true PartnerRequest: type: object properties: id: type: integer readOnly: true from_member: type: integer nullable: true to_member: type: integer status: $ref: '#/components/schemas/PartnerRequestStatusEnum' created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. to_member_view: allOf: - $ref: '#/components/schemas/MinimalMember' readOnly: true from_member_view: allOf: - $ref: '#/components/schemas/MinimalMember' readOnly: true required: - created - from_member - from_member_view - id - modified - to_member - to_member_view PartnerRequestRequest: type: object properties: from_member: type: integer nullable: true to_member: type: integer status: $ref: '#/components/schemas/PartnerRequestStatusEnum' required: - from_member - to_member PartnerRequestStatusEnum: enum: - requested - accepted - rejected type: string description: |- * `requested` - requested * `accepted` - accepted * `rejected` - rejected PartnerSelect: type: object description: |- The rows MemberViewset.get_for_partner_select returns. Not an AutocompleteRowSerializer: the picker shows the city alongside the label rather than folding it in, and there is no `value` key at all. properties: id: type: integer name: type: string readOnly: true city: type: string nullable: true required: - city - id - name PatchedActionRequest: type: object properties: name: type: string minLength: 1 maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/ActionTypeEnum' company_partner: type: integer nullable: true json_conditions: type: array items: $ref: '#/components/schemas/ActionConditionRequest' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer override_status: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true maxLength: 255 PatchedActivityRequest: type: object properties: text: type: string minLength: 1 PatchedApiUserRequest: type: object properties: username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 password: type: string writeOnly: true minLength: 1 maxLength: 128 api_user: $ref: '#/components/schemas/PatchedApiUserSubRequest' PatchedApiUserSubRequest: type: object properties: name: type: string minLength: 1 maxLength: 80 expire_start_dt: type: string format: date expire_in_days: type: integer maximum: 2147483647 minimum: 0 PatchedAppUserSettingsRequest: type: object properties: settings: type: object additionalProperties: true description: The user’s app settings bag. Keys and value shapes belong to the frontend. PatchedAssignedOrderActivityRequest: type: object properties: user: type: integer nullable: true assigned_order: type: integer work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true unforeseen_work_duration: type: string nullable: true unforeseen_work_description: type: string nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 activity_date: type: string format: date extra_work: type: string nullable: true extra_work_description: type: string nullable: true distance_fixed_rate_amount: type: integer maximum: 2147483647 minimum: 0 actual_work: type: string format: time nullable: true PatchedAssignedOrderDatesRequest: type: object properties: alt_start_date: type: string format: date nullable: true alt_start_time: type: string format: time nullable: true alt_end_date: type: string format: date nullable: true alt_end_time: type: string format: time nullable: true PatchedAssignedOrderDocumentRequest: type: object properties: assigned_order: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true document: type: string format: byte PatchedAssignedOrderMaterialRequest: type: object properties: assigned_order: type: integer material: type: integer nullable: true location: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 is_extra: type: boolean PatchedAssignedOrderRequest: type: object properties: engineer: type: integer nullable: true student_user: type: integer nullable: true order: type: integer started: type: string format: date-time nullable: true ended: type: string format: date-time nullable: true rating: type: integer maximum: 32767 minimum: 0 customer: description: the order's CustomerSerializer payload when it has a customer_relation; {} when it has none - both branches occur. type: object additionalProperties: true PatchedAssignedOrderWorkOrderRequest: type: object properties: assigned_order: type: integer signature_user: type: string format: byte nullable: true signature_name_user: type: string nullable: true maxLength: 255 signature_engineer: type: string format: byte signature_name_engineer: type: string nullable: true maxLength: 255 signature_customer: type: string format: byte signature_name_customer: type: string nullable: true maxLength: 255 description_work: type: string nullable: true assigned_order_workorder_id: type: string minLength: 1 customer_emails: type: string nullable: true equipment: type: string nullable: true PatchedBranchRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 20 city: type: string minLength: 1 maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true PatchedBudgetRequest: type: object properties: year: type: integer maximum: 2147483647 minimum: 0 amount: type: string format: decimal pattern: ^-?\d{0,20}(?:\.\d{0,2})?$ PatchedBuildingRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 customer: type: integer nullable: true branch: type: integer nullable: true PatchedChapterRequest: type: object properties: quotation: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true PatchedContractRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 module_paths: type: array items: $ref: '#/components/schemas/ModulePathRequest' max_users: type: integer maximum: 2147483647 minimum: 0 PatchedCustomerDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true file: type: string format: byte user_can_view: type: boolean PatchedCustomerRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 20 city: type: string minLength: 1 maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 email: type: string nullable: true contact: type: string nullable: true mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 100 time: type: string format: time nullable: true time2: type: string format: time nullable: true timealt: type: string format: time nullable: true timealt2: type: string format: time nullable: true remarks: type: string nullable: true customer_id: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 products_without_tax: type: boolean maintenance_contract: type: string nullable: true standard_hours_hour: type: integer maximum: 2147483647 minimum: 0 standard_hours_minute: type: integer maximum: 2147483647 minimum: 0 branch_id: type: integer maximum: 2147483647 minimum: 0 nullable: true branch_partner: type: integer nullable: true use_branch_address: type: boolean PatchedCustomerUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 customer_user: $ref: '#/components/schemas/PatchedCustomerUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedCustomerUserSubRequest: type: object properties: customer: type: integer nullable: true settings_group: type: string nullable: true maxLength: 100 PatchedDepartmentRequest: type: object properties: department_uuid: type: string minLength: 1 maxLength: 40 department_name: type: string minLength: 1 maxLength: 255 PatchedEmployeeUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 password: type: string writeOnly: true minLength: 1 maxLength: 128 employee_user: $ref: '#/components/schemas/PatchedEmployeeUserSubRequest' last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedEmployeeUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ branch: type: integer nullable: true PatchedEnabledRequest: type: object properties: api_enabled: type: boolean PatchedEngineerEventAttachOrderRequest: type: object description: |- The body EngineerEventUpdate.update reads: the assigned order id to attach to the event. A bare integer field rather than a PrimaryKeyRelatedField: the view reads the key straight off request.data and never validates it through a serializer, so a queryset here would only be documentation. Declared outright rather than derived from EngineerEventSerializer, whose `assigned_order` is a read-only method field answering the nested row. properties: assigned_order: type: integer PatchedEngineerEventTypeRequest: type: object properties: event_type: type: string minLength: 1 maxLength: 255 measure_last_event_type: type: string nullable: true maxLength: 255 statuscode: type: integer nullable: true PatchedEngineerInfoLineRequest: type: object properties: order: type: integer info: type: string nullable: true PatchedEngineerRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 engineer: $ref: '#/components/schemas/PatchedEngineerSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedEngineerSubRequest: type: object properties: address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 email_tablet: type: string format: email nullable: true maxLength: 150 passport: type: string nullable: true maxLength: 100 vca: type: string nullable: true maxLength: 100 cost_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true license_plate: type: string nullable: true maxLength: 20 inspection_date_car: type: string format: date nullable: true cost_price_car: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true inspection_date_tools: type: string format: date nullable: true cost_price_tools: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true remarks: type: string nullable: true contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true uses_time_registration: type: boolean preferred_location: type: integer hide_from_dispatch: type: boolean PatchedEquipmentDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: equipment: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte PatchedEquipmentRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 type: $ref: '#/components/schemas/EquipmentTypeEnum' uuid: type: string format: uuid customer: type: integer nullable: true branch: type: integer nullable: true location: type: integer nullable: true brand: type: string nullable: true maxLength: 100 identifier: type: string nullable: true maxLength: 100 description: type: string nullable: true installation_date: type: string format: date nullable: true production_date: type: string format: date nullable: true serialnumber: type: string nullable: true maxLength: 255 standard_hours: type: string nullable: true maxLength: 255 default_replace_months: type: integer maximum: 2147483647 minimum: 0 price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedGrippSettingsRequest: type: object description: The Gripp connector settings; the secrets are write-only. properties: gripp_api_enabled: type: boolean gripp_api_key: type: string writeOnly: true nullable: true gripp_webhook_password: type: string writeOnly: true gripp_default_order_type: type: string gripp_default_employee: type: string gripp_project_phase_match: type: string gripp_project_phase_workorder_signed: type: string gripp_tasktype_hours: type: string gripp_tasktype_travel: type: string PatchedImportRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 file: type: string format: byte mapping: type: object additionalProperties: true description: How import columns map onto model fields, as the import wizard left it. filter_on: type: array items: {} description: What the wizard filtered the source rows on. result_inserts: type: object additionalProperties: type: integer description: How many rows were inserted, per model type. PatchedInvoiceEmailRequest: type: object properties: invoice: type: integer recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true PatchedInvoiceLineRequest: type: object properties: invoice: type: integer description: type: string nullable: true maxLength: 255 amount: type: string minLength: 1 maxLength: 150 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedInvoiceRequest: type: object properties: invoice_id: type: string minLength: 1 maxLength: 60 uuid: type: string format: uuid order: type: integer reference: type: string nullable: true maxLength: 120 created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 description: type: string nullable: true maxLength: 255 term_of_payment_days: type: integer maximum: 2147483647 minimum: 0 vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ preliminary: type: boolean invoice_email: type: string nullable: true invoice_pdf_path: type: string nullable: true maxLength: 255 invoice_pdf_from_docx_filename: type: string nullable: true maxLength: 255 PatchedInvoiceTemplateRequest: type: object properties: invoice_template_uuid: type: string minLength: 1 maxLength: 40 invoice_template_name: type: string minLength: 1 maxLength: 255 PatchedLeaveTypeRequest: type: object properties: name: type: string minLength: 1 maxLength: 150 counts_as_leave: type: boolean PatchedLocationDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: location: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte PatchedLocationRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 customer: type: integer nullable: true branch: type: integer nullable: true building: type: integer nullable: true PatchedMaintenanceContractRequest: type: object properties: customer: type: integer name: type: string minLength: 1 maxLength: 255 remarks: type: string nullable: true PatchedMaintenanceEquipmentRequest: type: object properties: contract: type: integer nullable: true equipment: type: integer equipment_name: type: string minLength: 1 maxLength: 255 times_per_year: type: integer maximum: 2147483647 minimum: 1 remarks: type: string nullable: true tariff: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedMaterialRequest: type: object properties: identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 name_short: type: string nullable: true maxLength: 255 unit: type: string nullable: true maxLength: 100 supplier: type: string nullable: true maxLength: 100 supplier_relation: type: integer nullable: true product_type: type: string nullable: true maxLength: 100 price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ external_identifier: type: string nullable: true maxLength: 100 price_purchase_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling_alt_ex: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true location: type: string nullable: true maxLength: 100 PatchedMemberRequest: type: object properties: companycode: type: string minLength: 2 maxLength: 30 name: type: string minLength: 1 maxLength: 255 address: type: string minLength: 1 maxLength: 255 tel: type: string minLength: 1 maxLength: 25 fax: type: string nullable: true maxLength: 25 www: type: string format: uri minLength: 1 maxLength: 255 postal: type: string minLength: 1 maxLength: 10 city: type: string minLength: 1 maxLength: 120 country_code: type: string minLength: 1 maxLength: 2 email: type: string format: email minLength: 1 maxLength: 255 contract: type: integer nullable: true contacts: type: string minLength: 1 is_deleted: type: boolean member_type: $ref: '#/components/schemas/MemberTypeEnum' companylogo: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true companylogo_workorder: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true activities: type: string minLength: 1 info: type: string minLength: 1 is_public: type: boolean has_api_users: type: boolean has_branches: type: boolean chamber_of_commerce: type: string nullable: true maxLength: 100 vat_number: type: string nullable: true maxLength: 100 deep_link: type: string nullable: true maxLength: 255 equipment_qr_type: $ref: '#/components/schemas/EquipmentQrTypeEnum' is_requested: type: boolean has_mobile_activity_user_select: type: boolean PatchedMemberSettingsRequest: type: object description: The tenant settings the web settings screen edits, typed. properties: countries: type: array items: type: string minLength: 1 maxLength: 2 date_format: type: string minLength: 1 maxLength: 50 default_currency: type: string minLength: 1 maxLength: 3 invoice_default_vat: type: integer invoice_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ invoice_default_term_of_payment_days: type: integer quotation_default_expire_days: type: integer quotation_default_call_out_costs: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_vat: type: integer quotation_default_hourly_rate: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_default_price_per_km: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ customer_id_autoincrement: type: boolean order_uses_equipment: type: boolean sick_leave_user_allowed_create: type: boolean sick_leave_user_allowed_end: type: boolean equipment_planning_quick_create: type: boolean equipment_quick_create: type: boolean equipment_location_planning_quick_create: type: boolean equipment_location_quick_create: type: boolean order_list_include_reference: type: boolean workorder_show_related_orders: type: boolean break_calculation: type: boolean customer_id_start: type: integer order_id: type: integer quotation_id: type: integer workorder_id: type: integer purchase_order_id: type: integer invoice_id: type: integer order_types: type: array items: type: string minLength: 1 break_calculation_after_minutes: type: integer break_calculation_duration_minutes: type: integer app_session_token_expiry_days: type: integer PatchedModulePartRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 module: type: integer is_always_selected: type: boolean PatchedModuleRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 PatchedOfferRequest: type: object properties: quotation: type: integer recipients: type: string nullable: true subject: type: string nullable: true maxLength: 255 body: type: string nullable: true is_sent: type: boolean sent_date: type: string format: date nullable: true PatchedOrderCostRequest: type: object properties: order: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true user_full_name: type: string nullable: true maxLength: 150 material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedOrderDocumentRequest: type: object description: |- Base serializer for document models with filename and url computed fields. Subclasses only need to set: - model (on Meta) - base_field (the FK field name on Meta.fields that points to the parent) - Any extra_fields (additional fields on Meta.fields beyond the defaults) properties: order: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte PatchedOrderFilterRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 json_conditions: type: array items: $ref: '#/components/schemas/FilterConditionRequest' querymode: $ref: '#/components/schemas/QuerymodeEnum' base_filter: type: string minLength: 1 maxLength: 255 PatchedOrderLineDetailRequest: type: object description: Shared price fields for the OrderLine serializer family. properties: order: type: integer product: type: string nullable: true maxLength: 255 location: type: string nullable: true maxLength: 255 remarks: type: string nullable: true price_purchase: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_selling: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ amount: type: integer maximum: 2147483647 minimum: -2147483648 material_relation: type: integer nullable: true location_relation_inventory: type: integer nullable: true purchase_order_material: type: integer nullable: true maintenance_contract: type: integer nullable: true equipment: type: integer nullable: true equipment_location: type: integer nullable: true PatchedOrderUpdateCustomerRequest: type: object description: Customer update serializer without customer_relation. properties: customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' PatchedOrderUpdateRequest: type: object description: Full update serializer with customer_relation. properties: customer_id: type: string nullable: true maxLength: 100 customer_reference: type: string nullable: true maxLength: 255 order_reference: type: string nullable: true maxLength: 255 order_type: type: string customer_remarks: type: string nullable: true description: type: string nullable: true start_date: type: string format: date start_time: type: string format: time nullable: true end_date: type: string format: date end_time: type: string format: time nullable: true remarks: type: string nullable: true external_identifier: type: string nullable: true maxLength: 100 order_name: type: string minLength: 1 maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string minLength: 1 maxLength: 2 nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_email: type: string nullable: true order_contact: type: string nullable: true customer_relation: type: integer nullable: true order_email_extra: type: array items: type: string format: email minLength: 1 planning_remarks: type: string nullable: true orderlines: type: array items: $ref: '#/components/schemas/OrderLineNestedRequest' infolines: type: array items: $ref: '#/components/schemas/EngineerInfoLineNestedRequest' PatchedOrderUpdateVariantRequest: anyOf: - $ref: '#/components/schemas/PatchedOrderUpdateRequest' - $ref: '#/components/schemas/PatchedOrderUpdateCustomerRequest' PatchedPartnerDetailRequest: type: object properties: partner: type: integer nullable: true PatchedPartnerRequestRequest: type: object properties: from_member: type: integer nullable: true to_member: type: integer status: $ref: '#/components/schemas/PartnerRequestStatusEnum' PatchedPictureRequest: type: object properties: picture: type: string format: byte name: type: string minLength: 1 maxLength: 255 PatchedPlanningUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 planning_user: $ref: '#/components/schemas/PatchedPlanningUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedPlanningUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedProductCategoryJsonRequest: type: object properties: product_category_uuid: type: string minLength: 1 maxLength: 40 PatchedProjectRequest: type: object properties: name: type: string minLength: 1 maxLength: 150 PatchedPurchaseOrderEntryRequest: type: object properties: purchase_order: type: integer nullable: true purchase_order_material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 entry_date: type: string format: date nullable: true stock_location: type: integer nullable: true PatchedPurchaseOrderListRequest: type: object properties: uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string minLength: 1 supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string format: date nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true PatchedPurchaseOrderMaterialRequest: type: object properties: material: type: integer material_name: type: string nullable: true maxLength: 255 purchase_order: type: integer nullable: true amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 PatchedPurchaseOrderStatusRequest: type: object properties: purchase_order: type: integer status: type: string minLength: 1 maxLength: 255 PatchedPurchaseOrderWithMaterialsUpdateRequest: type: object description: |- PATCH .../purchaseorder/{id}/with-materials/ body: the same fields as PurchaseOrderDetailSerializer plus `materials` as a replace-set (see `_replace_materials`). Reuses PurchaseOrderDetailSerializer.update (status transition) for the PurchaseOrder row itself. properties: uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string minLength: 1 supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string format: date nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true materials: type: array items: $ref: '#/components/schemas/PurchaseOrderMaterialRowRequest' PatchedPurchaseRequest: type: object properties: order: type: integer reference: type: string nullable: true maxLength: 120 description: type: string nullable: true maxLength: 255 vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedQuotationCostRequest: type: object properties: quotation: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ chapter: type: integer nullable: true PatchedQuotationDocumentRequest: type: object properties: quotation: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte PatchedQuotationImageRequest: type: object properties: quotation: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true PatchedQuotationLineImageRequest: type: object properties: quotation_line: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true PatchedQuotationLineRequest: type: object properties: quotation: type: integer chapter: type: integer nullable: true old_material: type: string nullable: true maxLength: 255 material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 material: type: integer nullable: true amount: type: string minLength: 1 maxLength: 150 location: type: string nullable: true maxLength: 255 info: type: string nullable: true extra_description: type: string nullable: true vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ cost_type: type: string nullable: true maxLength: 255 price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedQuotationRequest: type: object properties: uuid: type: string format: uuid quotation_id: type: string minLength: 1 maxLength: 50 quotation_type: type: string nullable: true maxLength: 30 name: type: string nullable: true maxLength: 255 quotation_name: type: string nullable: true maxLength: 255 quotation_address: type: string nullable: true maxLength: 255 quotation_postal: type: string nullable: true maxLength: 20 quotation_city: type: string nullable: true maxLength: 255 quotation_country_code: type: string nullable: true maxLength: 2 quotation_po_box: type: string nullable: true maxLength: 100 quotation_email: type: string format: email nullable: true maxLength: 180 quotation_tel: type: string nullable: true maxLength: 100 quotation_mobile: type: string nullable: true maxLength: 100 quotation_contact: type: string nullable: true quotation_reference: type: string nullable: true maxLength: 100 description: type: string nullable: true signature_engineer: type: string format: byte nullable: true signature_customer: type: string format: byte nullable: true signature_name_engineer: type: string nullable: true maxLength: 255 signature_name_customer: type: string nullable: true maxLength: 255 customer_id: type: string nullable: true maxLength: 100 customer_relation: type: integer nullable: true preliminary: type: boolean accepted: type: boolean vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_expire_days: type: integer maximum: 2147483647 minimum: 0 definitive_date: type: string format: date nullable: true definitive_pdf_filename: type: string nullable: true maxLength: 255 PatchedSalesUserCustomerExpandedRequest: type: object properties: user: type: integer nullable: true customer: type: integer PatchedSalesUserCustomerRequest: type: object properties: user: type: integer nullable: true customer: type: integer PatchedSalesUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 sales_user: $ref: '#/components/schemas/PatchedSalesUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedSalesUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedStatuscodeRequest: type: object properties: code_type: $ref: '#/components/schemas/CodeTypeEnum' statuscode: type: string minLength: 1 maxLength: 255 color: type: string minLength: 1 maxLength: 7 description: type: string nullable: true minLength: 1 start_order: type: boolean end_order: type: boolean after_end_order: type: boolean new_status_template: type: string nullable: true minLength: 1 maxLength: 255 text_color: type: string nullable: true minLength: 1 maxLength: 7 color_for_assignedorders: type: boolean can_be_reassigned_after_end: type: boolean as_filter: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true minLength: 1 maxLength: 255 roles: type: array items: type: string minLength: 1 PatchedStockLocationRequest: type: object properties: identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 show_in_stats: type: boolean external_identifier: type: string nullable: true maxLength: 100 PatchedStudentSubWriteRequest: type: object properties: street: type: string nullable: true maxLength: 255 house_number: type: string nullable: true maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 remarks: type: string nullable: true picture: type: string format: byte info: type: string lon: type: number format: double nullable: true lat: type: number format: double nullable: true iban: type: string minLength: 1 maxLength: 34 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 gender: type: string nullable: true maxLength: 1 dob: type: string format: date nullable: true drivers_licence: type: string nullable: true maxLength: 3 drivers_licence_type: type: string nullable: true maxLength: 20 box_truck: type: string nullable: true maxLength: 3 bsn: type: string nullable: true maxLength: 10 first_time_profile: type: boolean uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ PatchedStudentUserWriteRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 student_user: $ref: '#/components/schemas/PatchedStudentSubWriteRequest' username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 is_active: type: boolean title: Active description: Designates whether this user should be treated as active. Unselect this instead of deleting accounts. password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 PatchedSupplierRequest: type: object properties: name: type: string nullable: true maxLength: 255 address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 email: type: string nullable: true maxLength: 150 contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 remarks: type: string nullable: true identifier: type: string nullable: true maxLength: 100 PatchedSupplierReservationMaterialRequest: type: object properties: reservation: type: integer material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 PatchedSupplierReservationRequest: type: object properties: supplier: type: integer PatchedSupplierReservationWithMaterialsRequest: type: object description: |- Body for both .../supplier-reservation/with-materials/ (create) and .../supplier-reservation/{id}/with-materials/ (update): the reservation's own fields plus `materials`. On create every row is inserted; on update `materials` is a replace-set (see `_replace_reservation_materials`). properties: supplier: type: integer materials: type: array items: $ref: '#/components/schemas/SupplierReservationMaterialRowRequest' PatchedTemplateRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true file: type: string format: byte template_type: $ref: '#/components/schemas/TemplateTypeEnum' is_active: type: boolean PatchedTimeCorrectionRequest: type: object description: |- The request body TimeCorrectionViewset.update accepts. Every field is optional: the endpoint is reached by PATCH with whatever subset the caller is changing, and does nothing at all unless `work_correction` is among them. properties: source: type: string minLength: 1 work_correction: type: string minLength: 1 work_correction_by_user: type: integer notify_engineer: type: boolean PatchedTravelHoursProductRequest: type: object properties: travel_hours_product_uuid: type: string minLength: 1 maxLength: 40 travel_hours_product_name: type: string minLength: 1 maxLength: 255 travel_hours_product_purchase_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true travel_hours_product_purchase_price_currency: type: string nullable: true minLength: 1 maxLength: 4 travel_hours_product_selling_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true travel_hours_product_selling_price_currency: type: string nullable: true minLength: 1 maxLength: 4 PatchedTripOrderRequest: type: object properties: order: type: integer PatchedTripRequest: type: object properties: description: type: string nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 trip_orders: type: array items: $ref: '#/components/schemas/PatchedTripOrderRequest' start_date: type: string format: date nullable: true start_time: type: string format: time nullable: true end_date: type: string format: date nullable: true end_time: type: string format: time nullable: true start_location_from_first_order: type: boolean start_datetime_from_first_order: type: boolean start_name: type: string nullable: true maxLength: 255 start_address: type: string nullable: true maxLength: 255 start_postal: type: string nullable: true maxLength: 20 start_city: type: string nullable: true maxLength: 255 start_country_code: type: string nullable: true maxLength: 2 end_location_from_last_order: type: boolean end_datetime_from_last_order: type: boolean end_name: type: string nullable: true maxLength: 255 end_address: type: string nullable: true maxLength: 255 end_postal: type: string nullable: true maxLength: 20 end_city: type: string nullable: true maxLength: 255 end_country_code: type: string nullable: true maxLength: 2 PatchedTripStatuscodeActionRequest: type: object properties: name: type: string minLength: 1 maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/TripStatuscodeActionTypeEnum' json_conditions: type: array items: $ref: '#/components/schemas/ActionConditionRequest' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer title: Actions PatchedTripStatuscodeRequest: type: object properties: statuscode: type: string minLength: 1 maxLength: 255 color: type: string nullable: true maxLength: 7 description: type: string nullable: true is_regex: type: boolean start_trip: type: boolean nullable: true end_trip: type: boolean nullable: true new_status_template: type: string nullable: true maxLength: 255 PatchedUserLeaveHoursNoPlanningRequest: type: object properties: start_date: type: string format: date start_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true start_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true start_date_is_whole_day: type: boolean end_date: type: string format: date end_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true end_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true end_date_is_whole_day: type: boolean total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true actual_duration: type: string nullable: true leave_type: type: integer nullable: true description: type: string nullable: true PatchedUserLeaveHoursPlanningRequest: type: object properties: user: type: integer nullable: true start_date: type: string format: date start_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true start_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true start_date_is_whole_day: type: boolean end_date: type: string format: date end_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true end_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true end_date_is_whole_day: type: boolean total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_hours: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true contract_hours_used: type: integer maximum: 32767 minimum: 0 actual_duration: type: string nullable: true leave_type: type: integer nullable: true is_accepted: type: boolean is_rejected: type: boolean description: type: string nullable: true PatchedUserOrderAvailabilityRequest: type: object properties: is_accepted: type: boolean PatchedUserSickLeaveRequest: type: object properties: user: type: integer user_full_name: type: string nullable: true maxLength: 150 created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 start_date: type: string format: date end_date: type: string format: date nullable: true PatchedUserTripAvailabilityRequest: type: object properties: trip: type: integer is_accepted: type: boolean PatchedUserWorkHoursRequest: type: object properties: project: type: integer nullable: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 start_date: type: string format: date description: type: string nullable: true PatchedWorkHoursProductRequest: type: object properties: workhours_product_uuid: type: string minLength: 1 maxLength: 40 workhours_product_name: type: string minLength: 1 maxLength: 255 workhours_product_purchase_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true workhours_product_purchase_price_currency: type: string nullable: true minLength: 1 maxLength: 4 workhours_product_selling_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true workhours_product_selling_price_currency: type: string nullable: true minLength: 1 maxLength: 4 Picture: type: object properties: id: type: integer readOnly: true picture: type: string format: uri name: type: string maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - name PicturePublic: type: object properties: picture: type: string nullable: true readOnly: true name: type: string maxLength: 255 required: - name - picture PictureRequest: type: object properties: picture: type: string format: byte name: type: string minLength: 1 maxLength: 255 required: - name PlanningUser: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 planning_user: $ref: '#/components/schemas/PlanningUserSub' full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - first_name - full_name - id - last_name - planning_user - user_sick - username PlanningUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 planning_user: $ref: '#/components/schemas/PlanningUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - first_name - last_name - planning_user - username PlanningUserSub: type: object properties: uuid: type: string readOnly: true uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - uuid PlanningUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ Product: type: object properties: id: type: integer readOnly: true material: type: integer uuid: type: string format: uuid purchase_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ selling_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ tax_percentage: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - id - material - uuid ProductCategory: type: object properties: uuid: type: string format: uuid name: type: string required: - name - uuid ProductCategoryJson: type: object properties: product_category_uuid: type: string maxLength: 40 required: - product_category_uuid ProductFamilyEnum: enum: - default - shltr type: string description: |- * `default` - default * `shltr` - shltr ProductList: type: object properties: id: type: integer readOnly: true material: $ref: '#/components/schemas/Material' uuid: type: string format: uuid purchase_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ purchase_price_currency: type: string readOnly: true selling_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ selling_price_currency: type: string readOnly: true tax_percentage: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - id - material - purchase_price - purchase_price_currency - selling_price - selling_price_currency - uuid ProductRequest: type: object properties: material: type: integer uuid: type: string format: uuid purchase_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ selling_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ tax_percentage: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - material - uuid Profile: type: object description: |- What product a tenant is: the web client themes and gates on this. Instance is a Member. `modules` is the plain list of module names in the tenant's contract's module paths, empty when there is no contract. `module_parts` maps each of those modules to its enabled parts. properties: family: $ref: '#/components/schemas/ProductFamilyEnum' flavour: $ref: '#/components/schemas/MemberTypeEnum' modules: type: array items: type: string readOnly: true module_parts: type: object additionalProperties: type: array items: type: string readOnly: true required: - family - flavour - module_parts - modules Project: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 150 created: type: string format: date-time readOnly: true modified: type: string format: date-time readOnly: true required: - created - id - modified - name ProjectRequest: type: object properties: name: type: string minLength: 1 maxLength: 150 required: - name Purchase: type: object properties: id: type: integer readOnly: true order: type: integer reference: type: string nullable: true maxLength: 120 description: type: string nullable: true maxLength: 255 vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true created: type: string format: date-time readOnly: true required: - created - id - order - total_currency - vat_currency PurchaseOrderDetail: type: object properties: id: type: integer readOnly: true uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. expected_entry_date_iso: type: string format: date readOnly: true nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true reservation_materials: type: array items: $ref: '#/components/schemas/SupplierReservationMaterial' nullable: true readOnly: true materials: type: array items: $ref: '#/components/schemas/PurchaseOrderMaterial' readOnly: true statuses: type: array items: $ref: '#/components/schemas/PurchaseOrderStatus' readOnly: true entries: type: array items: $ref: '#/components/schemas/PurchaseOrderEntry' readOnly: true num_entries: type: integer readOnly: true num_materials: type: integer readOnly: true total_entries: oneOf: - type: integer - type: string nullable: true readOnly: true total_materials: oneOf: - type: integer - type: string nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - entries - expected_entry_date_iso - id - last_status - last_status_date - last_status_full - materials - modified - num_entries - num_materials - reservation_materials - statuscode_id - statuses - supplier - text_color - total_entries - total_materials PurchaseOrderEntry: type: object properties: id: type: integer readOnly: true purchase_order: type: integer nullable: true purchase_order_material: type: integer supplier: type: string readOnly: true order_id: type: string readOnly: true material_name: type: string readOnly: true amount: type: integer maximum: 2147483647 minimum: 0 entry_date: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. entry_date_iso: type: string format: date readOnly: true nullable: true stock_location: type: integer nullable: true stock_location_name: type: string readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - entry_date_iso - id - material_name - order_id - purchase_order_material - stock_location_name - supplier PurchaseOrderEntryRequest: type: object properties: purchase_order: type: integer nullable: true purchase_order_material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 entry_date: type: string format: date nullable: true stock_location: type: integer nullable: true required: - purchase_order_material PurchaseOrderList: type: object properties: id: type: integer readOnly: true uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. expected_entry_date_iso: type: string format: date readOnly: true nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true num_entries: type: integer readOnly: true num_materials: type: integer readOnly: true total_entries: oneOf: - type: integer - type: string nullable: true readOnly: true total_materials: oneOf: - type: integer - type: string nullable: true readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - expected_entry_date_iso - id - last_status - last_status_date - last_status_full - modified - num_entries - num_materials - statuscode_id - supplier - text_color - total_entries - total_materials PurchaseOrderListRequest: type: object properties: uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string minLength: 1 supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string format: date nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true required: - supplier PurchaseOrderMaterial: type: object properties: id: type: integer readOnly: true material: type: integer material_name: type: string nullable: true maxLength: 255 material_view: allOf: - $ref: '#/components/schemas/Material' readOnly: true purchase_order: type: integer nullable: true purchase_order_view: allOf: - $ref: '#/components/schemas/PurchaseOrderView' readOnly: true amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. num_entries: type: integer readOnly: true total_entries: oneOf: - type: integer - type: string nullable: true readOnly: true required: - id - material - material_view - modified - num_entries - purchase_order_view - total_entries PurchaseOrderMaterialRequest: type: object properties: material: type: integer material_name: type: string nullable: true maxLength: 255 purchase_order: type: integer nullable: true amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 required: - material PurchaseOrderMaterialRowRequest: type: object description: |- One row of a PurchaseOrder-with-materials nested create/replace-set. Same shape as PurchaseOrderMaterialSerializer (material, amount, remarks, ...) but `id` is writable and optional: present on a row -> update that stored PurchaseOrderMaterial, absent -> create a new one. `purchase_order` is optional here - the parent PurchaseOrder supplies it, not the row itself. properties: id: type: integer nullable: true material: type: integer material_name: type: string nullable: true maxLength: 255 purchase_order: type: integer nullable: true amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 required: - material PurchaseOrderStatus: type: object properties: id: type: integer readOnly: true purchase_order: type: integer status: type: string maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - purchase_order - status PurchaseOrderStatusRequest: type: object properties: purchase_order: type: integer status: type: string minLength: 1 maxLength: 255 required: - purchase_order - status PurchaseOrderView: type: object description: |- The dict PurchaseOrderMaterialSerializer.get_purchase_order_view builds. expected_entry_date goes through TransformDatesMixin.format_date, so it is a string in the tenant's configured date format rather than an ISO date. properties: purchase_order_id: type: string order_name: type: string nullable: true order_city: type: string nullable: true order_email: type: string nullable: true expected_entry_date: type: string nullable: true required: - expected_entry_date - order_city - order_email - order_name - purchase_order_id PurchaseOrderWithMaterialsCreateRequest: type: object description: |- POST .../purchaseorder/with-materials/ body: the same fields as PurchaseOrderListSerializer plus a `materials` list, created atomically. Reuses PurchaseOrderListSerializer.create (purchase_order_id assignment + initial status) for the PurchaseOrder row itself. properties: uuid: type: string format: uuid supplier: type: integer purchase_order_id: type: string minLength: 1 supplier_remarks: type: string nullable: true order_name: type: string nullable: true maxLength: 255 order_address: type: string nullable: true maxLength: 255 order_postal: type: string nullable: true maxLength: 20 order_po_box: type: string nullable: true maxLength: 100 order_city: type: string nullable: true maxLength: 255 order_country_code: type: string nullable: true maxLength: 2 order_email: type: string nullable: true order_tel: type: string nullable: true maxLength: 100 order_mobile: type: string nullable: true maxLength: 100 order_contact: type: string nullable: true expected_entry_date: type: string format: date nullable: true order_reference: type: string nullable: true maxLength: 120 description: type: string nullable: true supplier_reservation: type: integer nullable: true materials: type: array items: $ref: '#/components/schemas/PurchaseOrderMaterialRowRequest' required: - supplier PurchaseRequest: type: object properties: order: type: integer reference: type: string nullable: true maxLength: 120 description: type: string nullable: true maxLength: 255 vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - order PurchaseYear: type: object properties: month: type: integer total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - month QrCreateResponse: type: object description: The {qr_path, qr_url} dict the create_qr actions return. properties: qr_path: type: string qr_url: type: string required: - qr_path - qr_url QuerymodeEnum: enum: - and - or type: string description: |- * `and` - and * `or` - or Quotation: type: object properties: id: type: integer readOnly: true uuid: type: string format: uuid quotation_id: type: string maxLength: 50 quotation_type: type: string nullable: true maxLength: 30 name: type: string nullable: true maxLength: 255 quotation_name: type: string nullable: true maxLength: 255 quotation_address: type: string nullable: true maxLength: 255 quotation_postal: type: string nullable: true maxLength: 20 quotation_city: type: string nullable: true maxLength: 255 quotation_country_code: type: string nullable: true maxLength: 2 quotation_po_box: type: string nullable: true maxLength: 100 quotation_email: type: string format: email nullable: true maxLength: 180 quotation_tel: type: string nullable: true maxLength: 100 quotation_mobile: type: string nullable: true maxLength: 100 quotation_contact: type: string nullable: true quotation_reference: type: string nullable: true maxLength: 100 description: type: string nullable: true signature_engineer: type: string format: uri nullable: true signature_customer: type: string format: uri nullable: true signature_name_engineer: type: string nullable: true maxLength: 255 signature_name_customer: type: string nullable: true maxLength: 255 customer_id: type: string nullable: true maxLength: 100 customer_relation: type: integer nullable: true preliminary: type: boolean accepted: type: boolean vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. quotation_expire_days: type: integer maximum: 2147483647 minimum: 0 definitive_date: type: string format: date nullable: true definitive_pdf_filename: type: string nullable: true maxLength: 255 is_sent: type: boolean readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - id - is_sent - last_status - last_status_date - last_status_full - modified - statuscode_id - text_color - total_currency - vat_currency QuotationAutocompleteRow: type: object description: |- The rows QuotationViewset.autocomplete returns. A hand-built `{name, uuid}` pick-list row rather than a quotation: without it the action inherits the viewset's component and advertises a whole quotation where an array of two-string rows arrives. properties: name: type: string uuid: type: string required: - name - uuid QuotationCost: type: object properties: id: type: integer readOnly: true quotation: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true user_full_name: type: string nullable: true readOnly: true material: type: integer nullable: true material_name: type: string nullable: true readOnly: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true amount_duration_read: type: string nullable: true readOnly: true amount_duration_secs: type: number format: double nullable: true readOnly: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true chapter: type: integer nullable: true required: - amount_duration_read - amount_duration_secs - cost_type - id - material_name - price_currency - quotation - total_currency - user_full_name - vat_currency QuotationCostRequest: type: object properties: quotation: type: integer created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 cost_type: $ref: '#/components/schemas/CostTypeEnum' user: type: integer nullable: true material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ chapter: type: integer nullable: true required: - cost_type - quotation QuotationCostRowRequest: type: object properties: id: type: integer chapter: type: integer nullable: true user: type: integer nullable: true material: type: integer nullable: true amount_int: type: integer maximum: 2147483647 minimum: 0 nullable: true amount_decimal: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ nullable: true amount_duration: type: string nullable: true price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: $ref: '#/components/schemas/CurrencyEnum' vat_type: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: $ref: '#/components/schemas/CurrencyEnum' total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: $ref: '#/components/schemas/CurrencyEnum' QuotationDetail: type: object properties: id: type: integer readOnly: true uuid: type: string format: uuid quotation_id: type: string maxLength: 50 quotation_type: type: string nullable: true maxLength: 30 name: type: string nullable: true maxLength: 255 quotation_name: type: string nullable: true maxLength: 255 quotation_address: type: string nullable: true maxLength: 255 quotation_postal: type: string nullable: true maxLength: 20 quotation_city: type: string nullable: true maxLength: 255 quotation_country_code: type: string nullable: true maxLength: 2 quotation_po_box: type: string nullable: true maxLength: 100 quotation_email: type: string format: email nullable: true maxLength: 180 quotation_tel: type: string nullable: true maxLength: 100 quotation_mobile: type: string nullable: true maxLength: 100 quotation_contact: type: string nullable: true quotation_reference: type: string nullable: true maxLength: 100 description: type: string nullable: true signature_engineer: type: string format: uri nullable: true signature_customer: type: string format: uri nullable: true signature_name_engineer: type: string nullable: true maxLength: 255 signature_name_customer: type: string nullable: true maxLength: 255 customer_id: type: string nullable: true maxLength: 100 customer_relation: type: integer nullable: true preliminary: type: boolean accepted: type: boolean vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. quotation_expire_days: type: integer maximum: 2147483647 minimum: 0 statuses: type: array items: $ref: '#/components/schemas/QuotationStatus' readOnly: true definitive_date: type: string format: date nullable: true definitive_pdf_filename: type: string nullable: true maxLength: 255 is_sent: type: boolean readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - id - is_sent - last_status - last_status_date - last_status_full - modified - statuscode_id - statuses - text_color - total_currency - vat_currency QuotationDocument: type: object properties: id: type: integer readOnly: true quotation: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true url: type: string readOnly: true required: - created - filename - id - modified - quotation - url QuotationDocumentRequest: type: object properties: quotation: type: integer name: type: string nullable: true maxLength: 255 description: type: string nullable: true file: type: string format: byte required: - quotation QuotationImage: type: object properties: id: type: integer readOnly: true quotation: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true image_url: type: string nullable: true readOnly: true thumbnail_url: type: string nullable: true readOnly: true required: - id - image_url - quotation - thumbnail_url QuotationImageRequest: type: object properties: quotation: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true required: - quotation QuotationLine: type: object properties: id: type: integer readOnly: true quotation: type: integer chapter: type: integer nullable: true old_material: type: string nullable: true maxLength: 255 material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 material: type: integer nullable: true amount: type: string maxLength: 150 location: type: string nullable: true maxLength: 255 info: type: string nullable: true extra_description: type: string nullable: true vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ cost_type: type: string nullable: true maxLength: 255 price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: type: string readOnly: true vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string readOnly: true total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string readOnly: true required: - amount - id - price_currency - quotation - total_currency - vat_currency QuotationLineImage: type: object properties: id: type: integer readOnly: true quotation_line: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true image_url: type: string nullable: true readOnly: true thumbnail_url: type: string nullable: true readOnly: true required: - id - image_url - quotation_line - thumbnail_url QuotationLineImageRequest: type: object properties: quotation_line: type: integer image: type: string description: Base64 on the way in, a URL on the way out. Sending a data URI ("data:image/png;base64,...") or a bare base64 payload both store the image; reading the field back gives the stored file's URL. nullable: true description: type: string nullable: true required: - quotation_line QuotationLineMaterial: type: object properties: material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 material: type: integer nullable: true amount: type: string maxLength: 150 required: - amount QuotationLineRequest: type: object properties: quotation: type: integer chapter: type: integer nullable: true old_material: type: string nullable: true maxLength: 255 material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 material: type: integer nullable: true amount: type: string minLength: 1 maxLength: 150 location: type: string nullable: true maxLength: 255 info: type: string nullable: true extra_description: type: string nullable: true vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ cost_type: type: string nullable: true maxLength: 255 price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - amount - quotation QuotationLineRowRequest: type: object properties: id: type: integer old_material: type: string nullable: true maxLength: 255 material_name: type: string nullable: true maxLength: 255 material_identifier: type: string nullable: true maxLength: 255 material: type: integer nullable: true amount: type: string minLength: 1 maxLength: 150 location: type: string nullable: true maxLength: 255 info: type: string nullable: true extra_description: type: string nullable: true vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ cost_type: type: string nullable: true maxLength: 255 price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ price_currency: $ref: '#/components/schemas/CurrencyEnum' vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: $ref: '#/components/schemas/CurrencyEnum' total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: $ref: '#/components/schemas/CurrencyEnum' required: - amount QuotationPreliminaryResponse: type: object description: |- the row GET quotation/quotation/preliminary/ serves one quotation as. same story as the invoice twin: the action streams full quotations through qs_to_response with QuotationSerializer, while spectacular kept only the nine read-only/plainly-required fields in that component's required list - pk, created/modified, is_sent, both *_currency companions and the status trio - which is exactly what learned responses were once seen missing as a group. a modelserializer cannot short-change its own field set, so every key stays required here and only nullability (null=true columns, unset signatures/files) is declared. types match what quirk-for-quirk those very fields generate: decimal strings for vat_type/vat/total, email format on quotation_email, plain strings for created/modified because transformdatesmixin rewrites both into tenant display text before they hit the wire. properties: id: type: integer uuid: type: string format: uuid quotation_id: type: string quotation_type: type: string nullable: true name: type: string nullable: true quotation_name: type: string nullable: true quotation_address: type: string nullable: true quotation_postal: type: string nullable: true quotation_city: type: string nullable: true quotation_country_code: type: string nullable: true quotation_po_box: type: string nullable: true quotation_email: type: string format: email nullable: true quotation_tel: type: string nullable: true quotation_mobile: type: string nullable: true quotation_contact: type: string nullable: true quotation_reference: type: string nullable: true description: type: string nullable: true signature_engineer: type: string format: uri nullable: true signature_customer: type: string format: uri nullable: true signature_name_engineer: type: string nullable: true signature_name_customer: type: string nullable: true customer_id: type: string nullable: true customer_relation: type: integer nullable: true preliminary: type: boolean accepted: type: boolean vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ total_currency: type: string vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat_currency: type: string created: type: string modified: type: string quotation_expire_days: type: integer definitive_date: type: string format: date nullable: true definitive_pdf_filename: type: string nullable: true is_sent: type: boolean last_status: type: string last_status_full: type: string nullable: true last_status_date: type: string format: date-time nullable: true required: - accepted - created - customer_id - customer_relation - definitive_date - definitive_pdf_filename - description - id - is_sent - last_status - last_status_date - last_status_full - modified - name - preliminary - quotation_address - quotation_city - quotation_contact - quotation_country_code - quotation_email - quotation_expire_days - quotation_id - quotation_mobile - quotation_name - quotation_po_box - quotation_postal - quotation_reference - quotation_tel - quotation_type - signature_customer - signature_engineer - signature_name_customer - signature_name_engineer - total - total_currency - uuid - vat - vat_currency - vat_type QuotationRequest: type: object properties: uuid: type: string format: uuid quotation_id: type: string minLength: 1 maxLength: 50 quotation_type: type: string nullable: true maxLength: 30 name: type: string nullable: true maxLength: 255 quotation_name: type: string nullable: true maxLength: 255 quotation_address: type: string nullable: true maxLength: 255 quotation_postal: type: string nullable: true maxLength: 20 quotation_city: type: string nullable: true maxLength: 255 quotation_country_code: type: string nullable: true maxLength: 2 quotation_po_box: type: string nullable: true maxLength: 100 quotation_email: type: string format: email nullable: true maxLength: 180 quotation_tel: type: string nullable: true maxLength: 100 quotation_mobile: type: string nullable: true maxLength: 100 quotation_contact: type: string nullable: true quotation_reference: type: string nullable: true maxLength: 100 description: type: string nullable: true signature_engineer: type: string format: byte nullable: true signature_customer: type: string format: byte nullable: true signature_name_engineer: type: string nullable: true maxLength: 255 signature_name_customer: type: string nullable: true maxLength: 255 customer_id: type: string nullable: true maxLength: 100 customer_relation: type: integer nullable: true preliminary: type: boolean accepted: type: boolean vat_type: type: string format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,1})?$ total: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ vat: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ quotation_expire_days: type: integer maximum: 2147483647 minimum: 0 definitive_date: type: string format: date nullable: true definitive_pdf_filename: type: string nullable: true maxLength: 255 QuotationStatus: type: object properties: id: type: integer readOnly: true quotation: type: integer status: type: string maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - quotation - status QuotationStatusRequest: type: object properties: quotation: type: integer status: type: string minLength: 1 maxLength: 255 required: - quotation - status RecaptchaVerifyRequestRequest: type: object description: The body VerifyRecaptchaResponse forwards to Google. properties: response: type: string minLength: 1 required: - response ReportedCodeExtraData: type: object description: The dict AssignmentInfoMixin.get_reported_codes_extra_data builds. properties: statuscode: type: string extra_data: type: string required: - extra_data - statuscode ResetPassword: type: object properties: user_id: type: string timestamp: type: integer signature: type: string password: type: string required: - password - signature - timestamp - user_id ResetPasswordRequest: type: object properties: user_id: type: integer description: User id from the verification link. The endpoint also accepts it as a numeric string. timestamp: type: integer signature: type: string minLength: 1 password: type: string minLength: 1 required: - password - signature - timestamp - user_id ResultResponse: type: object description: '`{''result'': bool}` - whether the action did what was asked.' properties: result: type: boolean required: - result RoomResponse: type: object description: |- `{'room': }` - the websocket rooms GetUserRoom, GetMemberRoom and GetMemberNewDataRoom hand out for the current user or tenant. properties: room: type: string required: - room SalesUser: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 sales_user: $ref: '#/components/schemas/SalesUserSub' num_customers: type: integer readOnly: true full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - first_name - full_name - id - last_name - num_customers - sales_user - user_sick - username SalesUserCustomer: type: object properties: id: type: integer readOnly: true user: type: integer nullable: true customer: type: integer modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer - id - modified SalesUserCustomerExpanded: type: object properties: id: type: integer readOnly: true user: type: integer nullable: true customer: type: integer customer_details: allOf: - $ref: '#/components/schemas/Customer' readOnly: true modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer - customer_details - id - modified SalesUserCustomerRequest: type: object properties: user: type: integer nullable: true customer: type: integer required: - customer SalesUserMyCustomer: type: object properties: id: type: integer readOnly: true customer: type: integer modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - customer - id - modified SalesUserMyCustomerRequest: type: object properties: customer: type: integer required: - customer SalesUserRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 sales_user: $ref: '#/components/schemas/SalesUserSubRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - first_name - last_name - sales_user - username SalesUserSub: type: object properties: id: type: integer readOnly: true uuid: type: string readOnly: true uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - id - uuid SalesUserSubRequest: type: object properties: uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ SendResetPasswordLink: type: object description: serializer used for sending reset password link. properties: isRegistration: type: boolean default: false user_id: type: integer email: type: string SendResetPasswordLinkRequest: type: object description: serializer used for sending reset password link. properties: isRegistration: type: boolean default: false user_id: type: integer email: type: string minLength: 1 SetLanguageRequestRequest: type: object description: The form fields SetLanguage reads. properties: language: type: string minLength: 1 SetOrderAcceptedResponse: type: object description: The dict OrderViewset.set_order_accepted returns. properties: result: type: boolean accepted: type: boolean required: - accepted - result SourceEnum: enum: - mobile - company type: string description: |- * `mobile` - mobile * `company` - company StatusOkResponse: type: object description: '`{''status'': ''ok''}` - what the OAuth callback and EmptyTokens answer.' properties: status: $ref: '#/components/schemas/StatusOkResponseStatusEnum' required: - status StatusOkResponseStatusEnum: enum: - ok type: string description: '* `ok` - ok' Statuscode: type: object properties: id: type: integer readOnly: true code_type: $ref: '#/components/schemas/CodeTypeEnum' statuscode: type: string maxLength: 255 color: type: string maxLength: 7 nullable: true description: type: string nullable: true actions: type: array items: $ref: '#/components/schemas/Action' readOnly: true start_order: type: boolean end_order: type: boolean after_end_order: type: boolean new_status_template: type: string nullable: true maxLength: 255 text_color: type: string nullable: true maxLength: 7 color_for_assignedorders: type: boolean can_be_reassigned_after_end: type: boolean as_filter: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true maxLength: 255 settings_key: type: string readOnly: true nullable: true settings_value: type: string nullable: true readOnly: true roles: type: array items: type: string required: - actions - code_type - color - id - settings_key - settings_value - statuscode StatuscodeAutocompleteRow: type: object description: |- `{statuscode, value}` - a picker row keyed by the code, not by a pk. Not an AutocompleteRowSerializer: these rows carry no `id`, because the thing the picker submits *is* the statuscode string. Shared by the statuscode and mobile trip-statuscode pickers, which build the identical dict from the identical loop. properties: statuscode: type: string value: type: string required: - statuscode - value StatuscodeRequest: type: object properties: code_type: $ref: '#/components/schemas/CodeTypeEnum' statuscode: type: string minLength: 1 maxLength: 255 color: type: string minLength: 1 maxLength: 7 description: type: string nullable: true minLength: 1 start_order: type: boolean end_order: type: boolean after_end_order: type: boolean new_status_template: type: string nullable: true minLength: 1 maxLength: 255 text_color: type: string nullable: true minLength: 1 maxLength: 7 color_for_assignedorders: type: boolean can_be_reassigned_after_end: type: boolean as_filter: type: boolean num_days: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true num_days_operator: $ref: '#/components/schemas/NumDaysOperatorEnum' num_days_model_field: type: string nullable: true minLength: 1 maxLength: 255 roles: type: array items: type: string minLength: 1 required: - code_type - color - statuscode StockLocation: type: object properties: id: type: integer readOnly: true identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 inventory: type: integer readOnly: true show_in_stats: type: boolean external_identifier: type: string nullable: true maxLength: 100 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - inventory - modified StockLocationCreateUpdate: type: object properties: id: type: integer readOnly: true identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 show_in_stats: type: boolean external_identifier: type: string nullable: true maxLength: 100 required: - id StockLocationCreateUpdateRequest: type: object properties: identifier: type: string nullable: true maxLength: 255 name: type: string nullable: true maxLength: 255 show_in_stats: type: boolean external_identifier: type: string nullable: true maxLength: 100 StockMutationSimple: type: object properties: id: type: integer readOnly: true material: type: integer nullable: true location: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ mutation_type: $ref: '#/components/schemas/MutationTypeEnum' modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. summary: type: string nullable: true readOnly: true material_name: type: string readOnly: true remarks: type: string nullable: true maxLength: 255 required: - amount - id - material_name - modified - summary StockMutationSimpleRequest: type: object properties: material: type: integer nullable: true location: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ mutation_type: $ref: '#/components/schemas/MutationTypeEnum' remarks: type: string nullable: true maxLength: 255 required: - amount StreamChannel: type: object description: The stream credentials GetUserInfo nests. properties: token: type: string room_id: type: string room_title: type: string required: - room_id - room_title - token StreamInfoResponse: type: object description: |- The dict GetStreamInfo returns on success. Failure answers are shaped differently: `{'error': ...}` for an unknown user, `{'result': False}` when channel setup raised. properties: user: $ref: '#/components/schemas/MinimalUser' member_user_id: type: string api_key: type: string token: type: string channel_id: type: string channel_title: type: string required: - api_key - channel_id - channel_title - member_user_id - token - user StudentSub: type: object properties: street: type: string nullable: true maxLength: 255 house_number: type: string nullable: true maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 remarks: type: string nullable: true picture: type: string format: uri nullable: true description: The stored image's URL, or null when the record has no image file. info: type: string rating_avg: type: number format: double nullable: true readOnly: true lon: type: number format: double nullable: true lat: type: number format: double nullable: true picture_url: type: string nullable: true readOnly: true iban: type: string maxLength: 34 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 gender: type: string nullable: true maxLength: 1 dob: type: string format: date nullable: true drivers_licence: type: string nullable: true maxLength: 3 drivers_licence_type: type: string nullable: true maxLength: 20 box_truck: type: string nullable: true maxLength: 3 bsn: type: string nullable: true maxLength: 10 uuid: type: string readOnly: true first_time_profile: type: boolean uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - picture_url - rating_avg - uuid StudentSubRegister: type: object description: |- The reachable, addressable person POST /api/accounts/register/ demands. The admin create shares StudentUserSerializer with this endpoint and leaves everything optional; the registrant must supply address, info and a valid mobile. Declared as field-level required so the generated request component carries the required set instead of the frontend re-declaring it per form. properties: street: type: string maxLength: 255 house_number: type: string maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string maxLength: 20 city: type: string maxLength: 255 country_code: type: string maxLength: 2 remarks: type: string nullable: true picture: type: string format: uri nullable: true description: The stored image's URL, or null when the record has no image file. info: type: string rating_avg: type: number format: double nullable: true readOnly: true lon: type: number format: double nullable: true lat: type: number format: double nullable: true picture_url: type: string nullable: true readOnly: true iban: type: string maxLength: 34 mobile: type: string pattern: ^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 gender: type: string nullable: true maxLength: 1 dob: type: string format: date nullable: true drivers_licence: type: string nullable: true maxLength: 3 drivers_licence_type: type: string nullable: true maxLength: 20 box_truck: type: string nullable: true maxLength: 3 bsn: type: string nullable: true maxLength: 10 uuid: type: string readOnly: true first_time_profile: type: boolean uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - city - house_number - info - mobile - picture_url - postal - rating_avg - street - uuid StudentSubRegisterRequest: type: object description: |- The reachable, addressable person POST /api/accounts/register/ demands. The admin create shares StudentUserSerializer with this endpoint and leaves everything optional; the registrant must supply address, info and a valid mobile. Declared as field-level required so the generated request component carries the required set instead of the frontend re-declaring it per form. properties: street: type: string minLength: 1 maxLength: 255 house_number: type: string minLength: 1 maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string minLength: 1 maxLength: 20 city: type: string minLength: 1 maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 remarks: type: string nullable: true picture: type: string format: byte info: type: string minLength: 1 lon: type: number format: double nullable: true lat: type: number format: double nullable: true iban: type: string minLength: 1 maxLength: 34 mobile: type: string minLength: 1 pattern: ^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 gender: type: string nullable: true maxLength: 1 dob: type: string format: date nullable: true drivers_licence: type: string nullable: true maxLength: 3 drivers_licence_type: type: string nullable: true maxLength: 20 box_truck: type: string nullable: true maxLength: 3 bsn: type: string nullable: true maxLength: 10 first_time_profile: type: boolean uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ required: - city - house_number - info - mobile - postal - street StudentSubWriteRequest: type: object properties: street: type: string nullable: true maxLength: 255 house_number: type: string nullable: true maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 remarks: type: string nullable: true picture: type: string format: byte info: type: string lon: type: number format: double nullable: true lat: type: number format: double nullable: true iban: type: string minLength: 1 maxLength: 34 mobile: type: string nullable: true pattern: ^$|^\+[1-9]\d{7,14}$ description: E.164 phone number. The API also accepts national numbers with separators and stores the E.164 form. maxLength: 128 gender: type: string nullable: true maxLength: 1 dob: type: string format: date nullable: true drivers_licence: type: string nullable: true maxLength: 3 drivers_licence_type: type: string nullable: true maxLength: 20 box_truck: type: string nullable: true maxLength: 3 bsn: type: string nullable: true maxLength: 10 first_time_profile: type: boolean uses_time_registration: type: boolean contract_hours_week: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ StudentUser: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 student_user: $ref: '#/components/schemas/StudentSub' username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 is_active: type: boolean title: Active description: Designates whether this user should be treated as active. Unselect this instead of deleting accounts. full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - first_name - full_name - id - last_name - student_user - user_sick StudentUserMinimal: type: object properties: user: $ref: '#/components/schemas/StudentUserUserMinimal' street: type: string nullable: true maxLength: 255 house_number: type: string nullable: true maxLength: 100 house_number_addition: type: string nullable: true maxLength: 100 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 remarks: type: string nullable: true picture: type: string format: uri readOnly: true nullable: true info: type: string rating_avg: type: number format: double readOnly: true nullable: true lon: type: number format: double nullable: true lat: type: number format: double nullable: true wp_image: type: string format: uri nullable: true maxLength: 200 iban: type: string maxLength: 34 mobile: type: string nullable: true maxLength: 128 required: - picture - rating_avg - user StudentUserMinimalView: type: object description: The dict StudentUserUserMinimalSerializer.get_student_user builds. properties: address: type: string rating_avg: type: number format: double nullable: true info: type: string picture_url: type: string nullable: true required: - address - info - picture_url - rating_avg StudentUserPublicView: type: object description: The dict StudentUserUserPublicSerializer.get_student_user builds. properties: city: type: string rating_avg: type: number format: double nullable: true info: type: string picture_url: type: string nullable: true required: - city - info - picture_url - rating_avg StudentUserRegister: type: object description: |- Registration body: StudentUserSerializer minus username, plus demands. Wired as REGISTER_SERIALIZER_CLASS so only the public registration uses it; the admin studentuser endpoints keep the lenient base. create() is inherited unchanged - it already derives the username from the email, so a supplied username was always ignored and is now not declared at all. properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 student_user: $ref: '#/components/schemas/StudentSubRegister' full_name: type: string readOnly: true last_login: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 user_sick: allOf: - $ref: '#/components/schemas/UserSickView' nullable: true readOnly: true required: - email - first_name - full_name - id - last_name - student_user - user_sick StudentUserRegisterRequest: type: object description: |- Registration body: StudentUserSerializer minus username, plus demands. Wired as REGISTER_SERIALIZER_CLASS so only the public registration uses it; the admin studentuser endpoints keep the lenient base. create() is inherited unchanged - it already derives the username from the email, so a supplied username was always ignored and is now not declared at all. properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 student_user: $ref: '#/components/schemas/StudentSubRegisterRequest' password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - first_name - last_name - student_user StudentUserUserMinimal: type: object properties: id: type: integer readOnly: true email: type: string format: email title: Email address maxLength: 254 username: type: string description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 full_name: type: string readOnly: true student_user: allOf: - $ref: '#/components/schemas/StudentUserMinimalView' readOnly: true required: - full_name - id - student_user - username StudentUserUserMinimalRequest: type: object properties: email: type: string format: email title: Email address maxLength: 254 username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string maxLength: 150 last_name: type: string maxLength: 150 required: - username StudentUserUserPublic: type: object properties: date_joined: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. full_name: type: string readOnly: true student_user: allOf: - $ref: '#/components/schemas/StudentUserPublicView' readOnly: true required: - full_name - student_user StudentUserWriteRequest: type: object properties: email: type: string format: email minLength: 1 title: Email address maxLength: 254 student_user: $ref: '#/components/schemas/StudentSubWriteRequest' username: type: string minLength: 1 description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. pattern: ^[\w.@+-]+$ maxLength: 150 is_active: type: boolean title: Active description: Designates whether this user should be treated as active. Unselect this instead of deleting accounts. password: type: string writeOnly: true minLength: 1 maxLength: 128 last_login: type: string format: date-time nullable: true date_joined: type: string format: date-time first_name: type: string minLength: 1 maxLength: 150 last_name: type: string minLength: 1 maxLength: 150 required: - email - first_name - last_name - student_user SuccessResponse: type: object description: '`{''success'': bool}` - as ResultResponse, under the other spelling.' properties: success: type: boolean required: - success Supplier: type: object properties: id: type: integer readOnly: true name: type: string nullable: true maxLength: 255 address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string maxLength: 2 tel: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 email: type: string nullable: true maxLength: 150 contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 remarks: type: string nullable: true identifier: type: string nullable: true maxLength: 100 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified SupplierAutocomplete: allOf: - $ref: '#/components/schemas/AddressAutocompleteRow' - type: object properties: identifier: type: string nullable: true remarks: type: string nullable: true required: - identifier - remarks description: The rows SupplierViewset.autocomplete returns. SupplierCreateUpdate: type: object properties: id: type: integer readOnly: true name: type: string nullable: true maxLength: 255 address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true maxLength: 100 email: type: string nullable: true maxLength: 150 contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 remarks: type: string nullable: true identifier: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 required: - country_code - id SupplierCreateUpdateRequest: type: object properties: name: type: string nullable: true maxLength: 255 address: type: string nullable: true maxLength: 255 postal: type: string nullable: true maxLength: 20 city: type: string nullable: true maxLength: 255 country_code: type: string minLength: 1 maxLength: 2 tel: type: string nullable: true maxLength: 100 email: type: string nullable: true maxLength: 150 contact: type: string nullable: true mobile: type: string nullable: true maxLength: 100 remarks: type: string nullable: true identifier: type: string nullable: true maxLength: 100 external_identifier: type: string nullable: true maxLength: 100 required: - country_code SupplierMaterialTotalSalesRow: type: object description: |- Numeric columns every total_sales aggregate shares. Nulls cannot occur: a row only exists when at least one sales mutation joins to it and every source column (amount, both prices) is NOT NULL. properties: sum_amount: type: number format: double sum_price_purchase: type: number format: double sum_price_selling: type: number format: double profit: type: number format: double amount_perc: oneOf: - type: number - type: string amount_selling_perc: oneOf: - type: number - type: string supplier_name: type: string nullable: true material_name: type: string nullable: true required: - amount_perc - amount_selling_perc - material_name - profit - sum_amount - sum_price_purchase - sum_price_selling - supplier_name SupplierReservation: type: object properties: id: type: integer readOnly: true supplier: type: integer supplier_view: allOf: - $ref: '#/components/schemas/Supplier' readOnly: true materials: type: array items: $ref: '#/components/schemas/SupplierReservationMaterial' readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - materials - modified - supplier - supplier_view SupplierReservationAutocomplete: type: object description: |- A picker row for a supplier's reservation. Not a slimmer SupplierReservationSerializer: the picker wants the supplier written out rather than referenced, and the label counts the products. The action used to build this dict by hand, which is how it came to be declared as the viewset's own serializer instead - a serializer the endpoint uses cannot drift from the one describing it. properties: id: type: integer readOnly: true supplier: allOf: - $ref: '#/components/schemas/Supplier' readOnly: true products: type: array items: $ref: '#/components/schemas/SupplierReservationMaterial' readOnly: true value: type: string description: |- Given the *incoming* primitive data, return the value for this field that should be validated and transformed to a native value. readOnly: true required: - id - products - supplier - value SupplierReservationMaterial: type: object properties: id: type: integer readOnly: true reservation: type: integer material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 material_view: allOf: - $ref: '#/components/schemas/Material' readOnly: true remarks: type: string nullable: true maxLength: 255 created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - material - material_view - modified - reservation SupplierReservationMaterialRequest: type: object properties: reservation: type: integer material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 required: - material - reservation SupplierReservationMaterialRowRequest: type: object description: |- One row of a SupplierReservation-with-materials nested create/replace-set. Same shape as SupplierReservationMaterialSerializer but `id` is writable and optional (present -> update, absent -> create), and `reservation` is optional - the parent SupplierReservation supplies it. properties: id: type: integer nullable: true reservation: type: integer material: type: integer amount: type: integer maximum: 2147483647 minimum: 0 remarks: type: string nullable: true maxLength: 255 required: - material SupplierReservationRequest: type: object properties: supplier: type: integer required: - supplier SupplierReservationWithMaterialsRequest: type: object description: |- Body for both .../supplier-reservation/with-materials/ (create) and .../supplier-reservation/{id}/with-materials/ (update): the reservation's own fields plus `materials`. On create every row is inserted; on update `materials` is a replace-set (see `_replace_reservation_materials`). properties: supplier: type: integer materials: type: array items: $ref: '#/components/schemas/SupplierReservationMaterialRowRequest' required: - supplier SupplierTotalSalesRow: type: object description: |- Numeric columns every total_sales aggregate shares. Nulls cannot occur: a row only exists when at least one sales mutation joins to it and every source column (amount, both prices) is NOT NULL. properties: sum_amount: type: number format: double sum_price_purchase: type: number format: double sum_price_selling: type: number format: double profit: type: number format: double amount_perc: oneOf: - type: number - type: string amount_selling_perc: oneOf: - type: number - type: string supplier_name: type: string nullable: true required: - amount_perc - amount_selling_perc - profit - sum_amount - sum_price_purchase - sum_price_selling - supplier_name TaxRate: type: object properties: uuid: type: string format: uuid description: type: string rate: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ required: - description - rate - uuid TeamleaderProductCreateRequest: type: object properties: material: type: integer name: type: string minLength: 1 maxLength: 255 code: type: string nullable: true minLength: 1 maxLength: 100 description: type: string nullable: true minLength: 1 maxLength: 255 purchase_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ selling_price: type: string format: decimal pattern: ^-?\d{0,8}(?:\.\d{0,2})?$ tax_rate_id: type: string minLength: 1 maxLength: 40 required: - material - name - tax_rate_id Template: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 255 description: type: string nullable: true file: type: string format: uri modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. filename: type: string readOnly: true template_type: $ref: '#/components/schemas/TemplateTypeEnum' is_active: type: boolean url: type: string readOnly: true required: - created - file - filename - id - modified - name - template_type - url TemplatePreviewRequest: type: object description: |- The request body TemplateViewset.preview_template_pdf reads. Request only - the endpoint answers with the rendered PDF, which the response annotation describes as the binary it is. properties: id: type: integer uuid: type: string minLength: 1 template_type: type: string minLength: 1 required: - id - template_type - uuid TemplateRequest: type: object properties: name: type: string minLength: 1 maxLength: 255 description: type: string nullable: true file: type: string format: byte template_type: $ref: '#/components/schemas/TemplateTypeEnum' is_active: type: boolean required: - file - name - template_type TemplateTypeEnum: enum: - invoice - quotation type: string description: |- * `invoice` - invoice * `quotation` - quotation TimeRegistrationIntervalTotal: type: object description: The {total, interval_total} pair each bucket column carries. properties: total: oneOf: - type: string - type: number nullable: true interval_total: oneOf: - type: string - type: number nullable: true required: - interval_total - total TimeRegistrationLeaveRow: type: object description: |- A leave_data row: the detail-user shape minus the work/travel/distance keys list() deletes for leave records, plus the project (always null) and leave type it fills in. properties: date: type: string readOnly: true username: type: string maxLength: 255 source: $ref: '#/components/schemas/SourceEnum' source_id: type: integer maximum: 9223372036854775807 minimum: 0 format: int64 customer_name: type: string nullable: true readOnly: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 extra_work: type: string nullable: true actual_work: type: string nullable: true unforeseen_work: type: string readOnly: true leave_duration: type: string readOnly: true id: type: integer readOnly: true work_correction: type: string readOnly: true work_correction_by_user_id: type: integer readOnly: true project: type: string nullable: true leave_type: type: string nullable: true required: - customer_name - date - id - leave_duration - leave_type - project - source - source_id - unforeseen_work - username - work_correction - work_correction_by_user_id TimeRegistrationListResponse: type: object description: The hand-built envelope TimeRegistrationListView.list answers with. properties: full_name: type: string nullable: true totals_fields: type: array items: type: string date_list: type: array items: type: string format: date intervals: type: array items: type: integer totals: type: array items: $ref: '#/components/schemas/TimeRegistrationTotalsRow' workhour_data: type: array items: $ref: '#/components/schemas/TimeRegistrationWorkhourRow' leave_data: type: array items: $ref: '#/components/schemas/TimeRegistrationLeaveRow' required: - date_list - full_name - intervals - totals - totals_fields TimeRegistrationTotalsEngineerRow: type: object description: |- Bucket row for an engineer user: the user pairs plus extra, actual and unforeseen work. properties: bucket: type: string format: date-time full_name: type: string user_id: type: integer nullable: true contract_hours_week: type: number format: double interval: type: integer work_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' travel_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' distance_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' extra_work: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' actual_work: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' unforeseen_work: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' required: - actual_work - bucket - contract_hours_week - distance_total - extra_work - full_name - interval - travel_total - unforeseen_work - user_id - work_total TimeRegistrationTotalsListRow: type: object description: 'Bucket row with no user pinned: only the work total.' properties: bucket: type: string format: date-time full_name: type: string user_id: type: integer nullable: true contract_hours_week: type: number format: double interval: type: integer work_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' required: - bucket - contract_hours_week - full_name - interval - user_id - work_total TimeRegistrationTotalsRow: anyOf: - $ref: '#/components/schemas/TimeRegistrationTotalsListRow' - $ref: '#/components/schemas/TimeRegistrationTotalsUserRow' - $ref: '#/components/schemas/TimeRegistrationTotalsEngineerRow' TimeRegistrationTotalsUserRow: type: object description: 'Bucket row for a non-engineer user: work, travel and distance totals.' properties: bucket: type: string format: date-time full_name: type: string user_id: type: integer nullable: true contract_hours_week: type: number format: double interval: type: integer work_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' travel_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' distance_total: $ref: '#/components/schemas/TimeRegistrationIntervalTotal' required: - bucket - contract_hours_week - distance_total - full_name - interval - travel_total - user_id - work_total TimeRegistrationWorkhourRow: type: object description: |- A workhour_data row: the detail-user shape plus the project and description list() fills in. leave_duration is deleted for non-leave rows and break_duration only exists when break calculation is on, so both stay optional on reads. properties: date: type: string readOnly: true username: type: string maxLength: 255 source: $ref: '#/components/schemas/SourceEnum' source_id: type: integer maximum: 9223372036854775807 minimum: 0 format: int64 customer_name: type: string nullable: true readOnly: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 extra_work: type: string nullable: true actual_work: type: string nullable: true unforeseen_work: type: string readOnly: true leave_duration: type: string readOnly: true id: type: integer readOnly: true work_correction: type: string readOnly: true work_correction_by_user_id: type: integer readOnly: true project: type: string nullable: true description: type: string nullable: true break_duration: oneOf: - type: string - type: number nullable: true required: - customer_name - date - description - id - project - source - source_id - unforeseen_work - username - work_correction - work_correction_by_user_id TimesheetMaterialRow: type: object description: material fallback columns copied per assignedorder material. properties: material_name: type: string nullable: true material_identifier: type: string nullable: true amount: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ required: - amount - material_identifier - material_name TimesheetTotalsRow: type: object description: per-user timesheet row produced by get_user_hours_data(). properties: full_name: type: string user_id: type: integer day_totals: type: array items: type: array items: oneOf: - type: number - type: string nullable: true week_totals: type: array items: oneOf: - type: number - type: string nullable: true required: - day_totals - full_name - user_id - week_totals TokenObtainResponse: type: object description: |- The dict TokenObtainSlidingSerializerDifferentToken returns. simplejwt's view answers with whatever validate() built, and both of that serializer's own fields are write_only, so drf-spectacular inferred "no response body" and the generated client saw an empty type. `app` is the caller's own value echoed back - null when the body carried none - which is how a client tells which session expiry it was granted. properties: token: type: string app: type: string nullable: true required: - app - token TokenObtainSlidingSerializerDifferentTokenRequest: type: object properties: app: type: string nullable: true username: type: string writeOnly: true minLength: 1 password: type: string writeOnly: true minLength: 1 required: - password - username TokenRefreshSlidingSerializerDifferentToken: type: object properties: token: type: string required: - token TokenRefreshSlidingSerializerDifferentTokenRequest: type: object properties: token: type: string minLength: 1 required: - token TopCustomer: type: object description: |- One customer's three stats blocks, as `get_top_x_customers` returns it. The same three shapes the dedicated endpoints answer with, per customer, so they come from the same components here too. These are ordinary properties rather than map values, so they do travel as `$ref`s. properties: customer: type: string nullable: true order_counts_stats: $ref: '#/components/schemas/OrderCountsStatsData' order_types_month_stats: $ref: '#/components/schemas/OrderTypesByPeriodData' order_types_stats: $ref: '#/components/schemas/OrderTypesStatsData' required: - customer - order_counts_stats - order_types_month_stats - order_types_stats TopCustomersResponse: type: object description: The `get_top_x_customers` endpoint. properties: get_top_x_customers: type: array items: $ref: '#/components/schemas/TopCustomer' required: - get_top_x_customers TopUsersForCustomerResponse: type: object description: The dict TopUsersForCustomerListView.list returns. properties: data: type: array items: $ref: '#/components/schemas/GetTopUsersForCustomerView' required: - data TravelHoursProduct: type: object properties: travel_hours_product_uuid: type: string maxLength: 40 travel_hours_product_name: type: string maxLength: 255 travel_hours_product_purchase_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true travel_hours_product_purchase_price_currency: type: string nullable: true maxLength: 4 travel_hours_product_selling_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true travel_hours_product_selling_price_currency: type: string nullable: true maxLength: 4 required: - travel_hours_product_name - travel_hours_product_uuid Trip: type: object properties: id: type: integer readOnly: true description: type: string nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 trip_orders: type: array items: $ref: '#/components/schemas/TripOrder' start_date: type: string format: date nullable: true start_time: type: string format: time nullable: true end_date: type: string format: date nullable: true end_time: type: string format: time nullable: true start_location_from_first_order: type: boolean start_datetime_from_first_order: type: boolean start_name: type: string nullable: true maxLength: 255 start_address: type: string nullable: true maxLength: 255 start_postal: type: string nullable: true maxLength: 20 start_city: type: string nullable: true maxLength: 255 start_country_code: type: string nullable: true maxLength: 2 end_location_from_last_order: type: boolean end_datetime_from_last_order: type: boolean end_name: type: string nullable: true maxLength: 255 end_address: type: string nullable: true maxLength: 255 end_postal: type: string nullable: true maxLength: 20 end_city: type: string nullable: true maxLength: 255 end_country_code: type: string nullable: true maxLength: 2 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. trip_date: type: string readOnly: true user_trip_is_available: type: boolean readOnly: true required_assigned: type: string readOnly: true assigned_user_count: type: integer readOnly: true num_orders: type: integer readOnly: true users_trip_set_as_available: type: integer readOnly: true number_still_available: type: integer readOnly: true statuses: type: array items: $ref: '#/components/schemas/TripStatus' readOnly: true distance: type: number format: double readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - assigned_user_count - color - created - distance - id - last_status - last_status_date - last_status_full - modified - num_orders - number_still_available - required_assigned - statuscode_id - statuses - text_color - trip_date - trip_orders - user_trip_is_available - users_trip_set_as_available TripAvailabilityDetailResponse: type: object description: |- The {trip, assigned_users, available_users} bundle built by hand in trip_availability_detail(). properties: trip: $ref: '#/components/schemas/Trip' assigned_users: type: array items: $ref: '#/components/schemas/AvailabilityUserRow' available_users: type: array items: $ref: '#/components/schemas/AvailabilityUserRow' required: - assigned_users - available_users - trip TripOrder: type: object properties: id: type: integer readOnly: true order: type: integer name: type: string readOnly: true address: type: string nullable: true readOnly: true postal: type: string nullable: true readOnly: true city: type: string nullable: true readOnly: true country_code: type: string nullable: true readOnly: true date: type: string readOnly: true start_date: type: string readOnly: true start_time: type: string nullable: true readOnly: true end_date: type: string readOnly: true end_time: type: string nullable: true readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' readOnly: true modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - address - city - country_code - created - date - end_date - end_time - id - modified - name - order - orderlines - postal - start_date - start_time TripOrderRequest: type: object properties: order: type: integer required: - order TripRequest: type: object properties: description: type: string nullable: true required_users: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 trip_orders: type: array items: $ref: '#/components/schemas/PatchedTripOrderRequest' start_date: type: string format: date nullable: true start_time: type: string format: time nullable: true end_date: type: string format: date nullable: true end_time: type: string format: time nullable: true start_location_from_first_order: type: boolean start_datetime_from_first_order: type: boolean start_name: type: string nullable: true maxLength: 255 start_address: type: string nullable: true maxLength: 255 start_postal: type: string nullable: true maxLength: 20 start_city: type: string nullable: true maxLength: 255 start_country_code: type: string nullable: true maxLength: 2 end_location_from_last_order: type: boolean end_datetime_from_last_order: type: boolean end_name: type: string nullable: true maxLength: 255 end_address: type: string nullable: true maxLength: 255 end_postal: type: string nullable: true maxLength: 20 end_city: type: string nullable: true maxLength: 255 end_country_code: type: string nullable: true maxLength: 2 required: - trip_orders TripStatus: type: object properties: id: type: integer readOnly: true trip: type: integer status: type: string maxLength: 255 modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - status - trip TripStatuscode: type: object properties: id: type: integer readOnly: true statuscode: type: string maxLength: 255 color: type: string nullable: true maxLength: 7 description: type: string nullable: true actions: type: array items: $ref: '#/components/schemas/TripStatuscodeAction' readOnly: true is_regex: type: boolean start_trip: type: boolean nullable: true end_trip: type: boolean nullable: true new_status_template: type: string nullable: true maxLength: 255 required: - actions - id - statuscode TripStatuscodeAction: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/TripStatuscodeActionTypeEnum' json_conditions: type: array items: $ref: '#/components/schemas/ActionCondition' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer title: Actions conditions: type: string readOnly: true required: - conditions - id - name - statuscode - type TripStatuscodeActionRequest: type: object properties: name: type: string minLength: 1 maxLength: 120 address: type: string nullable: true maxLength: 255 subject: type: string nullable: true maxLength: 255 description: type: string nullable: true template: type: string nullable: true type: $ref: '#/components/schemas/TripStatuscodeActionTypeEnum' json_conditions: type: array items: $ref: '#/components/schemas/ActionConditionRequest' nullable: true querymode: allOf: - $ref: '#/components/schemas/QuerymodeEnum' nullable: true statuscode: type: integer title: Actions required: - name - statuscode - type TripStatuscodeActionTypeEnum: enum: - email - send_sms - send_fcm type: string description: |- * `email` - send email * `send_sms` - send_sms * `send_fcm` - send fcm TripStatuscodeRequest: type: object properties: statuscode: type: string minLength: 1 maxLength: 255 color: type: string nullable: true maxLength: 7 description: type: string nullable: true is_regex: type: boolean start_trip: type: boolean nullable: true end_trip: type: boolean nullable: true new_status_template: type: string nullable: true maxLength: 255 required: - statuscode UnassignOrderRequestRequest: type: object description: The body UnAssignUserView reads. properties: order_pk: type: integer set_available: type: boolean required: - order_pk UnassignTripRequestRequest: type: object description: |- The body UnAssignUserTripView reads; every order on the trip is unassigned. properties: trip_pk: type: integer set_available: type: boolean required: - trip_pk UnauthorizedResponse: type: object properties: detail: type: string default: Authentication credentials were not provided. UnsentOfferResponse: type: object description: What the offer form opens with (OfferViewset.get_unsent_offer). properties: offer: allOf: - $ref: '#/components/schemas/Offer' nullable: true quotation: $ref: '#/components/schemas/OfferQuotation' documents: type: array items: $ref: '#/components/schemas/OfferAttachment' required: - documents - offer - quotation UserInfoDetailResponse: type: object description: |- The dict GetUserInfo returns. When the pk names a deleted user the answer is `{'error': ...}` instead; that branch is not part of this shape. properties: user: type: object additionalProperties: true submodel: type: string stream: $ref: '#/components/schemas/StreamChannel' required: - stream - submodel - user UserInfoResponse: type: object description: |- `{'user': ..., 'submodel': ...}` - who is calling. `user` stays open: get_serialized_user() picks a different serializer per user type (engineer, planning, customer, ...). properties: user: type: object additionalProperties: true submodel: type: string required: - submodel - user UserLeaveHours: type: object properties: id: type: integer readOnly: true user: type: integer nullable: true username: type: string maxLength: 255 full_name: type: string readOnly: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_date_iso: type: string format: date readOnly: true start_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true start_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true start_date_is_whole_day: type: boolean end_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. end_date_iso: type: string format: date readOnly: true end_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true end_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true end_date_is_whole_day: type: boolean total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_hours: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true duration_seconds: type: integer readOnly: true contract_hours_used: type: integer maximum: 32767 minimum: 0 actual_duration: type: string nullable: true actual_duration_seconds: type: integer readOnly: true leave_type: type: integer nullable: true leave_type_name: type: string nullable: true readOnly: true is_accepted: type: boolean is_rejected: type: boolean description: type: string nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - actual_duration_seconds - color - created - duration_seconds - end_date_iso - full_name - id - last_status - last_status_date - last_status_full - leave_type_name - modified - start_date_iso - statuscode_id - text_color - username UserLeaveHoursData: type: object properties: total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true duration_seconds: type: integer readOnly: true contract_hours_used: type: integer maximum: 32767 minimum: 0 required: - duration_seconds UserLeaveHoursNoPlanningRequest: type: object properties: start_date: type: string format: date start_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true start_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true start_date_is_whole_day: type: boolean end_date: type: string format: date end_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true end_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true end_date_is_whole_day: type: boolean total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true actual_duration: type: string nullable: true leave_type: type: integer nullable: true description: type: string nullable: true UserLeaveHoursPlanningRequest: type: object properties: user: type: integer nullable: true start_date: type: string format: date start_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true start_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true start_date_is_whole_day: type: boolean end_date: type: string format: date end_date_hours: type: integer maximum: 32767 minimum: 0 nullable: true end_date_minutes: type: integer maximum: 32767 minimum: 0 nullable: true end_date_is_whole_day: type: boolean total_hours: type: integer maximum: 32767 minimum: 0 nullable: true total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_hours: type: integer maximum: 32767 minimum: 0 nullable: true actual_total_minutes: type: integer maximum: 32767 minimum: 0 nullable: true duration: type: string nullable: true contract_hours_used: type: integer maximum: 32767 minimum: 0 actual_duration: type: string nullable: true leave_type: type: integer nullable: true is_accepted: type: boolean is_rejected: type: boolean description: type: string nullable: true UserOrderAvailability: type: object properties: id: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/StudentUserUserMinimal' readOnly: true order: allOf: - $ref: '#/components/schemas/OrderMinimal' readOnly: true is_accepted: type: boolean created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - id - modified - order - user UserOrderAvailabilityRequest: type: object properties: is_accepted: type: boolean UserSelectRow: type: object description: The rows UserList answers with. properties: id: type: integer name: type: string email: type: string submodel_id: type: integer required: - email - id - name - submodel_id UserSickLeave: type: object properties: id: type: integer readOnly: true user: type: integer user_full_name: type: string nullable: true maxLength: 150 full_name: type: string nullable: true readOnly: true created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 created_is_confirmed: type: boolean readOnly: true start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_date_iso: type: string format: date readOnly: true end_date: type: string nullable: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - created_is_confirmed - full_name - id - last_status - last_status_date - last_status_full - modified - start_date_iso - statuscode_id - text_color - user UserSickLeaveRequest: type: object properties: user: type: integer user_full_name: type: string nullable: true maxLength: 150 created_by: type: integer nullable: true created_by_fullname: type: string nullable: true maxLength: 255 start_date: type: string format: date end_date: type: string format: date nullable: true required: - user UserSickView: type: object description: |- Documents the dict get_user_sick hand-builds across several serializers in this file (PlanningUserSerializer, SalesUserSerializer, EngineerSerializer, StudentUserSerializer, EmployeeUserSerializer). Declared only so the shape reaches the schema. start_date goes through TransformDatesMixin.format_date, so it is a string in the tenant's configured date format rather than an ISO date. properties: start_date: type: string required: - start_date UserTripAvailability: type: object properties: id: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/StudentUserUserMinimal' readOnly: true trip: type: integer is_accepted: type: boolean description: type: string nullable: true readOnly: true trip_date: type: string readOnly: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - created - description - id - modified - trip - trip_date - user UserTripAvailabilityRequest: type: object properties: trip: type: integer is_accepted: type: boolean required: - trip UserWorkHours: type: object properties: id: type: integer readOnly: true project: type: integer nullable: true project_name: type: string nullable: true readOnly: true user: type: integer readOnly: true nullable: true username: type: string readOnly: true full_name: type: string nullable: true readOnly: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true work_correction: type: integer description: Minutes of correction after to_representation rewrites the stored timedelta. readOnly: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. start_date_iso: type: string format: date readOnly: true description: type: string nullable: true created: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. modified: type: string readOnly: true description: Display string in the tenant's configured date_format, not an ISO-8601 value. last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true required: - color - created - full_name - id - last_status - last_status_date - last_status_full - modified - project_name - start_date_iso - statuscode_id - text_color - user - username - work_correction UserWorkHoursListTotalsResponse: type: object description: |- The envelope UserWorkHoursViewset.list_totals answers with. `full_name` is only filled when the call pins one user_id; without it the rows span every user and it is null. properties: date_list: type: array items: type: string format: date day_fields: type: array items: type: string day_field_types: type: array items: type: string result: type: array items: $ref: '#/components/schemas/UserWorkHoursTotalsRow' full_name: type: string nullable: true required: - date_list - day_field_types - day_fields - full_name - result UserWorkHoursRequest: type: object properties: project: type: integer nullable: true work_start: type: string format: time nullable: true work_end: type: string format: time nullable: true travel_to: type: string format: time nullable: true travel_back: type: string format: time nullable: true distance_to: type: integer maximum: 2147483647 minimum: 0 distance_back: type: integer maximum: 2147483647 minimum: 0 start_date: type: string format: date description: type: string nullable: true UserWorkHoursTotalsRow: type: object description: One entry of `result` in the user-workhours/list_totals answer. properties: full_name: type: string user_id: type: integer contract_hours_week: type: number format: double perc: type: integer day_totals: type: array items: type: array items: oneOf: - type: string - type: integer nullable: true description: '''{total_seconds}'' of hours, km driven as an integer, or null when absent.' minItems: 3 maxItems: 3 week_totals: type: array items: oneOf: - type: string - type: integer nullable: true minItems: 3 maxItems: 3 required: - contract_hours_week - day_totals - full_name - perc - user_id - week_totals VerifyEmail: type: object properties: user_id: type: string email: type: string format: email timestamp: type: integer signature: type: string required: - email - signature - timestamp - user_id VerifyEmailRequest: type: object properties: user_id: type: string minLength: 1 email: type: string format: email minLength: 1 timestamp: type: integer signature: type: string minLength: 1 required: - email - signature - timestamp - user_id VerifyRegistration: type: object properties: user_id: type: string timestamp: type: integer signature: type: string required: - signature - timestamp - user_id VerifyRegistrationRequest: type: object properties: user_id: type: integer description: User id from the verification link. The endpoint also accepts it as a numeric string. timestamp: type: integer signature: type: string minLength: 1 required: - signature - timestamp - user_id WordPressUserFetchRequestRequest: type: object description: The body StudentUserRegisterFetchUserView reads. properties: email: type: string format: email minLength: 1 required: - email WorkHoursProduct: type: object properties: workhours_product_uuid: type: string maxLength: 40 workhours_product_name: type: string maxLength: 255 workhours_product_purchase_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true workhours_product_purchase_price_currency: type: string nullable: true maxLength: 4 workhours_product_selling_price: type: string format: decimal pattern: ^-?\d{0,18}(?:\.\d{0,2})?$ nullable: true workhours_product_selling_price_currency: type: string nullable: true maxLength: 4 required: - workhours_product_name - workhours_product_uuid WorkorderDocument: type: object description: |- The {url, name} dict WorkorderDocumentsMixin.get_workorder_documents builds. properties: url: type: string name: type: string required: - name - url WorkorderOrder: type: object description: |- Overrides to_representation to localise start_date and end_date via the tenant's date_format setting. Set ``format_times = True`` on a subclass to also localise start_time and end_time. The localised fields are planned wall-clock values at the tenant, not absolute instants - the schema descriptions on the read side say so (see BaseOrderReadSerializer ISO twins for the machine-readable form). properties: id: type: integer readOnly: true order_id: type: string maxLength: 60 order_date: type: string readOnly: true order_type: type: string nullable: true maxLength: 30 order_reference: type: string nullable: true maxLength: 255 workorder_pdf_url: type: string nullable: true readOnly: true workorder_pdf_url_partner: type: array items: $ref: '#/components/schemas/WorkorderUrlPartner' readOnly: true orderlines: type: array items: $ref: '#/components/schemas/OrderLine' quotation: type: integer nullable: true last_update: type: string format: date-time readOnly: true last_status: type: string readOnly: true last_status_full: type: string nullable: true readOnly: true last_status_date: type: string format: date-time nullable: true readOnly: true statuscode_id: type: integer nullable: true readOnly: true color: type: string nullable: true readOnly: true text_color: type: string nullable: true readOnly: true uuid: type: string format: uuid start_date: type: string description: Display string in the tenant's configured date_format, not an ISO-8601 value. required: - color - id - last_status - last_status_date - last_status_full - order_date - order_id - orderlines - start_date - statuscode_id - text_color - workorder_pdf_url - workorder_pdf_url_partner WorkorderSignActivityRow: type: object description: |- assignedorderactivity rows as serialized for workorder signing. Mirrors AssignedOrderActivityPartOfTotalsSerializer output rather than referencing it: to_representation turns its time/date columns into member-format strings ('work_start' et al.), durations stay DRF duration strings, and neither method field carries a return annotation for the schema to read. adds the two keys OrderActivityAggregator.qs_to_activity augments each row with. properties: id: type: integer assigned_order: type: integer full_name: type: string nullable: true activity_date: type: string date: type: string nullable: true work_start: type: string nullable: true work_end: type: string nullable: true unforeseen_work_duration: type: string nullable: true unforeseen_work_description: type: string nullable: true travel_to: type: string nullable: true travel_back: type: string nullable: true distance_to: type: integer distance_back: type: integer extra_work: type: string nullable: true extra_work_description: type: string nullable: true distance_fixed_rate_amount: type: integer actual_work: type: string nullable: true is_partner: type: boolean partner_companycode: type: string nullable: true required: - activity_date - actual_work - assigned_order - date - distance_back - distance_fixed_rate_amount - distance_to - extra_work - extra_work_description - full_name - id - is_partner - partner_companycode - travel_back - travel_to - unforeseen_work_description - unforeseen_work_duration - work_end - work_start WorkorderSignExtraWorkRow: type: object description: the four activity keys copied into the extra-work summary rows. properties: full_name: type: string nullable: true extra_work: type: string nullable: true extra_work_description: type: string nullable: true is_partner: type: boolean required: - extra_work - extra_work_description - full_name - is_partner WorkorderUrlOrgOrder: type: object description: |- Documents the dict Order.get_workorder_url_org_order returns, as surfaced by OrderDetailSerializer.get_workorder_url_org_order. The method returns None outright when there is no org order to link to. properties: companycode: type: string url: type: string required: - companycode - url WorkorderUrlPartner: type: object description: |- The dict WorkorderUrlMixin.get_workorder_pdf_url_partner builds per partner, via Order.get_workorder_url_partner. properties: companycode: type: string url: type: string required: - companycode - url YearListResponse: type: object description: The `year_list` endpoint. properties: year_data: $ref: '#/components/schemas/YearListYearData' statuses_data: type: object additionalProperties: type: object properties: items: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc total: type: integer required: - items - total required: - statuses_data - year_data YearListYearData: type: object description: |- The fixed four-key summary OrderStatsBuilder.build_year_data returns. items is keyed by zero-padded month ('01'..'12'), statuses by matched statuscode. order_types is initialised to {} by build_year_data and never written to, so every live answer carries an empty object there - typed as a free-form map so that any key set passes the day the builder fills it. properties: total: type: integer items: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc statuses: type: object additionalProperties: type: object properties: count: type: integer perc: type: string required: - count - perc order_types: type: object additionalProperties: {} required: - items - order_types - statuses - total