From 2dedb60943c000afcbe34b55dfe3c84a33e59d16 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Thu, 23 Apr 2026 19:18:29 -0500 Subject: [PATCH 1/2] Refactor: Remove obsolete models and introduce DisposeScheduleRequest - Deleted the following models as they are no longer needed: - CreateStructureRequestStructureType - CreateTaxonomyRequest - CreateTaxonomyRequestTaxonomyType - DeleteAssociationRequest - DeleteElementRequest - DeleteStructureRequest - DeleteTaxonomyRequest - UpdateAssociationRequest - UpdateElementRequest - UpdateStructureRequest - UpdateTaxonomyRequest - UpdateElementRequestBalanceTypeType0 - UpdateElementRequestClassificationType0 - UpdateElementRequestPeriodTypeType0 - Introduced DisposeScheduleRequest model to handle disposal of schedules with attributes for structure ID, disposal date, memo, reason, sale proceeds, and related element IDs. --- .../op_create_associations.py | 265 -------------- .../op_create_element.py | 257 -------------- .../op_create_mapping_association.py | 12 +- .../op_create_structure.py | 257 -------------- .../op_create_taxonomy.py | 253 -------------- .../op_delete_association.py | 257 -------------- .../op_delete_element.py | 257 -------------- .../op_delete_taxonomy.py | 257 -------------- ...te_structure.py => op_dispose_schedule.py} | 78 +++-- .../op_update_association.py | 265 -------------- .../op_update_element.py | 297 ---------------- .../op_update_structure.py | 253 -------------- .../op_update_taxonomy.py | 265 -------------- robosystems_client/clients/ledger_client.py | 203 +---------- robosystems_client/models/__init__.py | 56 +-- .../models/bulk_association_item.py | 196 ----------- .../bulk_association_item_association_type.py | 10 - .../bulk_create_associations_request.py | 86 ----- .../models/create_element_request.py | 325 ------------------ .../create_element_request_balance_type.py | 9 - .../create_element_request_classification.py | 22 -- .../create_element_request_element_type.py | 12 - .../create_element_request_period_type.py | 9 - .../models/create_element_request_source.py | 16 - .../models/create_structure_request.py | 102 ------ ...create_structure_request_structure_type.py | 14 - .../models/create_taxonomy_request.py | 154 --------- .../create_taxonomy_request_taxonomy_type.py | 11 - .../models/delete_association_request.py | 62 ---- .../models/delete_element_request.py | 64 ---- .../models/delete_structure_request.py | 62 ---- .../models/delete_taxonomy_request.py | 63 ---- .../models/dispose_schedule_request.py | 162 +++++++++ .../models/update_association_request.py | 146 -------- .../models/update_element_request.py | 279 --------------- ...ate_element_request_balance_type_type_0.py | 9 - ...e_element_request_classification_type_0.py | 22 -- ...date_element_request_period_type_type_0.py | 9 - .../models/update_structure_request.py | 105 ------ .../models/update_taxonomy_request.py | 127 ------- tests/test_ledger_client.py | 220 ------------ 41 files changed, 242 insertions(+), 5286 deletions(-) delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_create_associations.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_create_element.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_create_structure.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_create_taxonomy.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_delete_association.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_delete_element.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy.py rename robosystems_client/api/extensions_robo_ledger/{op_delete_structure.py => op_dispose_schedule.py} (62%) delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_update_association.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_update_element.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_update_structure.py delete mode 100644 robosystems_client/api/extensions_robo_ledger/op_update_taxonomy.py delete mode 100644 robosystems_client/models/bulk_association_item.py delete mode 100644 robosystems_client/models/bulk_association_item_association_type.py delete mode 100644 robosystems_client/models/bulk_create_associations_request.py delete mode 100644 robosystems_client/models/create_element_request.py delete mode 100644 robosystems_client/models/create_element_request_balance_type.py delete mode 100644 robosystems_client/models/create_element_request_classification.py delete mode 100644 robosystems_client/models/create_element_request_element_type.py delete mode 100644 robosystems_client/models/create_element_request_period_type.py delete mode 100644 robosystems_client/models/create_element_request_source.py delete mode 100644 robosystems_client/models/create_structure_request.py delete mode 100644 robosystems_client/models/create_structure_request_structure_type.py delete mode 100644 robosystems_client/models/create_taxonomy_request.py delete mode 100644 robosystems_client/models/create_taxonomy_request_taxonomy_type.py delete mode 100644 robosystems_client/models/delete_association_request.py delete mode 100644 robosystems_client/models/delete_element_request.py delete mode 100644 robosystems_client/models/delete_structure_request.py delete mode 100644 robosystems_client/models/delete_taxonomy_request.py create mode 100644 robosystems_client/models/dispose_schedule_request.py delete mode 100644 robosystems_client/models/update_association_request.py delete mode 100644 robosystems_client/models/update_element_request.py delete mode 100644 robosystems_client/models/update_element_request_balance_type_type_0.py delete mode 100644 robosystems_client/models/update_element_request_classification_type_0.py delete mode 100644 robosystems_client/models/update_element_request_period_type_type_0.py delete mode 100644 robosystems_client/models/update_structure_request.py delete mode 100644 robosystems_client/models/update_taxonomy_request.py diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_associations.py b/robosystems_client/api/extensions_robo_ledger/op_create_associations.py deleted file mode 100644 index ccdb1b8..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_create_associations.py +++ /dev/null @@ -1,265 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.bulk_create_associations_request import BulkCreateAssociationsRequest -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: BulkCreateAssociationsRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/create-associations".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: BulkCreateAssociationsRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Create Associations (Bulk) - - Create N associations in a single structure, atomically. Handles 50+ presentation arcs, 25+ - calculation arcs, or a full table linkbase in one call. Any failed row rolls back the batch. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (BulkCreateAssociationsRequest): Bulk create associations within a single structure. - Atomic — any - failed row rolls back the whole batch. Handles 50+ presentation arcs, - 25+ calculation arcs, or a full table linkbase in one call. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: BulkCreateAssociationsRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Create Associations (Bulk) - - Create N associations in a single structure, atomically. Handles 50+ presentation arcs, 25+ - calculation arcs, or a full table linkbase in one call. Any failed row rolls back the batch. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (BulkCreateAssociationsRequest): Bulk create associations within a single structure. - Atomic — any - failed row rolls back the whole batch. Handles 50+ presentation arcs, - 25+ calculation arcs, or a full table linkbase in one call. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: BulkCreateAssociationsRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Create Associations (Bulk) - - Create N associations in a single structure, atomically. Handles 50+ presentation arcs, 25+ - calculation arcs, or a full table linkbase in one call. Any failed row rolls back the batch. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (BulkCreateAssociationsRequest): Bulk create associations within a single structure. - Atomic — any - failed row rolls back the whole batch. Handles 50+ presentation arcs, - 25+ calculation arcs, or a full table linkbase in one call. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: BulkCreateAssociationsRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Create Associations (Bulk) - - Create N associations in a single structure, atomically. Handles 50+ presentation arcs, 25+ - calculation arcs, or a full table linkbase in one call. Any failed row rolls back the batch. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (BulkCreateAssociationsRequest): Bulk create associations within a single structure. - Atomic — any - failed row rolls back the whole batch. Handles 50+ presentation arcs, - 25+ calculation arcs, or a full table linkbase in one call. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_element.py b/robosystems_client/api/extensions_robo_ledger/op_create_element.py deleted file mode 100644 index 6569299..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_create_element.py +++ /dev/null @@ -1,257 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.create_element_request import CreateElementRequest -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: CreateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/create-element".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Create Element - - Create an element within a taxonomy. For chart-of-accounts taxonomies this is how native accounts - are added. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateElementRequest): Create a new Element within a taxonomy. For chart-of-accounts - taxonomies this is how native accounts are added. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Create Element - - Create an element within a taxonomy. For chart-of-accounts taxonomies this is how native accounts - are added. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateElementRequest): Create a new Element within a taxonomy. For chart-of-accounts - taxonomies this is how native accounts are added. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Create Element - - Create an element within a taxonomy. For chart-of-accounts taxonomies this is how native accounts - are added. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateElementRequest): Create a new Element within a taxonomy. For chart-of-accounts - taxonomies this is how native accounts are added. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Create Element - - Create an element within a taxonomy. For chart-of-accounts taxonomies this is how native accounts - are added. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateElementRequest): Create a new Element within a taxonomy. For chart-of-accounts - taxonomies this is how native accounts are added. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_mapping_association.py b/robosystems_client/api/extensions_robo_ledger/op_create_mapping_association.py index 4d37c6d..0d222f6 100644 --- a/robosystems_client/api/extensions_robo_ledger/op_create_mapping_association.py +++ b/robosystems_client/api/extensions_robo_ledger/op_create_mapping_association.py @@ -110,8 +110,7 @@ def sync_detailed( ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: """Create Mapping Association - Link a chart-of-accounts element to a US GAAP reporting concept. For bulk associations - (presentation/calculation linkbases, 50+ arcs at once) use `create-associations` instead. + Link a chart-of-accounts element to a US GAAP reporting concept. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -155,8 +154,7 @@ def sync( ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: """Create Mapping Association - Link a chart-of-accounts element to a US GAAP reporting concept. For bulk associations - (presentation/calculation linkbases, 50+ arcs at once) use `create-associations` instead. + Link a chart-of-accounts element to a US GAAP reporting concept. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -195,8 +193,7 @@ async def asyncio_detailed( ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: """Create Mapping Association - Link a chart-of-accounts element to a US GAAP reporting concept. For bulk associations - (presentation/calculation linkbases, 50+ arcs at once) use `create-associations` instead. + Link a chart-of-accounts element to a US GAAP reporting concept. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -238,8 +235,7 @@ async def asyncio( ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: """Create Mapping Association - Link a chart-of-accounts element to a US GAAP reporting concept. For bulk associations - (presentation/calculation linkbases, 50+ arcs at once) use `create-associations` instead. + Link a chart-of-accounts element to a US GAAP reporting concept. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_structure.py b/robosystems_client/api/extensions_robo_ledger/op_create_structure.py deleted file mode 100644 index 5fc46e8..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_create_structure.py +++ /dev/null @@ -1,257 +0,0 @@ -from http import HTTPStatus -from typing import Any -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.create_structure_request import CreateStructureRequest -from ...models.error_response import ErrorResponse -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: CreateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/create-structure".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = ErrorResponse.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = ErrorResponse.from_dict(response.json()) - - return response_401 - - if response.status_code == 403: - response_403 = ErrorResponse.from_dict(response.json()) - - return response_403 - - if response.status_code == 404: - response_404 = ErrorResponse.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = ErrorResponse.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = ErrorResponse.from_dict(response.json()) - - return response_429 - - if response.status_code == 500: - response_500 = ErrorResponse.from_dict(response.json()) - - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - """Create Structure - - Structures organize elements within a taxonomy. Types: `statement`, `mapping`, `schedule`, - `presentation`, `calculation`. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateStructureRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[ErrorResponse | HTTPValidationError | OperationEnvelope] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - """Create Structure - - Structures organize elements within a taxonomy. Types: `statement`, `mapping`, `schedule`, - `presentation`, `calculation`. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateStructureRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - ErrorResponse | HTTPValidationError | OperationEnvelope - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - """Create Structure - - Structures organize elements within a taxonomy. Types: `statement`, `mapping`, `schedule`, - `presentation`, `calculation`. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateStructureRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[ErrorResponse | HTTPValidationError | OperationEnvelope] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - """Create Structure - - Structures organize elements within a taxonomy. Types: `statement`, `mapping`, `schedule`, - `presentation`, `calculation`. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateStructureRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - ErrorResponse | HTTPValidationError | OperationEnvelope - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy.py b/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy.py deleted file mode 100644 index 596a208..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy.py +++ /dev/null @@ -1,253 +0,0 @@ -from http import HTTPStatus -from typing import Any -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.create_taxonomy_request import CreateTaxonomyRequest -from ...models.error_response import ErrorResponse -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: CreateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/create-taxonomy".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = ErrorResponse.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = ErrorResponse.from_dict(response.json()) - - return response_401 - - if response.status_code == 403: - response_403 = ErrorResponse.from_dict(response.json()) - - return response_403 - - if response.status_code == 404: - response_404 = ErrorResponse.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = ErrorResponse.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = ErrorResponse.from_dict(response.json()) - - return response_429 - - if response.status_code == 500: - response_500 = ErrorResponse.from_dict(response.json()) - - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - """Create Taxonomy - - - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateTaxonomyRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[ErrorResponse | HTTPValidationError | OperationEnvelope] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - """Create Taxonomy - - - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateTaxonomyRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - ErrorResponse | HTTPValidationError | OperationEnvelope - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[ErrorResponse | HTTPValidationError | OperationEnvelope]: - """Create Taxonomy - - - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateTaxonomyRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[ErrorResponse | HTTPValidationError | OperationEnvelope] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: CreateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> ErrorResponse | HTTPValidationError | OperationEnvelope | None: - """Create Taxonomy - - - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (CreateTaxonomyRequest): - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - ErrorResponse | HTTPValidationError | OperationEnvelope - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_delete_association.py b/robosystems_client/api/extensions_robo_ledger/op_delete_association.py deleted file mode 100644 index c8781c1..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_delete_association.py +++ /dev/null @@ -1,257 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.delete_association_request import DeleteAssociationRequest -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: DeleteAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/delete-association".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Association - - Hard-delete an association. Generalizes delete-mapping-association to all association types - (presentation, calculation, mapping). - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteAssociationRequest): Hard delete — associations are edges and are cheap to - recreate. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Association - - Hard-delete an association. Generalizes delete-mapping-association to all association types - (presentation, calculation, mapping). - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteAssociationRequest): Hard delete — associations are edges and are cheap to - recreate. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Association - - Hard-delete an association. Generalizes delete-mapping-association to all association types - (presentation, calculation, mapping). - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteAssociationRequest): Hard delete — associations are edges and are cheap to - recreate. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Association - - Hard-delete an association. Generalizes delete-mapping-association to all association types - (presentation, calculation, mapping). - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteAssociationRequest): Hard delete — associations are edges and are cheap to - recreate. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_delete_element.py b/robosystems_client/api/extensions_robo_ledger/op_delete_element.py deleted file mode 100644 index 13520c3..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_delete_element.py +++ /dev/null @@ -1,257 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.delete_element_request import DeleteElementRequest -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: DeleteElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/delete-element".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Element - - Soft-delete an element (sets `is_active=false`). Historical line items referencing it remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteElementRequest): Soft delete — sets `is_active=false`. Historical line items - referencing this element remain valid; new line items cannot use an - inactive element. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Element - - Soft-delete an element (sets `is_active=false`). Historical line items referencing it remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteElementRequest): Soft delete — sets `is_active=false`. Historical line items - referencing this element remain valid; new line items cannot use an - inactive element. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Element - - Soft-delete an element (sets `is_active=false`). Historical line items referencing it remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteElementRequest): Soft delete — sets `is_active=false`. Historical line items - referencing this element remain valid; new line items cannot use an - inactive element. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Element - - Soft-delete an element (sets `is_active=false`). Historical line items referencing it remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteElementRequest): Soft delete — sets `is_active=false`. Historical line items - referencing this element remain valid; new line items cannot use an - inactive element. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy.py b/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy.py deleted file mode 100644 index f1dcf5f..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy.py +++ /dev/null @@ -1,257 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.delete_taxonomy_request import DeleteTaxonomyRequest -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: DeleteTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/delete-taxonomy".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Taxonomy - - Soft-delete a taxonomy (sets `is_active=false`). Historical references remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteTaxonomyRequest): Soft delete — sets `is_active=false`. Historical references - remain - valid. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Taxonomy - - Soft-delete a taxonomy (sets `is_active=false`). Historical references remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteTaxonomyRequest): Soft delete — sets `is_active=false`. Historical references - remain - valid. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Taxonomy - - Soft-delete a taxonomy (sets `is_active=false`). Historical references remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteTaxonomyRequest): Soft delete — sets `is_active=false`. Historical references - remain - valid. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: DeleteTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Taxonomy - - Soft-delete a taxonomy (sets `is_active=false`). Historical references remain valid. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (DeleteTaxonomyRequest): Soft delete — sets `is_active=false`. Historical references - remain - valid. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_delete_structure.py b/robosystems_client/api/extensions_robo_ledger/op_dispose_schedule.py similarity index 62% rename from robosystems_client/api/extensions_robo_ledger/op_delete_structure.py rename to robosystems_client/api/extensions_robo_ledger/op_dispose_schedule.py index f8808bb..4c70d33 100644 --- a/robosystems_client/api/extensions_robo_ledger/op_delete_structure.py +++ b/robosystems_client/api/extensions_robo_ledger/op_dispose_schedule.py @@ -6,7 +6,7 @@ from ... import errors from ...client import AuthenticatedClient, Client -from ...models.delete_structure_request import DeleteStructureRequest +from ...models.dispose_schedule_request import DisposeScheduleRequest from ...models.http_validation_error import HTTPValidationError from ...models.operation_envelope import OperationEnvelope from ...models.operation_error import OperationError @@ -16,7 +16,7 @@ def _get_kwargs( graph_id: str, *, - body: DeleteStructureRequest, + body: DisposeScheduleRequest, idempotency_key: None | str | Unset = UNSET, ) -> dict[str, Any]: headers: dict[str, Any] = {} @@ -25,7 +25,7 @@ def _get_kwargs( _kwargs: dict[str, Any] = { "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/delete-structure".format( + "url": "/extensions/roboledger/{graph_id}/operations/dispose-schedule".format( graph_id=quote(str(graph_id), safe=""), ), } @@ -103,13 +103,16 @@ def sync_detailed( graph_id: str, *, client: AuthenticatedClient, - body: DeleteStructureRequest, + body: DisposeScheduleRequest, idempotency_key: None | str | Unset = UNSET, ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Structure + """Dispose Schedule (Sale or Abandonment) - Soft-delete a structure (sets `is_active=false`). Associations referencing it are effectively - orphaned. + Atomically truncate a schedule past the disposal date and create a balanced disposal closing entry. + Computes accumulated depreciation from the schedule's own facts, derives net book value and + gain/loss, removes forward facts, and books the disposal entry in one call. Use when an asset is + sold or abandoned before the schedule runs to completion. For abandonment with no proceeds, omit + `sale_proceeds` and `proceeds_element_id`. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -117,7 +120,12 @@ def sync_detailed( Args: graph_id (str): idempotency_key (None | str | Unset): - body (DeleteStructureRequest): Soft delete — sets `is_active=false`. + body (DisposeScheduleRequest): Dispose a schedule early — combines truncation with a + disposal closing entry. + + Computes net book value from the schedule's own facts, truncates forward + periods, and creates a balanced disposal entry in one atomic operation. + Use when an asset is sold or abandoned before the schedule runs to completion. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -144,13 +152,16 @@ def sync( graph_id: str, *, client: AuthenticatedClient, - body: DeleteStructureRequest, + body: DisposeScheduleRequest, idempotency_key: None | str | Unset = UNSET, ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Structure + """Dispose Schedule (Sale or Abandonment) - Soft-delete a structure (sets `is_active=false`). Associations referencing it are effectively - orphaned. + Atomically truncate a schedule past the disposal date and create a balanced disposal closing entry. + Computes accumulated depreciation from the schedule's own facts, derives net book value and + gain/loss, removes forward facts, and books the disposal entry in one call. Use when an asset is + sold or abandoned before the schedule runs to completion. For abandonment with no proceeds, omit + `sale_proceeds` and `proceeds_element_id`. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -158,7 +169,12 @@ def sync( Args: graph_id (str): idempotency_key (None | str | Unset): - body (DeleteStructureRequest): Soft delete — sets `is_active=false`. + body (DisposeScheduleRequest): Dispose a schedule early — combines truncation with a + disposal closing entry. + + Computes net book value from the schedule's own facts, truncates forward + periods, and creates a balanced disposal entry in one atomic operation. + Use when an asset is sold or abandoned before the schedule runs to completion. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -180,13 +196,16 @@ async def asyncio_detailed( graph_id: str, *, client: AuthenticatedClient, - body: DeleteStructureRequest, + body: DisposeScheduleRequest, idempotency_key: None | str | Unset = UNSET, ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Delete Structure + """Dispose Schedule (Sale or Abandonment) - Soft-delete a structure (sets `is_active=false`). Associations referencing it are effectively - orphaned. + Atomically truncate a schedule past the disposal date and create a balanced disposal closing entry. + Computes accumulated depreciation from the schedule's own facts, derives net book value and + gain/loss, removes forward facts, and books the disposal entry in one call. Use when an asset is + sold or abandoned before the schedule runs to completion. For abandonment with no proceeds, omit + `sale_proceeds` and `proceeds_element_id`. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -194,7 +213,12 @@ async def asyncio_detailed( Args: graph_id (str): idempotency_key (None | str | Unset): - body (DeleteStructureRequest): Soft delete — sets `is_active=false`. + body (DisposeScheduleRequest): Dispose a schedule early — combines truncation with a + disposal closing entry. + + Computes net book value from the schedule's own facts, truncates forward + periods, and creates a balanced disposal entry in one atomic operation. + Use when an asset is sold or abandoned before the schedule runs to completion. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -219,13 +243,16 @@ async def asyncio( graph_id: str, *, client: AuthenticatedClient, - body: DeleteStructureRequest, + body: DisposeScheduleRequest, idempotency_key: None | str | Unset = UNSET, ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Delete Structure + """Dispose Schedule (Sale or Abandonment) - Soft-delete a structure (sets `is_active=false`). Associations referencing it are effectively - orphaned. + Atomically truncate a schedule past the disposal date and create a balanced disposal closing entry. + Computes accumulated depreciation from the schedule's own facts, derives net book value and + gain/loss, removes forward facts, and books the disposal entry in one call. Use when an asset is + sold or abandoned before the schedule runs to completion. For abandonment with no proceeds, omit + `sale_proceeds` and `proceeds_element_id`. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -233,7 +260,12 @@ async def asyncio( Args: graph_id (str): idempotency_key (None | str | Unset): - body (DeleteStructureRequest): Soft delete — sets `is_active=false`. + body (DisposeScheduleRequest): Dispose a schedule early — combines truncation with a + disposal closing entry. + + Computes net book value from the schedule's own facts, truncates forward + periods, and creates a balanced disposal entry in one atomic operation. + Use when an asset is sold or abandoned before the schedule runs to completion. Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. diff --git a/robosystems_client/api/extensions_robo_ledger/op_update_association.py b/robosystems_client/api/extensions_robo_ledger/op_update_association.py deleted file mode 100644 index 3d6007a..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_update_association.py +++ /dev/null @@ -1,265 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...models.update_association_request import UpdateAssociationRequest -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: UpdateAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/update-association".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Association - - Update mutable fields on an association. `from_element_id`, `to_element_id`, `association_type`, and - `structure_id` are immutable — delete and recreate instead. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateAssociationRequest): Update mutable fields on an association. - `from_element_id`, - `to_element_id`, and `association_type` are immutable — delete and - recreate instead. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Association - - Update mutable fields on an association. `from_element_id`, `to_element_id`, `association_type`, and - `structure_id` are immutable — delete and recreate instead. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateAssociationRequest): Update mutable fields on an association. - `from_element_id`, - `to_element_id`, and `association_type` are immutable — delete and - recreate instead. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Association - - Update mutable fields on an association. `from_element_id`, `to_element_id`, `association_type`, and - `structure_id` are immutable — delete and recreate instead. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateAssociationRequest): Update mutable fields on an association. - `from_element_id`, - `to_element_id`, and `association_type` are immutable — delete and - recreate instead. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateAssociationRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Association - - Update mutable fields on an association. `from_element_id`, `to_element_id`, `association_type`, and - `structure_id` are immutable — delete and recreate instead. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateAssociationRequest): Update mutable fields on an association. - `from_element_id`, - `to_element_id`, and `association_type` are immutable — delete and - recreate instead. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_update_element.py b/robosystems_client/api/extensions_robo_ledger/op_update_element.py deleted file mode 100644 index 29a5dbc..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_update_element.py +++ /dev/null @@ -1,297 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...models.update_element_request import UpdateElementRequest -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: UpdateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/update-element".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Element - - Update mutable fields on an element. `taxonomy_id` and `source` are immutable. Reparenting cascades - path/depth to descendants. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateElementRequest): Update mutable fields on an element. `taxonomy_id` and - `source` are - immutable. `parent_id` honors `model_dump(exclude_unset=True)` semantics: - omit the field to leave unchanged, pass `null` to clear the parent - (make root). - - ``classification`` updates the element's primary FASB - elementsOfFinancialStatements assignment (in ``element_classifications``, - not a direct column on ``elements``). Omit to leave unchanged. Passing a - value replaces the current primary EFS assignment; there is no - set-to-null semantics (use the UI/admin path for full classification - teardown — here we only support correction of a misclassified account). - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Element - - Update mutable fields on an element. `taxonomy_id` and `source` are immutable. Reparenting cascades - path/depth to descendants. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateElementRequest): Update mutable fields on an element. `taxonomy_id` and - `source` are - immutable. `parent_id` honors `model_dump(exclude_unset=True)` semantics: - omit the field to leave unchanged, pass `null` to clear the parent - (make root). - - ``classification`` updates the element's primary FASB - elementsOfFinancialStatements assignment (in ``element_classifications``, - not a direct column on ``elements``). Omit to leave unchanged. Passing a - value replaces the current primary EFS assignment; there is no - set-to-null semantics (use the UI/admin path for full classification - teardown — here we only support correction of a misclassified account). - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Element - - Update mutable fields on an element. `taxonomy_id` and `source` are immutable. Reparenting cascades - path/depth to descendants. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateElementRequest): Update mutable fields on an element. `taxonomy_id` and - `source` are - immutable. `parent_id` honors `model_dump(exclude_unset=True)` semantics: - omit the field to leave unchanged, pass `null` to clear the parent - (make root). - - ``classification`` updates the element's primary FASB - elementsOfFinancialStatements assignment (in ``element_classifications``, - not a direct column on ``elements``). Omit to leave unchanged. Passing a - value replaces the current primary EFS assignment; there is no - set-to-null semantics (use the UI/admin path for full classification - teardown — here we only support correction of a misclassified account). - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateElementRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Element - - Update mutable fields on an element. `taxonomy_id` and `source` are immutable. Reparenting cascades - path/depth to descendants. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateElementRequest): Update mutable fields on an element. `taxonomy_id` and - `source` are - immutable. `parent_id` honors `model_dump(exclude_unset=True)` semantics: - omit the field to leave unchanged, pass `null` to clear the parent - (make root). - - ``classification`` updates the element's primary FASB - elementsOfFinancialStatements assignment (in ``element_classifications``, - not a direct column on ``elements``). Omit to leave unchanged. Passing a - value replaces the current primary EFS assignment; there is no - set-to-null semantics (use the UI/admin path for full classification - teardown — here we only support correction of a misclassified account). - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_update_structure.py b/robosystems_client/api/extensions_robo_ledger/op_update_structure.py deleted file mode 100644 index 98977d0..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_update_structure.py +++ /dev/null @@ -1,253 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...models.update_structure_request import UpdateStructureRequest -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: UpdateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/update-structure".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Structure - - Update mutable fields on a structure. `structure_type` and `taxonomy_id` are immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateStructureRequest): Update mutable fields on a structure. `structure_type` and - `taxonomy_id` are immutable. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Structure - - Update mutable fields on a structure. `structure_type` and `taxonomy_id` are immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateStructureRequest): Update mutable fields on a structure. `structure_type` and - `taxonomy_id` are immutable. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Structure - - Update mutable fields on a structure. `structure_type` and `taxonomy_id` are immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateStructureRequest): Update mutable fields on a structure. `structure_type` and - `taxonomy_id` are immutable. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateStructureRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Structure - - Update mutable fields on a structure. `structure_type` and `taxonomy_id` are immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateStructureRequest): Update mutable fields on a structure. `structure_type` and - `taxonomy_id` are immutable. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy.py b/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy.py deleted file mode 100644 index 8e7b11c..0000000 --- a/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy.py +++ /dev/null @@ -1,265 +0,0 @@ -from http import HTTPStatus -from typing import Any, cast -from urllib.parse import quote - -import httpx - -from ... import errors -from ...client import AuthenticatedClient, Client -from ...models.http_validation_error import HTTPValidationError -from ...models.operation_envelope import OperationEnvelope -from ...models.operation_error import OperationError -from ...models.update_taxonomy_request import UpdateTaxonomyRequest -from ...types import UNSET, Response, Unset - - -def _get_kwargs( - graph_id: str, - *, - body: UpdateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> dict[str, Any]: - headers: dict[str, Any] = {} - if not isinstance(idempotency_key, Unset): - headers["Idempotency-Key"] = idempotency_key - - _kwargs: dict[str, Any] = { - "method": "post", - "url": "/extensions/roboledger/{graph_id}/operations/update-taxonomy".format( - graph_id=quote(str(graph_id), safe=""), - ), - } - - _kwargs["json"] = body.to_dict() - - headers["Content-Type"] = "application/json" - - _kwargs["headers"] = headers - return _kwargs - - -def _parse_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - if response.status_code == 200: - response_200 = OperationEnvelope.from_dict(response.json()) - - return response_200 - - if response.status_code == 400: - response_400 = OperationError.from_dict(response.json()) - - return response_400 - - if response.status_code == 401: - response_401 = cast(Any, None) - return response_401 - - if response.status_code == 403: - response_403 = cast(Any, None) - return response_403 - - if response.status_code == 404: - response_404 = OperationError.from_dict(response.json()) - - return response_404 - - if response.status_code == 409: - response_409 = OperationError.from_dict(response.json()) - - return response_409 - - if response.status_code == 422: - response_422 = HTTPValidationError.from_dict(response.json()) - - return response_422 - - if response.status_code == 429: - response_429 = cast(Any, None) - return response_429 - - if response.status_code == 500: - response_500 = cast(Any, None) - return response_500 - - if client.raise_on_unexpected_status: - raise errors.UnexpectedStatus(response.status_code, response.content) - else: - return None - - -def _build_response( - *, client: AuthenticatedClient | Client, response: httpx.Response -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - return Response( - status_code=HTTPStatus(response.status_code), - content=response.content, - headers=response.headers, - parsed=_parse_response(client=client, response=response), - ) - - -def sync_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Taxonomy - - Update mutable fields on a taxonomy. `taxonomy_type` is immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateTaxonomyRequest): Update mutable fields on a taxonomy. `taxonomy_type` is - immutable — - changing it is not the same operation as editing a taxonomy; deactivate - and create a new one instead. Only provided (non-null) fields are - applied. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = client.get_httpx_client().request( - **kwargs, - ) - - return _build_response(client=client, response=response) - - -def sync( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Taxonomy - - Update mutable fields on a taxonomy. `taxonomy_type` is immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateTaxonomyRequest): Update mutable fields on a taxonomy. `taxonomy_type` is - immutable — - changing it is not the same operation as editing a taxonomy; deactivate - and create a new one instead. Only provided (non-null) fields are - applied. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return sync_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ).parsed - - -async def asyncio_detailed( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: - """Update Taxonomy - - Update mutable fields on a taxonomy. `taxonomy_type` is immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateTaxonomyRequest): Update mutable fields on a taxonomy. `taxonomy_type` is - immutable — - changing it is not the same operation as editing a taxonomy; deactivate - and create a new one instead. Only provided (non-null) fields are - applied. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Response[Any | HTTPValidationError | OperationEnvelope | OperationError] - """ - - kwargs = _get_kwargs( - graph_id=graph_id, - body=body, - idempotency_key=idempotency_key, - ) - - response = await client.get_async_httpx_client().request(**kwargs) - - return _build_response(client=client, response=response) - - -async def asyncio( - graph_id: str, - *, - client: AuthenticatedClient, - body: UpdateTaxonomyRequest, - idempotency_key: None | str | Unset = UNSET, -) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: - """Update Taxonomy - - Update mutable fields on a taxonomy. `taxonomy_type` is immutable. - - **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours - return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. - - Args: - graph_id (str): - idempotency_key (None | str | Unset): - body (UpdateTaxonomyRequest): Update mutable fields on a taxonomy. `taxonomy_type` is - immutable — - changing it is not the same operation as editing a taxonomy; deactivate - and create a new one instead. Only provided (non-null) fields are - applied. - - Raises: - errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. - httpx.TimeoutException: If the request takes longer than Client.timeout. - - Returns: - Any | HTTPValidationError | OperationEnvelope | OperationError - """ - - return ( - await asyncio_detailed( - graph_id=graph_id, - client=client, - body=body, - idempotency_key=idempotency_key, - ) - ).parsed diff --git a/robosystems_client/clients/ledger_client.py b/robosystems_client/clients/ledger_client.py index 6ae793d..f7a0b83 100644 --- a/robosystems_client/clients/ledger_client.py +++ b/robosystems_client/clients/ledger_client.py @@ -47,12 +47,6 @@ from ..api.extensions_robo_ledger.op_create_information_block import ( sync_detailed as op_create_information_block, ) -from ..api.extensions_robo_ledger.op_create_structure import ( - sync_detailed as op_create_structure, -) -from ..api.extensions_robo_ledger.op_create_taxonomy import ( - sync_detailed as op_create_taxonomy, -) from ..api.extensions_robo_ledger.op_delete_mapping_association import ( sync_detailed as op_delete_mapping_association, ) @@ -68,24 +62,12 @@ from ..api.extensions_robo_ledger.op_truncate_schedule import ( sync_detailed as op_truncate_schedule, ) -from ..api.extensions_robo_ledger.op_update_association import ( - sync_detailed as op_update_association, -) -from ..api.extensions_robo_ledger.op_update_element import ( - sync_detailed as op_update_element, -) from ..api.extensions_robo_ledger.op_update_entity import ( sync_detailed as op_update_entity, ) from ..api.extensions_robo_ledger.op_update_information_block import ( sync_detailed as op_update_information_block, ) -from ..api.extensions_robo_ledger.op_update_structure import ( - sync_detailed as op_update_structure, -) -from ..api.extensions_robo_ledger.op_update_taxonomy import ( - sync_detailed as op_update_taxonomy, -) from ..api.extensions_robo_ledger.op_add_publish_list_members import ( sync_detailed as op_add_publish_list_members, ) @@ -113,12 +95,6 @@ from ..api.extensions_robo_ledger.op_update_publish_list import ( sync_detailed as op_update_publish_list, ) -from ..api.extensions_robo_ledger.op_create_associations import ( - sync_detailed as op_create_associations, -) -from ..api.extensions_robo_ledger.op_create_element import ( - sync_detailed as op_create_element, -) from ..api.extensions_robo_ledger.op_create_journal_entry import ( sync_detailed as op_create_journal_entry, ) @@ -128,24 +104,12 @@ from ..api.extensions_robo_ledger.op_link_entity_taxonomy import ( sync_detailed as op_link_entity_taxonomy, ) -from ..api.extensions_robo_ledger.op_delete_association import ( - sync_detailed as op_delete_association, -) -from ..api.extensions_robo_ledger.op_delete_element import ( - sync_detailed as op_delete_element, -) from ..api.extensions_robo_ledger.op_delete_journal_entry import ( sync_detailed as op_delete_journal_entry, ) from ..api.extensions_robo_ledger.op_delete_information_block import ( sync_detailed as op_delete_information_block, ) -from ..api.extensions_robo_ledger.op_delete_structure import ( - sync_detailed as op_delete_structure, -) -from ..api.extensions_robo_ledger.op_delete_taxonomy import ( - sync_detailed as op_delete_taxonomy, -) from ..api.extensions_robo_ledger.op_reverse_journal_entry import ( sync_detailed as op_reverse_journal_entry, ) @@ -218,31 +182,20 @@ ) from ..models.add_publish_list_members_operation import AddPublishListMembersOperation from ..models.auto_map_elements_operation import AutoMapElementsOperation -from ..models.bulk_association_item import BulkAssociationItem -from ..models.bulk_create_associations_request import BulkCreateAssociationsRequest -from ..models.create_element_request import CreateElementRequest from ..models.create_journal_entry_request import CreateJournalEntryRequest from ..models.create_transaction_request import CreateTransactionRequest -from ..models.delete_association_request import DeleteAssociationRequest -from ..models.delete_element_request import DeleteElementRequest from ..models.delete_journal_entry_request import DeleteJournalEntryRequest from ..models.delete_information_block_request import DeleteInformationBlockRequest from ..models.delete_information_block_request_payload import ( DeleteInformationBlockRequestPayload, ) -from ..models.delete_structure_request import DeleteStructureRequest -from ..models.delete_taxonomy_request import DeleteTaxonomyRequest from ..models.link_entity_taxonomy_request import LinkEntityTaxonomyRequest from ..models.reverse_journal_entry_request import ReverseJournalEntryRequest -from ..models.update_association_request import UpdateAssociationRequest -from ..models.update_element_request import UpdateElementRequest from ..models.update_journal_entry_request import UpdateJournalEntryRequest from ..models.update_information_block_request import UpdateInformationBlockRequest from ..models.update_information_block_request_payload import ( UpdateInformationBlockRequestPayload, ) -from ..models.update_structure_request import UpdateStructureRequest -from ..models.update_taxonomy_request import UpdateTaxonomyRequest from ..models.close_period_operation import ClosePeriodOperation from ..models.create_closing_entry_operation import CreateClosingEntryOperation from ..models.create_view_request import CreateViewRequest @@ -257,11 +210,6 @@ from ..models.create_information_block_request_payload import ( CreateInformationBlockRequestPayload, ) -from ..models.create_structure_request import CreateStructureRequest -from ..models.create_structure_request_structure_type import ( - CreateStructureRequestStructureType, -) -from ..models.create_taxonomy_request import CreateTaxonomyRequest from ..models.delete_mapping_association_operation import ( DeleteMappingAssociationOperation, ) @@ -583,32 +531,26 @@ def list_taxonomies( data = self._query(graph_id, LIST_TAXONOMIES_QUERY, {"taxonomyType": taxonomy_type}) return parse_taxonomies(data) - def create_taxonomy(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Create a new taxonomy (used for CoA + mapping taxonomies).""" - request = CreateTaxonomyRequest.from_dict(body) - response = op_create_taxonomy( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Create taxonomy", response) - return envelope.result or {} - - def update_taxonomy(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Update mutable fields on a taxonomy. taxonomy_type is immutable.""" - request = UpdateTaxonomyRequest.from_dict(body) - response = op_update_taxonomy( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Update taxonomy", response) - return envelope.result or {} + def create_taxonomy_block( + self, graph_id: str, body: dict[str, Any] + ) -> dict[str, Any]: + """Create a taxonomy block atomically (taxonomy + structures + + elements + associations + rules in one envelope). - def delete_taxonomy(self, graph_id: str, taxonomy_id: str) -> dict[str, Any]: - """Soft-delete a taxonomy (is_active=false).""" - body = DeleteTaxonomyRequest(taxonomy_id=taxonomy_id) - response = op_delete_taxonomy( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Delete taxonomy", response) - return envelope.result or {} + Until the SDK is regenerated with a typed ``op_create_taxonomy_block``, + this facade method POSTs the body directly via the shared httpx + client. Returns the unwrapped ``TaxonomyBlockEnvelope`` dict. + """ + path = f"/extensions/roboledger/{graph_id}/operations/create-taxonomy-block" + client = self._get_client() + httpx_client = client.get_httpx_client() + response = httpx_client.post(path, json=body) + if response.status_code not in (HTTPStatus.OK, HTTPStatus.ACCEPTED): + raise RuntimeError( + f"Create taxonomy block failed: {response.status_code}: {response.text}" + ) + payload = response.json() + return payload.get("result") or payload def link_entity_taxonomy( self, @@ -670,33 +612,6 @@ def list_unmapped_elements( ) return parse_unmapped_elements(data) - def create_element(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Create a new element within a taxonomy (native CoA account, etc.).""" - request = CreateElementRequest.from_dict(body) - response = op_create_element( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Create element", response) - return envelope.result or {} - - def update_element(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Update mutable fields on an element. taxonomy_id and source are immutable.""" - request = UpdateElementRequest.from_dict(body) - response = op_update_element( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Update element", response) - return envelope.result or {} - - def delete_element(self, graph_id: str, element_id: str) -> dict[str, Any]: - """Soft-delete an element (is_active=false).""" - body = DeleteElementRequest(element_id=element_id) - response = op_delete_element( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Delete element", response) - return envelope.result or {} - # ── Structures / mappings ────────────────────────────────────────── def list_structures( @@ -713,53 +628,6 @@ def list_structures( ) return parse_structures(data) - def create_structure(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Create a new structure (mapping, statement, schedule).""" - request = CreateStructureRequest.from_dict(body) - response = op_create_structure( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Create structure", response) - return envelope.result or {} - - def update_structure(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Update mutable fields on a structure. structure_type is immutable.""" - request = UpdateStructureRequest.from_dict(body) - response = op_update_structure( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Update structure", response) - return envelope.result or {} - - def delete_structure(self, graph_id: str, structure_id: str) -> dict[str, Any]: - """Soft-delete a structure (is_active=false).""" - body = DeleteStructureRequest(structure_id=structure_id) - response = op_delete_structure( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Delete structure", response) - return envelope.result or {} - - def create_mapping_structure( - self, - graph_id: str, - name: str = "CoA to Reporting", - description: str | None = "Map Chart of Accounts to US GAAP reporting concepts", - taxonomy_id: str = "tax_usgaap_reporting", - ) -> dict[str, Any]: - """Convenience wrapper — create a CoA→GAAP mapping structure.""" - body = CreateStructureRequest( - name=name, - structure_type=CreateStructureRequestStructureType.COA_MAPPING, - taxonomy_id=taxonomy_id, - description=description if description is not None else UNSET, - ) - response = op_create_structure( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Create mapping structure", response) - return envelope.result or {} - def list_mappings(self, graph_id: str) -> list[dict[str, Any]]: """List active CoA→reporting mapping structures.""" data = self._query(graph_id, LIST_MAPPINGS_QUERY) @@ -820,39 +688,6 @@ def auto_map_elements(self, graph_id: str, mapping_id: str) -> dict[str, Any]: envelope = self._call_op("Auto-map elements", response) return {"operation_id": envelope.operation_id, "status": envelope.status} - def create_associations( - self, - graph_id: str, - structure_id: str, - associations: list[dict[str, Any]], - ) -> dict[str, Any]: - """Bulk create associations within a single structure, atomically.""" - items = [BulkAssociationItem.from_dict(a) for a in associations] - body = BulkCreateAssociationsRequest(structure_id=structure_id, associations=items) - response = op_create_associations( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Create associations", response) - return envelope.result or {} - - def update_association(self, graph_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Update mutable fields on an association (order, weight, confidence).""" - request = UpdateAssociationRequest.from_dict(body) - response = op_update_association( - graph_id=graph_id, body=request, client=self._get_client() - ) - envelope = self._call_op("Update association", response) - return envelope.result or {} - - def delete_association(self, graph_id: str, association_id: str) -> dict[str, Any]: - """Hard-delete an association (any type: presentation, calculation, mapping).""" - body = DeleteAssociationRequest(association_id=association_id) - response = op_delete_association( - graph_id=graph_id, body=body, client=self._get_client() - ) - envelope = self._call_op("Delete association", response) - return envelope.result if envelope.result is not None else {"deleted": True} - # ── Information Blocks ───────────────────────────────────────────── def get_information_block( diff --git a/robosystems_client/models/__init__.py b/robosystems_client/models/__init__.py index abfcf72..3901659 100644 --- a/robosystems_client/models/__init__.py +++ b/robosystems_client/models/__init__.py @@ -41,9 +41,6 @@ from .batch_agent_request import BatchAgentRequest from .batch_agent_response import BatchAgentResponse from .billing_customer import BillingCustomer -from .bulk_association_item import BulkAssociationItem -from .bulk_association_item_association_type import BulkAssociationItemAssociationType -from .bulk_create_associations_request import BulkCreateAssociationsRequest from .cancel_operation_response_canceloperation import ( CancelOperationResponseCanceloperation, ) @@ -67,12 +64,6 @@ from .create_closing_entry_operation import CreateClosingEntryOperation from .create_connection_request import CreateConnectionRequest from .create_connection_request_provider import CreateConnectionRequestProvider -from .create_element_request import CreateElementRequest -from .create_element_request_balance_type import CreateElementRequestBalanceType -from .create_element_request_classification import CreateElementRequestClassification -from .create_element_request_element_type import CreateElementRequestElementType -from .create_element_request_period_type import CreateElementRequestPeriodType -from .create_element_request_source import CreateElementRequestSource from .create_graph_request import CreateGraphRequest from .create_information_block_request import CreateInformationBlockRequest from .create_information_block_request_payload import ( @@ -96,12 +87,8 @@ from .create_repository_subscription_request import CreateRepositorySubscriptionRequest from .create_security_request import CreateSecurityRequest from .create_security_request_terms import CreateSecurityRequestTerms -from .create_structure_request import CreateStructureRequest -from .create_structure_request_structure_type import CreateStructureRequestStructureType from .create_subgraph_request import CreateSubgraphRequest from .create_subgraph_request_metadata_type_0 import CreateSubgraphRequestMetadataType0 -from .create_taxonomy_request import CreateTaxonomyRequest -from .create_taxonomy_request_taxonomy_type import CreateTaxonomyRequestTaxonomyType from .create_transaction_request import CreateTransactionRequest from .create_transaction_request_status import CreateTransactionRequestStatus from .create_view_request import CreateViewRequest @@ -120,8 +107,6 @@ from .database_health_response import DatabaseHealthResponse from .database_info_response import DatabaseInfoResponse from .database_storage_entry import DatabaseStorageEntry -from .delete_association_request import DeleteAssociationRequest -from .delete_element_request import DeleteElementRequest from .delete_file_response import DeleteFileResponse from .delete_information_block_request import DeleteInformationBlockRequest from .delete_information_block_request_payload import ( @@ -134,14 +119,13 @@ from .delete_publish_list_operation import DeletePublishListOperation from .delete_report_operation import DeleteReportOperation from .delete_security_operation import DeleteSecurityOperation -from .delete_structure_request import DeleteStructureRequest from .delete_subgraph_op import DeleteSubgraphOp -from .delete_taxonomy_request import DeleteTaxonomyRequest from .detailed_transactions_response import DetailedTransactionsResponse from .detailed_transactions_response_date_range import ( DetailedTransactionsResponseDateRange, ) from .detailed_transactions_response_summary import DetailedTransactionsResponseSummary +from .dispose_schedule_request import DisposeScheduleRequest from .document_detail_response import DocumentDetailResponse from .document_list_item import DocumentListItem from .document_list_response import DocumentListResponse @@ -336,17 +320,6 @@ from .truncate_schedule_operation import TruncateScheduleOperation from .upcoming_invoice import UpcomingInvoice from .update_api_key_request import UpdateAPIKeyRequest -from .update_association_request import UpdateAssociationRequest -from .update_element_request import UpdateElementRequest -from .update_element_request_balance_type_type_0 import ( - UpdateElementRequestBalanceTypeType0, -) -from .update_element_request_classification_type_0 import ( - UpdateElementRequestClassificationType0, -) -from .update_element_request_period_type_type_0 import ( - UpdateElementRequestPeriodTypeType0, -) from .update_entity_request import UpdateEntityRequest from .update_file_response_updatefile import UpdateFileResponseUpdatefile from .update_information_block_request import UpdateInformationBlockRequest @@ -363,8 +336,6 @@ from .update_publish_list_operation import UpdatePublishListOperation from .update_security_operation import UpdateSecurityOperation from .update_security_operation_terms_type_0 import UpdateSecurityOperationTermsType0 -from .update_structure_request import UpdateStructureRequest -from .update_taxonomy_request import UpdateTaxonomyRequest from .update_user_request import UpdateUserRequest from .upgrade_subscription_request import UpgradeSubscriptionRequest from .user_graphs_response import UserGraphsResponse @@ -414,9 +385,6 @@ "BatchAgentRequest", "BatchAgentResponse", "BillingCustomer", - "BulkAssociationItem", - "BulkAssociationItemAssociationType", - "BulkCreateAssociationsRequest", "CancelOperationResponseCanceloperation", "ChangeTierOp", "ChangeTierOpNewTier", @@ -438,12 +406,6 @@ "CreateClosingEntryOperation", "CreateConnectionRequest", "CreateConnectionRequestProvider", - "CreateElementRequest", - "CreateElementRequestBalanceType", - "CreateElementRequestClassification", - "CreateElementRequestElementType", - "CreateElementRequestPeriodType", - "CreateElementRequestSource", "CreateGraphRequest", "CreateInformationBlockRequest", "CreateInformationBlockRequestPayload", @@ -461,12 +423,8 @@ "CreateRepositorySubscriptionRequest", "CreateSecurityRequest", "CreateSecurityRequestTerms", - "CreateStructureRequest", - "CreateStructureRequestStructureType", "CreateSubgraphRequest", "CreateSubgraphRequestMetadataType0", - "CreateTaxonomyRequest", - "CreateTaxonomyRequestTaxonomyType", "CreateTransactionRequest", "CreateTransactionRequestStatus", "CreateViewRequest", @@ -483,8 +441,6 @@ "DatabaseHealthResponse", "DatabaseInfoResponse", "DatabaseStorageEntry", - "DeleteAssociationRequest", - "DeleteElementRequest", "DeleteFileResponse", "DeleteInformationBlockRequest", "DeleteInformationBlockRequestPayload", @@ -495,12 +451,11 @@ "DeletePublishListOperation", "DeleteReportOperation", "DeleteSecurityOperation", - "DeleteStructureRequest", "DeleteSubgraphOp", - "DeleteTaxonomyRequest", "DetailedTransactionsResponse", "DetailedTransactionsResponseDateRange", "DetailedTransactionsResponseSummary", + "DisposeScheduleRequest", "DocumentDetailResponse", "DocumentListItem", "DocumentListResponse", @@ -671,11 +626,6 @@ "TruncateScheduleOperation", "UpcomingInvoice", "UpdateAPIKeyRequest", - "UpdateAssociationRequest", - "UpdateElementRequest", - "UpdateElementRequestBalanceTypeType0", - "UpdateElementRequestClassificationType0", - "UpdateElementRequestPeriodTypeType0", "UpdateEntityRequest", "UpdateFileResponseUpdatefile", "UpdateInformationBlockRequest", @@ -690,8 +640,6 @@ "UpdatePublishListOperation", "UpdateSecurityOperation", "UpdateSecurityOperationTermsType0", - "UpdateStructureRequest", - "UpdateTaxonomyRequest", "UpdateUserRequest", "UpgradeSubscriptionRequest", "UserGraphsResponse", diff --git a/robosystems_client/models/bulk_association_item.py b/robosystems_client/models/bulk_association_item.py deleted file mode 100644 index 74695ff..0000000 --- a/robosystems_client/models/bulk_association_item.py +++ /dev/null @@ -1,196 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..models.bulk_association_item_association_type import ( - BulkAssociationItemAssociationType, -) -from ..types import UNSET, Unset - -T = TypeVar("T", bound="BulkAssociationItem") - - -@_attrs_define -class BulkAssociationItem: - """A single association within a bulk-create payload. The parent - `structure_id` is set once on the request envelope, not repeated - per item. - - Attributes: - from_element_id (str): - to_element_id (str): - association_type (BulkAssociationItemAssociationType | Unset): Default: - BulkAssociationItemAssociationType.PRESENTATION. - arcrole (None | str | Unset): - order_value (float | None | Unset): Default: 0.0. - weight (float | None | Unset): - confidence (float | None | Unset): - suggested_by (None | str | Unset): - """ - - from_element_id: str - to_element_id: str - association_type: BulkAssociationItemAssociationType | Unset = ( - BulkAssociationItemAssociationType.PRESENTATION - ) - arcrole: None | str | Unset = UNSET - order_value: float | None | Unset = 0.0 - weight: float | None | Unset = UNSET - confidence: float | None | Unset = UNSET - suggested_by: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - from_element_id = self.from_element_id - - to_element_id = self.to_element_id - - association_type: str | Unset = UNSET - if not isinstance(self.association_type, Unset): - association_type = self.association_type.value - - arcrole: None | str | Unset - if isinstance(self.arcrole, Unset): - arcrole = UNSET - else: - arcrole = self.arcrole - - order_value: float | None | Unset - if isinstance(self.order_value, Unset): - order_value = UNSET - else: - order_value = self.order_value - - weight: float | None | Unset - if isinstance(self.weight, Unset): - weight = UNSET - else: - weight = self.weight - - confidence: float | None | Unset - if isinstance(self.confidence, Unset): - confidence = UNSET - else: - confidence = self.confidence - - suggested_by: None | str | Unset - if isinstance(self.suggested_by, Unset): - suggested_by = UNSET - else: - suggested_by = self.suggested_by - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "from_element_id": from_element_id, - "to_element_id": to_element_id, - } - ) - if association_type is not UNSET: - field_dict["association_type"] = association_type - if arcrole is not UNSET: - field_dict["arcrole"] = arcrole - if order_value is not UNSET: - field_dict["order_value"] = order_value - if weight is not UNSET: - field_dict["weight"] = weight - if confidence is not UNSET: - field_dict["confidence"] = confidence - if suggested_by is not UNSET: - field_dict["suggested_by"] = suggested_by - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - from_element_id = d.pop("from_element_id") - - to_element_id = d.pop("to_element_id") - - _association_type = d.pop("association_type", UNSET) - association_type: BulkAssociationItemAssociationType | Unset - if isinstance(_association_type, Unset): - association_type = UNSET - else: - association_type = BulkAssociationItemAssociationType(_association_type) - - def _parse_arcrole(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - arcrole = _parse_arcrole(d.pop("arcrole", UNSET)) - - def _parse_order_value(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - order_value = _parse_order_value(d.pop("order_value", UNSET)) - - def _parse_weight(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - weight = _parse_weight(d.pop("weight", UNSET)) - - def _parse_confidence(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - confidence = _parse_confidence(d.pop("confidence", UNSET)) - - def _parse_suggested_by(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - suggested_by = _parse_suggested_by(d.pop("suggested_by", UNSET)) - - bulk_association_item = cls( - from_element_id=from_element_id, - to_element_id=to_element_id, - association_type=association_type, - arcrole=arcrole, - order_value=order_value, - weight=weight, - confidence=confidence, - suggested_by=suggested_by, - ) - - bulk_association_item.additional_properties = d - return bulk_association_item - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/bulk_association_item_association_type.py b/robosystems_client/models/bulk_association_item_association_type.py deleted file mode 100644 index e663214..0000000 --- a/robosystems_client/models/bulk_association_item_association_type.py +++ /dev/null @@ -1,10 +0,0 @@ -from enum import Enum - - -class BulkAssociationItemAssociationType(str, Enum): - CALCULATION = "calculation" - MAPPING = "mapping" - PRESENTATION = "presentation" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/bulk_create_associations_request.py b/robosystems_client/models/bulk_create_associations_request.py deleted file mode 100644 index 1c1714b..0000000 --- a/robosystems_client/models/bulk_create_associations_request.py +++ /dev/null @@ -1,86 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -if TYPE_CHECKING: - from ..models.bulk_association_item import BulkAssociationItem - - -T = TypeVar("T", bound="BulkCreateAssociationsRequest") - - -@_attrs_define -class BulkCreateAssociationsRequest: - """Bulk create associations within a single structure. Atomic — any - failed row rolls back the whole batch. Handles 50+ presentation arcs, - 25+ calculation arcs, or a full table linkbase in one call. - - Attributes: - structure_id (str): - associations (list[BulkAssociationItem]): - """ - - structure_id: str - associations: list[BulkAssociationItem] - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - structure_id = self.structure_id - - associations = [] - for associations_item_data in self.associations: - associations_item = associations_item_data.to_dict() - associations.append(associations_item) - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "structure_id": structure_id, - "associations": associations, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - from ..models.bulk_association_item import BulkAssociationItem - - d = dict(src_dict) - structure_id = d.pop("structure_id") - - associations = [] - _associations = d.pop("associations") - for associations_item_data in _associations: - associations_item = BulkAssociationItem.from_dict(associations_item_data) - - associations.append(associations_item) - - bulk_create_associations_request = cls( - structure_id=structure_id, - associations=associations, - ) - - bulk_create_associations_request.additional_properties = d - return bulk_create_associations_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/create_element_request.py b/robosystems_client/models/create_element_request.py deleted file mode 100644 index fbb14cb..0000000 --- a/robosystems_client/models/create_element_request.py +++ /dev/null @@ -1,325 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..models.create_element_request_balance_type import CreateElementRequestBalanceType -from ..models.create_element_request_classification import ( - CreateElementRequestClassification, -) -from ..models.create_element_request_element_type import CreateElementRequestElementType -from ..models.create_element_request_period_type import CreateElementRequestPeriodType -from ..models.create_element_request_source import CreateElementRequestSource -from ..types import UNSET, Unset - -T = TypeVar("T", bound="CreateElementRequest") - - -@_attrs_define -class CreateElementRequest: - """Create a new Element within a taxonomy. For chart-of-accounts - taxonomies this is how native accounts are added. - - Attributes: - taxonomy_id (str): - name (str): - classification (CreateElementRequestClassification): - code (None | str | Unset): - description (None | str | Unset): - balance_type (CreateElementRequestBalanceType | Unset): Default: CreateElementRequestBalanceType.DEBIT. - period_type (CreateElementRequestPeriodType | Unset): Default: CreateElementRequestPeriodType.DURATION. - element_type (CreateElementRequestElementType | Unset): Default: CreateElementRequestElementType.CONCEPT. - is_abstract (bool | Unset): Default: False. - is_monetary (bool | Unset): Default: True. - parent_id (None | str | Unset): - source (CreateElementRequestSource | Unset): Default: CreateElementRequestSource.NATIVE. - currency (str | Unset): Default: 'USD'. - qname (None | str | Unset): - namespace (None | str | Unset): - external_id (None | str | Unset): - external_source (None | str | Unset): - """ - - taxonomy_id: str - name: str - classification: CreateElementRequestClassification - code: None | str | Unset = UNSET - description: None | str | Unset = UNSET - balance_type: CreateElementRequestBalanceType | Unset = ( - CreateElementRequestBalanceType.DEBIT - ) - period_type: CreateElementRequestPeriodType | Unset = ( - CreateElementRequestPeriodType.DURATION - ) - element_type: CreateElementRequestElementType | Unset = ( - CreateElementRequestElementType.CONCEPT - ) - is_abstract: bool | Unset = False - is_monetary: bool | Unset = True - parent_id: None | str | Unset = UNSET - source: CreateElementRequestSource | Unset = CreateElementRequestSource.NATIVE - currency: str | Unset = "USD" - qname: None | str | Unset = UNSET - namespace: None | str | Unset = UNSET - external_id: None | str | Unset = UNSET - external_source: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - taxonomy_id = self.taxonomy_id - - name = self.name - - classification = self.classification.value - - code: None | str | Unset - if isinstance(self.code, Unset): - code = UNSET - else: - code = self.code - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - balance_type: str | Unset = UNSET - if not isinstance(self.balance_type, Unset): - balance_type = self.balance_type.value - - period_type: str | Unset = UNSET - if not isinstance(self.period_type, Unset): - period_type = self.period_type.value - - element_type: str | Unset = UNSET - if not isinstance(self.element_type, Unset): - element_type = self.element_type.value - - is_abstract = self.is_abstract - - is_monetary = self.is_monetary - - parent_id: None | str | Unset - if isinstance(self.parent_id, Unset): - parent_id = UNSET - else: - parent_id = self.parent_id - - source: str | Unset = UNSET - if not isinstance(self.source, Unset): - source = self.source.value - - currency = self.currency - - qname: None | str | Unset - if isinstance(self.qname, Unset): - qname = UNSET - else: - qname = self.qname - - namespace: None | str | Unset - if isinstance(self.namespace, Unset): - namespace = UNSET - else: - namespace = self.namespace - - external_id: None | str | Unset - if isinstance(self.external_id, Unset): - external_id = UNSET - else: - external_id = self.external_id - - external_source: None | str | Unset - if isinstance(self.external_source, Unset): - external_source = UNSET - else: - external_source = self.external_source - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "taxonomy_id": taxonomy_id, - "name": name, - "classification": classification, - } - ) - if code is not UNSET: - field_dict["code"] = code - if description is not UNSET: - field_dict["description"] = description - if balance_type is not UNSET: - field_dict["balance_type"] = balance_type - if period_type is not UNSET: - field_dict["period_type"] = period_type - if element_type is not UNSET: - field_dict["element_type"] = element_type - if is_abstract is not UNSET: - field_dict["is_abstract"] = is_abstract - if is_monetary is not UNSET: - field_dict["is_monetary"] = is_monetary - if parent_id is not UNSET: - field_dict["parent_id"] = parent_id - if source is not UNSET: - field_dict["source"] = source - if currency is not UNSET: - field_dict["currency"] = currency - if qname is not UNSET: - field_dict["qname"] = qname - if namespace is not UNSET: - field_dict["namespace"] = namespace - if external_id is not UNSET: - field_dict["external_id"] = external_id - if external_source is not UNSET: - field_dict["external_source"] = external_source - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - taxonomy_id = d.pop("taxonomy_id") - - name = d.pop("name") - - classification = CreateElementRequestClassification(d.pop("classification")) - - def _parse_code(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - code = _parse_code(d.pop("code", UNSET)) - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - _balance_type = d.pop("balance_type", UNSET) - balance_type: CreateElementRequestBalanceType | Unset - if isinstance(_balance_type, Unset): - balance_type = UNSET - else: - balance_type = CreateElementRequestBalanceType(_balance_type) - - _period_type = d.pop("period_type", UNSET) - period_type: CreateElementRequestPeriodType | Unset - if isinstance(_period_type, Unset): - period_type = UNSET - else: - period_type = CreateElementRequestPeriodType(_period_type) - - _element_type = d.pop("element_type", UNSET) - element_type: CreateElementRequestElementType | Unset - if isinstance(_element_type, Unset): - element_type = UNSET - else: - element_type = CreateElementRequestElementType(_element_type) - - is_abstract = d.pop("is_abstract", UNSET) - - is_monetary = d.pop("is_monetary", UNSET) - - def _parse_parent_id(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - parent_id = _parse_parent_id(d.pop("parent_id", UNSET)) - - _source = d.pop("source", UNSET) - source: CreateElementRequestSource | Unset - if isinstance(_source, Unset): - source = UNSET - else: - source = CreateElementRequestSource(_source) - - currency = d.pop("currency", UNSET) - - def _parse_qname(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - qname = _parse_qname(d.pop("qname", UNSET)) - - def _parse_namespace(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - namespace = _parse_namespace(d.pop("namespace", UNSET)) - - def _parse_external_id(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - external_id = _parse_external_id(d.pop("external_id", UNSET)) - - def _parse_external_source(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - external_source = _parse_external_source(d.pop("external_source", UNSET)) - - create_element_request = cls( - taxonomy_id=taxonomy_id, - name=name, - classification=classification, - code=code, - description=description, - balance_type=balance_type, - period_type=period_type, - element_type=element_type, - is_abstract=is_abstract, - is_monetary=is_monetary, - parent_id=parent_id, - source=source, - currency=currency, - qname=qname, - namespace=namespace, - external_id=external_id, - external_source=external_source, - ) - - create_element_request.additional_properties = d - return create_element_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/create_element_request_balance_type.py b/robosystems_client/models/create_element_request_balance_type.py deleted file mode 100644 index 5df4e6f..0000000 --- a/robosystems_client/models/create_element_request_balance_type.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class CreateElementRequestBalanceType(str, Enum): - CREDIT = "credit" - DEBIT = "debit" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_element_request_classification.py b/robosystems_client/models/create_element_request_classification.py deleted file mode 100644 index fbd51b4..0000000 --- a/robosystems_client/models/create_element_request_classification.py +++ /dev/null @@ -1,22 +0,0 @@ -from enum import Enum - - -class CreateElementRequestClassification(str, Enum): - ASSET = "asset" - COMPREHENSIVEINCOME = "comprehensiveIncome" - CONTRAASSET = "contraAsset" - CONTRAEQUITY = "contraEquity" - CONTRALIABILITY = "contraLiability" - DISTRIBUTIONTOOWNERS = "distributionToOwners" - EQUITY = "equity" - EXPENSE = "expense" - EXPENSEREVERSAL = "expenseReversal" - GAIN = "gain" - INVESTMENTBYOWNERS = "investmentByOwners" - LIABILITY = "liability" - LOSS = "loss" - REVENUE = "revenue" - TEMPORARYEQUITY = "temporaryEquity" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_element_request_element_type.py b/robosystems_client/models/create_element_request_element_type.py deleted file mode 100644 index 1e05234..0000000 --- a/robosystems_client/models/create_element_request_element_type.py +++ /dev/null @@ -1,12 +0,0 @@ -from enum import Enum - - -class CreateElementRequestElementType(str, Enum): - ABSTRACT = "abstract" - AXIS = "axis" - CONCEPT = "concept" - HYPERCUBE = "hypercube" - MEMBER = "member" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_element_request_period_type.py b/robosystems_client/models/create_element_request_period_type.py deleted file mode 100644 index a72fb0f..0000000 --- a/robosystems_client/models/create_element_request_period_type.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class CreateElementRequestPeriodType(str, Enum): - DURATION = "duration" - INSTANT = "instant" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_element_request_source.py b/robosystems_client/models/create_element_request_source.py deleted file mode 100644 index 70c28d1..0000000 --- a/robosystems_client/models/create_element_request_source.py +++ /dev/null @@ -1,16 +0,0 @@ -from enum import Enum - - -class CreateElementRequestSource(str, Enum): - FAC = "fac" - IFRS = "ifrs" - IMPORT = "import" - NATIVE = "native" - PLAID = "plaid" - QUICKBOOKS = "quickbooks" - RS_GAAP = "rs-gaap" - US_GAAP = "us-gaap" - XERO = "xero" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_structure_request.py b/robosystems_client/models/create_structure_request.py deleted file mode 100644 index 6f8c94d..0000000 --- a/robosystems_client/models/create_structure_request.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..models.create_structure_request_structure_type import ( - CreateStructureRequestStructureType, -) -from ..types import UNSET, Unset - -T = TypeVar("T", bound="CreateStructureRequest") - - -@_attrs_define -class CreateStructureRequest: - """ - Attributes: - name (str): - structure_type (CreateStructureRequestStructureType): - taxonomy_id (str): - description (None | str | Unset): - """ - - name: str - structure_type: CreateStructureRequestStructureType - taxonomy_id: str - description: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - name = self.name - - structure_type = self.structure_type.value - - taxonomy_id = self.taxonomy_id - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "name": name, - "structure_type": structure_type, - "taxonomy_id": taxonomy_id, - } - ) - if description is not UNSET: - field_dict["description"] = description - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - name = d.pop("name") - - structure_type = CreateStructureRequestStructureType(d.pop("structure_type")) - - taxonomy_id = d.pop("taxonomy_id") - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - create_structure_request = cls( - name=name, - structure_type=structure_type, - taxonomy_id=taxonomy_id, - description=description, - ) - - create_structure_request.additional_properties = d - return create_structure_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/create_structure_request_structure_type.py b/robosystems_client/models/create_structure_request_structure_type.py deleted file mode 100644 index 574781c..0000000 --- a/robosystems_client/models/create_structure_request_structure_type.py +++ /dev/null @@ -1,14 +0,0 @@ -from enum import Enum - - -class CreateStructureRequestStructureType(str, Enum): - BALANCE_SHEET = "balance_sheet" - CHART_OF_ACCOUNTS = "chart_of_accounts" - COA_MAPPING = "coa_mapping" - CUSTOM = "custom" - EQUITY_STATEMENT = "equity_statement" - INCOME_STATEMENT = "income_statement" - SCHEDULE = "schedule" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/create_taxonomy_request.py b/robosystems_client/models/create_taxonomy_request.py deleted file mode 100644 index 8787d95..0000000 --- a/robosystems_client/models/create_taxonomy_request.py +++ /dev/null @@ -1,154 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..models.create_taxonomy_request_taxonomy_type import ( - CreateTaxonomyRequestTaxonomyType, -) -from ..types import UNSET, Unset - -T = TypeVar("T", bound="CreateTaxonomyRequest") - - -@_attrs_define -class CreateTaxonomyRequest: - """ - Attributes: - name (str): - taxonomy_type (CreateTaxonomyRequestTaxonomyType): - description (None | str | Unset): - version (None | str | Unset): - source_taxonomy_id (None | str | Unset): - target_taxonomy_id (None | str | Unset): - """ - - name: str - taxonomy_type: CreateTaxonomyRequestTaxonomyType - description: None | str | Unset = UNSET - version: None | str | Unset = UNSET - source_taxonomy_id: None | str | Unset = UNSET - target_taxonomy_id: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - name = self.name - - taxonomy_type = self.taxonomy_type.value - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - version: None | str | Unset - if isinstance(self.version, Unset): - version = UNSET - else: - version = self.version - - source_taxonomy_id: None | str | Unset - if isinstance(self.source_taxonomy_id, Unset): - source_taxonomy_id = UNSET - else: - source_taxonomy_id = self.source_taxonomy_id - - target_taxonomy_id: None | str | Unset - if isinstance(self.target_taxonomy_id, Unset): - target_taxonomy_id = UNSET - else: - target_taxonomy_id = self.target_taxonomy_id - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "name": name, - "taxonomy_type": taxonomy_type, - } - ) - if description is not UNSET: - field_dict["description"] = description - if version is not UNSET: - field_dict["version"] = version - if source_taxonomy_id is not UNSET: - field_dict["source_taxonomy_id"] = source_taxonomy_id - if target_taxonomy_id is not UNSET: - field_dict["target_taxonomy_id"] = target_taxonomy_id - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - name = d.pop("name") - - taxonomy_type = CreateTaxonomyRequestTaxonomyType(d.pop("taxonomy_type")) - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - def _parse_version(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - version = _parse_version(d.pop("version", UNSET)) - - def _parse_source_taxonomy_id(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - source_taxonomy_id = _parse_source_taxonomy_id(d.pop("source_taxonomy_id", UNSET)) - - def _parse_target_taxonomy_id(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - target_taxonomy_id = _parse_target_taxonomy_id(d.pop("target_taxonomy_id", UNSET)) - - create_taxonomy_request = cls( - name=name, - taxonomy_type=taxonomy_type, - description=description, - version=version, - source_taxonomy_id=source_taxonomy_id, - target_taxonomy_id=target_taxonomy_id, - ) - - create_taxonomy_request.additional_properties = d - return create_taxonomy_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/create_taxonomy_request_taxonomy_type.py b/robosystems_client/models/create_taxonomy_request_taxonomy_type.py deleted file mode 100644 index 384fd4f..0000000 --- a/robosystems_client/models/create_taxonomy_request_taxonomy_type.py +++ /dev/null @@ -1,11 +0,0 @@ -from enum import Enum - - -class CreateTaxonomyRequestTaxonomyType(str, Enum): - CHART_OF_ACCOUNTS = "chart_of_accounts" - MAPPING = "mapping" - REPORTING = "reporting" - SCHEDULE = "schedule" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/delete_association_request.py b/robosystems_client/models/delete_association_request.py deleted file mode 100644 index 043deb8..0000000 --- a/robosystems_client/models/delete_association_request.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="DeleteAssociationRequest") - - -@_attrs_define -class DeleteAssociationRequest: - """Hard delete — associations are edges and are cheap to recreate. - - Attributes: - association_id (str): - """ - - association_id: str - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - association_id = self.association_id - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "association_id": association_id, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - association_id = d.pop("association_id") - - delete_association_request = cls( - association_id=association_id, - ) - - delete_association_request.additional_properties = d - return delete_association_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/delete_element_request.py b/robosystems_client/models/delete_element_request.py deleted file mode 100644 index c91faee..0000000 --- a/robosystems_client/models/delete_element_request.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="DeleteElementRequest") - - -@_attrs_define -class DeleteElementRequest: - """Soft delete — sets `is_active=false`. Historical line items - referencing this element remain valid; new line items cannot use an - inactive element. - - Attributes: - element_id (str): - """ - - element_id: str - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - element_id = self.element_id - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "element_id": element_id, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - element_id = d.pop("element_id") - - delete_element_request = cls( - element_id=element_id, - ) - - delete_element_request.additional_properties = d - return delete_element_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/delete_structure_request.py b/robosystems_client/models/delete_structure_request.py deleted file mode 100644 index c4ba56b..0000000 --- a/robosystems_client/models/delete_structure_request.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="DeleteStructureRequest") - - -@_attrs_define -class DeleteStructureRequest: - """Soft delete — sets `is_active=false`. - - Attributes: - structure_id (str): - """ - - structure_id: str - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - structure_id = self.structure_id - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "structure_id": structure_id, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - structure_id = d.pop("structure_id") - - delete_structure_request = cls( - structure_id=structure_id, - ) - - delete_structure_request.additional_properties = d - return delete_structure_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/delete_taxonomy_request.py b/robosystems_client/models/delete_taxonomy_request.py deleted file mode 100644 index 3b57fe8..0000000 --- a/robosystems_client/models/delete_taxonomy_request.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -T = TypeVar("T", bound="DeleteTaxonomyRequest") - - -@_attrs_define -class DeleteTaxonomyRequest: - """Soft delete — sets `is_active=false`. Historical references remain - valid. - - Attributes: - taxonomy_id (str): - """ - - taxonomy_id: str - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - taxonomy_id = self.taxonomy_id - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "taxonomy_id": taxonomy_id, - } - ) - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - taxonomy_id = d.pop("taxonomy_id") - - delete_taxonomy_request = cls( - taxonomy_id=taxonomy_id, - ) - - delete_taxonomy_request.additional_properties = d - return delete_taxonomy_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/dispose_schedule_request.py b/robosystems_client/models/dispose_schedule_request.py new file mode 100644 index 0000000..cd1c5a8 --- /dev/null +++ b/robosystems_client/models/dispose_schedule_request.py @@ -0,0 +1,162 @@ +from __future__ import annotations + +import datetime +from collections.abc import Mapping +from typing import Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field +from dateutil.parser import isoparse + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="DisposeScheduleRequest") + + +@_attrs_define +class DisposeScheduleRequest: + """Dispose a schedule early — combines truncation with a disposal closing entry. + + Computes net book value from the schedule's own facts, truncates forward + periods, and creates a balanced disposal entry in one atomic operation. + Use when an asset is sold or abandoned before the schedule runs to completion. + + Attributes: + structure_id (str): Target schedule structure ID. + disposal_date (datetime.date): Last day of the final period (month-end). Forward facts past this date are + deleted; the disposal entry is posted on this date. + memo (str): Memo for the disposal closing entry. + reason (str): Reason for disposal (audit trail). + sale_proceeds (int | None | Unset): Cash received from the sale in cents. None or 0 for abandonment (no cash + received). If provided, `proceeds_element_id` is required. + proceeds_element_id (None | str | Unset): Element to debit for sale proceeds (e.g., Cash or AR). Required when + sale_proceeds > 0. + gain_loss_element_id (None | str | Unset): Element for gain or loss on disposal. Required when net book value > + 0 after applying sale proceeds. Optional when asset is fully depreciated (NBV = 0, no gain/loss line needed). + """ + + structure_id: str + disposal_date: datetime.date + memo: str + reason: str + sale_proceeds: int | None | Unset = UNSET + proceeds_element_id: None | str | Unset = UNSET + gain_loss_element_id: None | str | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + structure_id = self.structure_id + + disposal_date = self.disposal_date.isoformat() + + memo = self.memo + + reason = self.reason + + sale_proceeds: int | None | Unset + if isinstance(self.sale_proceeds, Unset): + sale_proceeds = UNSET + else: + sale_proceeds = self.sale_proceeds + + proceeds_element_id: None | str | Unset + if isinstance(self.proceeds_element_id, Unset): + proceeds_element_id = UNSET + else: + proceeds_element_id = self.proceeds_element_id + + gain_loss_element_id: None | str | Unset + if isinstance(self.gain_loss_element_id, Unset): + gain_loss_element_id = UNSET + else: + gain_loss_element_id = self.gain_loss_element_id + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "structure_id": structure_id, + "disposal_date": disposal_date, + "memo": memo, + "reason": reason, + } + ) + if sale_proceeds is not UNSET: + field_dict["sale_proceeds"] = sale_proceeds + if proceeds_element_id is not UNSET: + field_dict["proceeds_element_id"] = proceeds_element_id + if gain_loss_element_id is not UNSET: + field_dict["gain_loss_element_id"] = gain_loss_element_id + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + structure_id = d.pop("structure_id") + + disposal_date = isoparse(d.pop("disposal_date")).date() + + memo = d.pop("memo") + + reason = d.pop("reason") + + def _parse_sale_proceeds(data: object) -> int | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(int | None | Unset, data) + + sale_proceeds = _parse_sale_proceeds(d.pop("sale_proceeds", UNSET)) + + def _parse_proceeds_element_id(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + proceeds_element_id = _parse_proceeds_element_id( + d.pop("proceeds_element_id", UNSET) + ) + + def _parse_gain_loss_element_id(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + gain_loss_element_id = _parse_gain_loss_element_id( + d.pop("gain_loss_element_id", UNSET) + ) + + dispose_schedule_request = cls( + structure_id=structure_id, + disposal_date=disposal_date, + memo=memo, + reason=reason, + sale_proceeds=sale_proceeds, + proceeds_element_id=proceeds_element_id, + gain_loss_element_id=gain_loss_element_id, + ) + + dispose_schedule_request.additional_properties = d + return dispose_schedule_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/update_association_request.py b/robosystems_client/models/update_association_request.py deleted file mode 100644 index a7d76c9..0000000 --- a/robosystems_client/models/update_association_request.py +++ /dev/null @@ -1,146 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="UpdateAssociationRequest") - - -@_attrs_define -class UpdateAssociationRequest: - """Update mutable fields on an association. `from_element_id`, - `to_element_id`, and `association_type` are immutable — delete and - recreate instead. - - Attributes: - association_id (str): - order_value (float | None | Unset): - weight (float | None | Unset): - confidence (float | None | Unset): - approved_by (None | str | Unset): - """ - - association_id: str - order_value: float | None | Unset = UNSET - weight: float | None | Unset = UNSET - confidence: float | None | Unset = UNSET - approved_by: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - association_id = self.association_id - - order_value: float | None | Unset - if isinstance(self.order_value, Unset): - order_value = UNSET - else: - order_value = self.order_value - - weight: float | None | Unset - if isinstance(self.weight, Unset): - weight = UNSET - else: - weight = self.weight - - confidence: float | None | Unset - if isinstance(self.confidence, Unset): - confidence = UNSET - else: - confidence = self.confidence - - approved_by: None | str | Unset - if isinstance(self.approved_by, Unset): - approved_by = UNSET - else: - approved_by = self.approved_by - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "association_id": association_id, - } - ) - if order_value is not UNSET: - field_dict["order_value"] = order_value - if weight is not UNSET: - field_dict["weight"] = weight - if confidence is not UNSET: - field_dict["confidence"] = confidence - if approved_by is not UNSET: - field_dict["approved_by"] = approved_by - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - association_id = d.pop("association_id") - - def _parse_order_value(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - order_value = _parse_order_value(d.pop("order_value", UNSET)) - - def _parse_weight(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - weight = _parse_weight(d.pop("weight", UNSET)) - - def _parse_confidence(data: object) -> float | None | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(float | None | Unset, data) - - confidence = _parse_confidence(d.pop("confidence", UNSET)) - - def _parse_approved_by(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - approved_by = _parse_approved_by(d.pop("approved_by", UNSET)) - - update_association_request = cls( - association_id=association_id, - order_value=order_value, - weight=weight, - confidence=confidence, - approved_by=approved_by, - ) - - update_association_request.additional_properties = d - return update_association_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/update_element_request.py b/robosystems_client/models/update_element_request.py deleted file mode 100644 index c44ec66..0000000 --- a/robosystems_client/models/update_element_request.py +++ /dev/null @@ -1,279 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..models.update_element_request_balance_type_type_0 import ( - UpdateElementRequestBalanceTypeType0, -) -from ..models.update_element_request_classification_type_0 import ( - UpdateElementRequestClassificationType0, -) -from ..models.update_element_request_period_type_type_0 import ( - UpdateElementRequestPeriodTypeType0, -) -from ..types import UNSET, Unset - -T = TypeVar("T", bound="UpdateElementRequest") - - -@_attrs_define -class UpdateElementRequest: - """Update mutable fields on an element. `taxonomy_id` and `source` are - immutable. `parent_id` honors `model_dump(exclude_unset=True)` semantics: - omit the field to leave unchanged, pass `null` to clear the parent - (make root). - - ``classification`` updates the element's primary FASB - elementsOfFinancialStatements assignment (in ``element_classifications``, - not a direct column on ``elements``). Omit to leave unchanged. Passing a - value replaces the current primary EFS assignment; there is no - set-to-null semantics (use the UI/admin path for full classification - teardown — here we only support correction of a misclassified account). - - Attributes: - element_id (str): - code (None | str | Unset): - name (None | str | Unset): - description (None | str | Unset): - balance_type (None | Unset | UpdateElementRequestBalanceTypeType0): - period_type (None | Unset | UpdateElementRequestPeriodTypeType0): - parent_id (None | str | Unset): - currency (None | str | Unset): - classification (None | Unset | UpdateElementRequestClassificationType0): - """ - - element_id: str - code: None | str | Unset = UNSET - name: None | str | Unset = UNSET - description: None | str | Unset = UNSET - balance_type: None | Unset | UpdateElementRequestBalanceTypeType0 = UNSET - period_type: None | Unset | UpdateElementRequestPeriodTypeType0 = UNSET - parent_id: None | str | Unset = UNSET - currency: None | str | Unset = UNSET - classification: None | Unset | UpdateElementRequestClassificationType0 = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - element_id = self.element_id - - code: None | str | Unset - if isinstance(self.code, Unset): - code = UNSET - else: - code = self.code - - name: None | str | Unset - if isinstance(self.name, Unset): - name = UNSET - else: - name = self.name - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - balance_type: None | str | Unset - if isinstance(self.balance_type, Unset): - balance_type = UNSET - elif isinstance(self.balance_type, UpdateElementRequestBalanceTypeType0): - balance_type = self.balance_type.value - else: - balance_type = self.balance_type - - period_type: None | str | Unset - if isinstance(self.period_type, Unset): - period_type = UNSET - elif isinstance(self.period_type, UpdateElementRequestPeriodTypeType0): - period_type = self.period_type.value - else: - period_type = self.period_type - - parent_id: None | str | Unset - if isinstance(self.parent_id, Unset): - parent_id = UNSET - else: - parent_id = self.parent_id - - currency: None | str | Unset - if isinstance(self.currency, Unset): - currency = UNSET - else: - currency = self.currency - - classification: None | str | Unset - if isinstance(self.classification, Unset): - classification = UNSET - elif isinstance(self.classification, UpdateElementRequestClassificationType0): - classification = self.classification.value - else: - classification = self.classification - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "element_id": element_id, - } - ) - if code is not UNSET: - field_dict["code"] = code - if name is not UNSET: - field_dict["name"] = name - if description is not UNSET: - field_dict["description"] = description - if balance_type is not UNSET: - field_dict["balance_type"] = balance_type - if period_type is not UNSET: - field_dict["period_type"] = period_type - if parent_id is not UNSET: - field_dict["parent_id"] = parent_id - if currency is not UNSET: - field_dict["currency"] = currency - if classification is not UNSET: - field_dict["classification"] = classification - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - element_id = d.pop("element_id") - - def _parse_code(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - code = _parse_code(d.pop("code", UNSET)) - - def _parse_name(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - name = _parse_name(d.pop("name", UNSET)) - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - def _parse_balance_type( - data: object, - ) -> None | Unset | UpdateElementRequestBalanceTypeType0: - if data is None: - return data - if isinstance(data, Unset): - return data - try: - if not isinstance(data, str): - raise TypeError() - balance_type_type_0 = UpdateElementRequestBalanceTypeType0(data) - - return balance_type_type_0 - except (TypeError, ValueError, AttributeError, KeyError): - pass - return cast(None | Unset | UpdateElementRequestBalanceTypeType0, data) - - balance_type = _parse_balance_type(d.pop("balance_type", UNSET)) - - def _parse_period_type( - data: object, - ) -> None | Unset | UpdateElementRequestPeriodTypeType0: - if data is None: - return data - if isinstance(data, Unset): - return data - try: - if not isinstance(data, str): - raise TypeError() - period_type_type_0 = UpdateElementRequestPeriodTypeType0(data) - - return period_type_type_0 - except (TypeError, ValueError, AttributeError, KeyError): - pass - return cast(None | Unset | UpdateElementRequestPeriodTypeType0, data) - - period_type = _parse_period_type(d.pop("period_type", UNSET)) - - def _parse_parent_id(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - parent_id = _parse_parent_id(d.pop("parent_id", UNSET)) - - def _parse_currency(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - currency = _parse_currency(d.pop("currency", UNSET)) - - def _parse_classification( - data: object, - ) -> None | Unset | UpdateElementRequestClassificationType0: - if data is None: - return data - if isinstance(data, Unset): - return data - try: - if not isinstance(data, str): - raise TypeError() - classification_type_0 = UpdateElementRequestClassificationType0(data) - - return classification_type_0 - except (TypeError, ValueError, AttributeError, KeyError): - pass - return cast(None | Unset | UpdateElementRequestClassificationType0, data) - - classification = _parse_classification(d.pop("classification", UNSET)) - - update_element_request = cls( - element_id=element_id, - code=code, - name=name, - description=description, - balance_type=balance_type, - period_type=period_type, - parent_id=parent_id, - currency=currency, - classification=classification, - ) - - update_element_request.additional_properties = d - return update_element_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/update_element_request_balance_type_type_0.py b/robosystems_client/models/update_element_request_balance_type_type_0.py deleted file mode 100644 index e0814dd..0000000 --- a/robosystems_client/models/update_element_request_balance_type_type_0.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class UpdateElementRequestBalanceTypeType0(str, Enum): - CREDIT = "credit" - DEBIT = "debit" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/update_element_request_classification_type_0.py b/robosystems_client/models/update_element_request_classification_type_0.py deleted file mode 100644 index fbfd4a7..0000000 --- a/robosystems_client/models/update_element_request_classification_type_0.py +++ /dev/null @@ -1,22 +0,0 @@ -from enum import Enum - - -class UpdateElementRequestClassificationType0(str, Enum): - ASSET = "asset" - COMPREHENSIVEINCOME = "comprehensiveIncome" - CONTRAASSET = "contraAsset" - CONTRAEQUITY = "contraEquity" - CONTRALIABILITY = "contraLiability" - DISTRIBUTIONTOOWNERS = "distributionToOwners" - EQUITY = "equity" - EXPENSE = "expense" - EXPENSEREVERSAL = "expenseReversal" - GAIN = "gain" - INVESTMENTBYOWNERS = "investmentByOwners" - LIABILITY = "liability" - LOSS = "loss" - REVENUE = "revenue" - TEMPORARYEQUITY = "temporaryEquity" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/update_element_request_period_type_type_0.py b/robosystems_client/models/update_element_request_period_type_type_0.py deleted file mode 100644 index 4adb3ce..0000000 --- a/robosystems_client/models/update_element_request_period_type_type_0.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class UpdateElementRequestPeriodTypeType0(str, Enum): - DURATION = "duration" - INSTANT = "instant" - - def __str__(self) -> str: - return str(self.value) diff --git a/robosystems_client/models/update_structure_request.py b/robosystems_client/models/update_structure_request.py deleted file mode 100644 index 9f5513e..0000000 --- a/robosystems_client/models/update_structure_request.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="UpdateStructureRequest") - - -@_attrs_define -class UpdateStructureRequest: - """Update mutable fields on a structure. `structure_type` and - `taxonomy_id` are immutable. - - Attributes: - structure_id (str): - name (None | str | Unset): - description (None | str | Unset): - """ - - structure_id: str - name: None | str | Unset = UNSET - description: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - structure_id = self.structure_id - - name: None | str | Unset - if isinstance(self.name, Unset): - name = UNSET - else: - name = self.name - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "structure_id": structure_id, - } - ) - if name is not UNSET: - field_dict["name"] = name - if description is not UNSET: - field_dict["description"] = description - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - structure_id = d.pop("structure_id") - - def _parse_name(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - name = _parse_name(d.pop("name", UNSET)) - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - update_structure_request = cls( - structure_id=structure_id, - name=name, - description=description, - ) - - update_structure_request.additional_properties = d - return update_structure_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/robosystems_client/models/update_taxonomy_request.py b/robosystems_client/models/update_taxonomy_request.py deleted file mode 100644 index 20e4868..0000000 --- a/robosystems_client/models/update_taxonomy_request.py +++ /dev/null @@ -1,127 +0,0 @@ -from __future__ import annotations - -from collections.abc import Mapping -from typing import Any, TypeVar, cast - -from attrs import define as _attrs_define -from attrs import field as _attrs_field - -from ..types import UNSET, Unset - -T = TypeVar("T", bound="UpdateTaxonomyRequest") - - -@_attrs_define -class UpdateTaxonomyRequest: - """Update mutable fields on a taxonomy. `taxonomy_type` is immutable — - changing it is not the same operation as editing a taxonomy; deactivate - and create a new one instead. Only provided (non-null) fields are - applied. - - Attributes: - taxonomy_id (str): - name (None | str | Unset): - description (None | str | Unset): - version (None | str | Unset): - """ - - taxonomy_id: str - name: None | str | Unset = UNSET - description: None | str | Unset = UNSET - version: None | str | Unset = UNSET - additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) - - def to_dict(self) -> dict[str, Any]: - taxonomy_id = self.taxonomy_id - - name: None | str | Unset - if isinstance(self.name, Unset): - name = UNSET - else: - name = self.name - - description: None | str | Unset - if isinstance(self.description, Unset): - description = UNSET - else: - description = self.description - - version: None | str | Unset - if isinstance(self.version, Unset): - version = UNSET - else: - version = self.version - - field_dict: dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update( - { - "taxonomy_id": taxonomy_id, - } - ) - if name is not UNSET: - field_dict["name"] = name - if description is not UNSET: - field_dict["description"] = description - if version is not UNSET: - field_dict["version"] = version - - return field_dict - - @classmethod - def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: - d = dict(src_dict) - taxonomy_id = d.pop("taxonomy_id") - - def _parse_name(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - name = _parse_name(d.pop("name", UNSET)) - - def _parse_description(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - description = _parse_description(d.pop("description", UNSET)) - - def _parse_version(data: object) -> None | str | Unset: - if data is None: - return data - if isinstance(data, Unset): - return data - return cast(None | str | Unset, data) - - version = _parse_version(d.pop("version", UNSET)) - - update_taxonomy_request = cls( - taxonomy_id=taxonomy_id, - name=name, - description=description, - version=version, - ) - - update_taxonomy_request.additional_properties = d - return update_taxonomy_request - - @property - def additional_keys(self) -> list[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/tests/test_ledger_client.py b/tests/test_ledger_client.py index fe81380..172dbb1 100644 --- a/tests/test_ledger_client.py +++ b/tests/test_ledger_client.py @@ -1143,164 +1143,6 @@ def test_get_closing_book_structures(self, mock_execute, mock_config, graph_id): assert result["categories"][0]["label"] == "Schedules" -# ── Taxonomy ops ──────────────────────────────────────────────────────── - - -@pytest.mark.unit -class TestTaxonomyOps: - @patch("robosystems_client.clients.ledger_client.op_create_taxonomy") - def test_create_taxonomy(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "create-taxonomy", - { - "taxonomy_id": "tax_coa_1", - "name": "My CoA", - "taxonomy_type": "chart_of_accounts", - }, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.create_taxonomy( - graph_id, {"name": "My CoA", "taxonomy_type": "chart_of_accounts"} - ) - assert result["taxonomy_id"] == "tax_coa_1" - assert mock_op.call_args.kwargs["graph_id"] == graph_id - - @patch("robosystems_client.clients.ledger_client.op_update_taxonomy") - def test_update_taxonomy(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "update-taxonomy", - {"taxonomy_id": "tax_coa_1", "name": "Updated CoA"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.update_taxonomy( - graph_id, {"taxonomy_id": "tax_coa_1", "name": "Updated CoA"} - ) - assert result["name"] == "Updated CoA" - - @patch("robosystems_client.clients.ledger_client.op_delete_taxonomy") - def test_delete_taxonomy(self, mock_op, mock_config, graph_id): - envelope = _envelope("delete-taxonomy", {"taxonomy_id": "tax_coa_1"}) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.delete_taxonomy(graph_id, "tax_coa_1") - assert result["taxonomy_id"] == "tax_coa_1" - body = mock_op.call_args.kwargs["body"] - assert body.taxonomy_id == "tax_coa_1" - - -# ── Element ops ───────────────────────────────────────────────────────── - - -@pytest.mark.unit -class TestElementOps: - @patch("robosystems_client.clients.ledger_client.op_create_element") - def test_create_element(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "create-element", - {"element_id": "elem_1", "name": "Cash", "classification": "asset"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.create_element( - graph_id, - { - "name": "Cash", - "taxonomy_id": "tax_coa_1", - "classification": "asset", - "balance_type": "debit", - }, - ) - assert result["element_id"] == "elem_1" - assert mock_op.call_args.kwargs["graph_id"] == graph_id - - @patch("robosystems_client.clients.ledger_client.op_update_element") - def test_update_element(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "update-element", - {"element_id": "elem_1", "name": "Cash and Cash Equivalents"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.update_element( - graph_id, {"element_id": "elem_1", "name": "Cash and Cash Equivalents"} - ) - assert result["name"] == "Cash and Cash Equivalents" - - @patch("robosystems_client.clients.ledger_client.op_delete_element") - def test_delete_element(self, mock_op, mock_config, graph_id): - envelope = _envelope("delete-element", {"element_id": "elem_1"}) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.delete_element(graph_id, "elem_1") - assert result["element_id"] == "elem_1" - body = mock_op.call_args.kwargs["body"] - assert body.element_id == "elem_1" - - -# ── Structure ops ─────────────────────────────────────────────────────── - - -@pytest.mark.unit -class TestStructureOps: - @patch("robosystems_client.clients.ledger_client.op_create_structure") - def test_create_structure(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "create-structure", - {"structure_id": "str_1", "name": "CoA Mapping", "structure_type": "coa_mapping"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.create_structure( - graph_id, - { - "name": "CoA Mapping", - "structure_type": "coa_mapping", - "taxonomy_id": "tax_usgaap", - }, - ) - assert result["structure_id"] == "str_1" - assert mock_op.call_args.kwargs["graph_id"] == graph_id - - @patch("robosystems_client.clients.ledger_client.op_update_structure") - def test_update_structure(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "update-structure", - {"structure_id": "str_1", "name": "Updated Mapping"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.update_structure( - graph_id, {"structure_id": "str_1", "name": "Updated Mapping"} - ) - assert result["name"] == "Updated Mapping" - - @patch("robosystems_client.clients.ledger_client.op_delete_structure") - def test_delete_structure(self, mock_op, mock_config, graph_id): - envelope = _envelope("delete-structure", {"structure_id": "str_1"}) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.delete_structure(graph_id, "str_1") - assert result["structure_id"] == "str_1" - body = mock_op.call_args.kwargs["body"] - assert body.structure_id == "str_1" - - @patch("robosystems_client.clients.ledger_client.op_create_structure") - def test_create_mapping_structure_convenience(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "create-structure", - {"structure_id": "str_map_1", "structure_type": "coa_mapping"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.create_mapping_structure(graph_id) - assert result["structure_type"] == "coa_mapping" - body = mock_op.call_args.kwargs["body"] - assert body.structure_type.value == "coa_mapping" - assert body.taxonomy_id == "tax_usgaap_reporting" - - # ── Association ops ───────────────────────────────────────────────────── @@ -1340,68 +1182,6 @@ def test_delete_mapping_association_returns_sentinel( assert body.mapping_id == "map_1" assert body.association_id == "assoc_1" - @patch("robosystems_client.clients.ledger_client.op_create_associations") - def test_create_associations_bulk(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "create-associations", - {"created": 2, "structure_id": "str_1"}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.create_associations( - graph_id, - structure_id="str_1", - associations=[ - { - "from_element_id": "elem_a", - "to_element_id": "elem_x", - "association_type": "presentation", - }, - { - "from_element_id": "elem_b", - "to_element_id": "elem_y", - "association_type": "presentation", - }, - ], - ) - assert result["created"] == 2 - body = mock_op.call_args.kwargs["body"] - assert body.structure_id == "str_1" - assert len(body.associations) == 2 - - @patch("robosystems_client.clients.ledger_client.op_update_association") - def test_update_association(self, mock_op, mock_config, graph_id): - envelope = _envelope( - "update-association", - {"association_id": "assoc_1", "confidence": 0.75}, - ) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.update_association( - graph_id, {"association_id": "assoc_1", "confidence": 0.75} - ) - assert result["confidence"] == 0.75 - - @patch("robosystems_client.clients.ledger_client.op_delete_association") - def test_delete_association_returns_sentinel(self, mock_op, mock_config, graph_id): - envelope = _envelope("delete-association", None) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.delete_association(graph_id, "assoc_1") - assert result == {"deleted": True} - body = mock_op.call_args.kwargs["body"] - assert body.association_id == "assoc_1" - - @patch("robosystems_client.clients.ledger_client.op_delete_association") - def test_delete_association_returns_result_when_present( - self, mock_op, mock_config, graph_id - ): - envelope = _envelope("delete-association", {"association_id": "assoc_1"}) - mock_op.return_value = _mock_response(envelope) - client = LedgerClient(mock_config) - result = client.delete_association(graph_id, "assoc_1") - assert result["association_id"] == "assoc_1" - # ── Schedule additional ops ───────────────────────────────────────────── From 58b2afbe9a6ebd05a2265b21fa03d2db0c0156f4 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Fri, 24 Apr 2026 11:33:20 -0500 Subject: [PATCH 2/2] Add taxonomy block models and update request handling - Introduced `TaxonomyBlockElementRequestMetadata`, `TaxonomyBlockRuleRequest`, and related models for taxonomy block rules and elements. - Implemented enums for rule categories, patterns, and severities to standardize taxonomy block rule definitions. - Created `TaxonomyBlockStructureRequest` and its metadata model to define structure within taxonomy blocks. - Added `UpdateTaxonomyBlockRequest` to facilitate updates to taxonomy blocks, including elements, structures, associations, and rules. - Enhanced serialization and deserialization methods for all new models to support dictionary conversions. --- .../op_create_taxonomy_block.py | 301 ++++++++++++++++ .../op_delete_taxonomy_block.py | 281 +++++++++++++++ .../op_link_entity_taxonomy.py | 24 +- .../op_update_taxonomy_block.py | 281 +++++++++++++++ robosystems_client/clients/ledger_client.py | 123 ++++++- robosystems_client/models/__init__.py | 62 ++++ .../models/create_taxonomy_block_request.py | 311 +++++++++++++++++ .../create_taxonomy_block_request_metadata.py | 47 +++ ...te_taxonomy_block_request_taxonomy_type.py | 12 + .../models/delete_taxonomy_block_request.py | 86 +++++ .../models/element_update_patch.py | 268 ++++++++++++++ .../element_update_patch_metadata_type_0.py | 47 +++ .../models/structure_update_patch.py | 170 +++++++++ .../structure_update_patch_metadata_type_0.py | 47 +++ .../taxonomy_block_association_request.py | 181 ++++++++++ ...ck_association_request_association_type.py | 13 + ...nomy_block_association_request_metadata.py | 47 +++ .../models/taxonomy_block_element_request.py | 267 ++++++++++++++ ...taxonomy_block_element_request_metadata.py | 47 +++ .../models/taxonomy_block_rule_request.py | 271 +++++++++++++++ .../taxonomy_block_rule_request_metadata.py | 47 +++ ...xonomy_block_rule_request_rule_category.py | 16 + ...axonomy_block_rule_request_rule_pattern.py | 18 + .../taxonomy_block_rule_request_severity.py | 10 + ...onomy_block_rule_request_variables_item.py | 47 +++ .../taxonomy_block_structure_request.py | 143 ++++++++ ...xonomy_block_structure_request_metadata.py | 47 +++ ..._block_structure_request_structure_type.py | 19 + .../models/update_taxonomy_block_request.py | 329 ++++++++++++++++++ 29 files changed, 3535 insertions(+), 27 deletions(-) create mode 100644 robosystems_client/api/extensions_robo_ledger/op_create_taxonomy_block.py create mode 100644 robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy_block.py create mode 100644 robosystems_client/api/extensions_robo_ledger/op_update_taxonomy_block.py create mode 100644 robosystems_client/models/create_taxonomy_block_request.py create mode 100644 robosystems_client/models/create_taxonomy_block_request_metadata.py create mode 100644 robosystems_client/models/create_taxonomy_block_request_taxonomy_type.py create mode 100644 robosystems_client/models/delete_taxonomy_block_request.py create mode 100644 robosystems_client/models/element_update_patch.py create mode 100644 robosystems_client/models/element_update_patch_metadata_type_0.py create mode 100644 robosystems_client/models/structure_update_patch.py create mode 100644 robosystems_client/models/structure_update_patch_metadata_type_0.py create mode 100644 robosystems_client/models/taxonomy_block_association_request.py create mode 100644 robosystems_client/models/taxonomy_block_association_request_association_type.py create mode 100644 robosystems_client/models/taxonomy_block_association_request_metadata.py create mode 100644 robosystems_client/models/taxonomy_block_element_request.py create mode 100644 robosystems_client/models/taxonomy_block_element_request_metadata.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request_metadata.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request_rule_category.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request_rule_pattern.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request_severity.py create mode 100644 robosystems_client/models/taxonomy_block_rule_request_variables_item.py create mode 100644 robosystems_client/models/taxonomy_block_structure_request.py create mode 100644 robosystems_client/models/taxonomy_block_structure_request_metadata.py create mode 100644 robosystems_client/models/taxonomy_block_structure_request_structure_type.py create mode 100644 robosystems_client/models/update_taxonomy_block_request.py diff --git a/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy_block.py b/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy_block.py new file mode 100644 index 0000000..bf2899a --- /dev/null +++ b/robosystems_client/api/extensions_robo_ledger/op_create_taxonomy_block.py @@ -0,0 +1,301 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.create_taxonomy_block_request import CreateTaxonomyBlockRequest +from ...models.http_validation_error import HTTPValidationError +from ...models.operation_envelope import OperationEnvelope +from ...models.operation_error import OperationError +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + graph_id: str, + *, + body: CreateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + if not isinstance(idempotency_key, Unset): + headers["Idempotency-Key"] = idempotency_key + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/extensions/roboledger/{graph_id}/operations/create-taxonomy-block".format( + graph_id=quote(str(graph_id), safe=""), + ), + } + + _kwargs["json"] = body.to_dict() + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + if response.status_code == 200: + response_200 = OperationEnvelope.from_dict(response.json()) + + return response_200 + + if response.status_code == 400: + response_400 = OperationError.from_dict(response.json()) + + return response_400 + + if response.status_code == 401: + response_401 = cast(Any, None) + return response_401 + + if response.status_code == 403: + response_403 = cast(Any, None) + return response_403 + + if response.status_code == 404: + response_404 = OperationError.from_dict(response.json()) + + return response_404 + + if response.status_code == 409: + response_409 = OperationError.from_dict(response.json()) + + return response_409 + + if response.status_code == 422: + response_422 = HTTPValidationError.from_dict(response.json()) + + return response_422 + + if response.status_code == 429: + response_429 = cast(Any, None) + return response_429 + + if response.status_code == 500: + response_500 = cast(Any, None) + return response_500 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: CreateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Create Taxonomy Block + + Create a taxonomy block atomically: one envelope carrying the taxonomy row plus its structures, + elements, associations, and rules. Dispatches by `taxonomy_type` — `chart_of_accounts` (declarative + tenant CoA) is live; `reporting_extension` / `custom_ontology` / `reporting_standard` land in later + sub-phases. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (CreateTaxonomyBlockRequest): Request body for the ``create-taxonomy-block`` + operation. + + One envelope per taxonomy instance. ``taxonomy_type`` discriminates + which block-type handler the command dispatcher routes to. + ``parent_taxonomy_id`` is required for ``reporting_extension`` (which + extends a library taxonomy) and ignored otherwise. + + The library path (seeding ``reporting_standard`` rows) does NOT flow + through this envelope — it uses a dedicated library writer that bypasses + these caps and tenant scoping. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + graph_id: str, + *, + client: AuthenticatedClient, + body: CreateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Create Taxonomy Block + + Create a taxonomy block atomically: one envelope carrying the taxonomy row plus its structures, + elements, associations, and rules. Dispatches by `taxonomy_type` — `chart_of_accounts` (declarative + tenant CoA) is live; `reporting_extension` / `custom_ontology` / `reporting_standard` land in later + sub-phases. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (CreateTaxonomyBlockRequest): Request body for the ``create-taxonomy-block`` + operation. + + One envelope per taxonomy instance. ``taxonomy_type`` discriminates + which block-type handler the command dispatcher routes to. + ``parent_taxonomy_id`` is required for ``reporting_extension`` (which + extends a library taxonomy) and ignored otherwise. + + The library path (seeding ``reporting_standard`` rows) does NOT flow + through this envelope — it uses a dedicated library writer that bypasses + these caps and tenant scoping. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return sync_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ).parsed + + +async def asyncio_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: CreateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Create Taxonomy Block + + Create a taxonomy block atomically: one envelope carrying the taxonomy row plus its structures, + elements, associations, and rules. Dispatches by `taxonomy_type` — `chart_of_accounts` (declarative + tenant CoA) is live; `reporting_extension` / `custom_ontology` / `reporting_standard` land in later + sub-phases. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (CreateTaxonomyBlockRequest): Request body for the ``create-taxonomy-block`` + operation. + + One envelope per taxonomy instance. ``taxonomy_type`` discriminates + which block-type handler the command dispatcher routes to. + ``parent_taxonomy_id`` is required for ``reporting_extension`` (which + extends a library taxonomy) and ignored otherwise. + + The library path (seeding ``reporting_standard`` rows) does NOT flow + through this envelope — it uses a dedicated library writer that bypasses + these caps and tenant scoping. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + graph_id: str, + *, + client: AuthenticatedClient, + body: CreateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Create Taxonomy Block + + Create a taxonomy block atomically: one envelope carrying the taxonomy row plus its structures, + elements, associations, and rules. Dispatches by `taxonomy_type` — `chart_of_accounts` (declarative + tenant CoA) is live; `reporting_extension` / `custom_ontology` / `reporting_standard` land in later + sub-phases. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (CreateTaxonomyBlockRequest): Request body for the ``create-taxonomy-block`` + operation. + + One envelope per taxonomy instance. ``taxonomy_type`` discriminates + which block-type handler the command dispatcher routes to. + ``parent_taxonomy_id`` is required for ``reporting_extension`` (which + extends a library taxonomy) and ignored otherwise. + + The library path (seeding ``reporting_standard`` rows) does NOT flow + through this envelope — it uses a dedicated library writer that bypasses + these caps and tenant scoping. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return ( + await asyncio_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ) + ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy_block.py b/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy_block.py new file mode 100644 index 0000000..1e39b7a --- /dev/null +++ b/robosystems_client/api/extensions_robo_ledger/op_delete_taxonomy_block.py @@ -0,0 +1,281 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.delete_taxonomy_block_request import DeleteTaxonomyBlockRequest +from ...models.http_validation_error import HTTPValidationError +from ...models.operation_envelope import OperationEnvelope +from ...models.operation_error import OperationError +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + graph_id: str, + *, + body: DeleteTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + if not isinstance(idempotency_key, Unset): + headers["Idempotency-Key"] = idempotency_key + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/extensions/roboledger/{graph_id}/operations/delete-taxonomy-block".format( + graph_id=quote(str(graph_id), safe=""), + ), + } + + _kwargs["json"] = body.to_dict() + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + if response.status_code == 200: + response_200 = OperationEnvelope.from_dict(response.json()) + + return response_200 + + if response.status_code == 400: + response_400 = OperationError.from_dict(response.json()) + + return response_400 + + if response.status_code == 401: + response_401 = cast(Any, None) + return response_401 + + if response.status_code == 403: + response_403 = cast(Any, None) + return response_403 + + if response.status_code == 404: + response_404 = OperationError.from_dict(response.json()) + + return response_404 + + if response.status_code == 409: + response_409 = OperationError.from_dict(response.json()) + + return response_409 + + if response.status_code == 422: + response_422 = HTTPValidationError.from_dict(response.json()) + + return response_422 + + if response.status_code == 429: + response_429 = cast(Any, None) + return response_429 + + if response.status_code == 500: + response_500 = cast(Any, None) + return response_500 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: DeleteTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Delete Taxonomy Block + + Delete a taxonomy block and return a thin confirmation. `cascade_facts=True` also deletes Fact rows + that reference the taxonomy's elements; default False fails the delete if such facts exist. Library- + origin block types surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (DeleteTaxonomyBlockRequest): Request body for the ``delete-taxonomy-block`` + operation. + + ``cascade_facts=False`` (default) fails the delete if any Fact rows + reference elements in this taxonomy. ``cascade_facts=True`` deletes the + referencing facts alongside the taxonomy; the response reports + ``facts_deleted``. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + graph_id: str, + *, + client: AuthenticatedClient, + body: DeleteTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Delete Taxonomy Block + + Delete a taxonomy block and return a thin confirmation. `cascade_facts=True` also deletes Fact rows + that reference the taxonomy's elements; default False fails the delete if such facts exist. Library- + origin block types surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (DeleteTaxonomyBlockRequest): Request body for the ``delete-taxonomy-block`` + operation. + + ``cascade_facts=False`` (default) fails the delete if any Fact rows + reference elements in this taxonomy. ``cascade_facts=True`` deletes the + referencing facts alongside the taxonomy; the response reports + ``facts_deleted``. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return sync_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ).parsed + + +async def asyncio_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: DeleteTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Delete Taxonomy Block + + Delete a taxonomy block and return a thin confirmation. `cascade_facts=True` also deletes Fact rows + that reference the taxonomy's elements; default False fails the delete if such facts exist. Library- + origin block types surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (DeleteTaxonomyBlockRequest): Request body for the ``delete-taxonomy-block`` + operation. + + ``cascade_facts=False`` (default) fails the delete if any Fact rows + reference elements in this taxonomy. ``cascade_facts=True`` deletes the + referencing facts alongside the taxonomy; the response reports + ``facts_deleted``. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + graph_id: str, + *, + client: AuthenticatedClient, + body: DeleteTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Delete Taxonomy Block + + Delete a taxonomy block and return a thin confirmation. `cascade_facts=True` also deletes Fact rows + that reference the taxonomy's elements; default False fails the delete if such facts exist. Library- + origin block types surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (DeleteTaxonomyBlockRequest): Request body for the ``delete-taxonomy-block`` + operation. + + ``cascade_facts=False`` (default) fails the delete if any Fact rows + reference elements in this taxonomy. ``cascade_facts=True`` deletes the + referencing facts alongside the taxonomy; the response reports + ``facts_deleted``. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return ( + await asyncio_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ) + ).parsed diff --git a/robosystems_client/api/extensions_robo_ledger/op_link_entity_taxonomy.py b/robosystems_client/api/extensions_robo_ledger/op_link_entity_taxonomy.py index e741582..5265756 100644 --- a/robosystems_client/api/extensions_robo_ledger/op_link_entity_taxonomy.py +++ b/robosystems_client/api/extensions_robo_ledger/op_link_entity_taxonomy.py @@ -108,9 +108,9 @@ def sync_detailed( ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: """Link Entity to Taxonomy - Link the graph's entity to a taxonomy (creates the ENTITY_HAS_TAXONOMY edge). Idempotent — returns - existing linkage if it already exists. Required after creating a CoA taxonomy so the platform knows - which chart of accounts the entity reports under. + Link the graph's entity to a taxonomy. Idempotent — returns existing linkage if it already exists. + CoA blocks auto-link at create time; use this only to switch the primary CoA or link a reporting + extension / custom ontology explicitly. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -155,9 +155,9 @@ def sync( ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: """Link Entity to Taxonomy - Link the graph's entity to a taxonomy (creates the ENTITY_HAS_TAXONOMY edge). Idempotent — returns - existing linkage if it already exists. Required after creating a CoA taxonomy so the platform knows - which chart of accounts the entity reports under. + Link the graph's entity to a taxonomy. Idempotent — returns existing linkage if it already exists. + CoA blocks auto-link at create time; use this only to switch the primary CoA or link a reporting + extension / custom ontology explicitly. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -197,9 +197,9 @@ async def asyncio_detailed( ) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: """Link Entity to Taxonomy - Link the graph's entity to a taxonomy (creates the ENTITY_HAS_TAXONOMY edge). Idempotent — returns - existing linkage if it already exists. Required after creating a CoA taxonomy so the platform knows - which chart of accounts the entity reports under. + Link the graph's entity to a taxonomy. Idempotent — returns existing linkage if it already exists. + CoA blocks auto-link at create time; use this only to switch the primary CoA or link a reporting + extension / custom ontology explicitly. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. @@ -242,9 +242,9 @@ async def asyncio( ) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: """Link Entity to Taxonomy - Link the graph's entity to a taxonomy (creates the ENTITY_HAS_TAXONOMY edge). Idempotent — returns - existing linkage if it already exists. Required after creating a CoA taxonomy so the platform knows - which chart of accounts the entity reports under. + Link the graph's entity to a taxonomy. Idempotent — returns existing linkage if it already exists. + CoA blocks auto-link at create time; use this only to switch the primary CoA or link a reporting + extension / custom ontology explicitly. **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. diff --git a/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy_block.py b/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy_block.py new file mode 100644 index 0000000..9ed379b --- /dev/null +++ b/robosystems_client/api/extensions_robo_ledger/op_update_taxonomy_block.py @@ -0,0 +1,281 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ... import errors +from ...client import AuthenticatedClient, Client +from ...models.http_validation_error import HTTPValidationError +from ...models.operation_envelope import OperationEnvelope +from ...models.operation_error import OperationError +from ...models.update_taxonomy_block_request import UpdateTaxonomyBlockRequest +from ...types import UNSET, Response, Unset + + +def _get_kwargs( + graph_id: str, + *, + body: UpdateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> dict[str, Any]: + headers: dict[str, Any] = {} + if not isinstance(idempotency_key, Unset): + headers["Idempotency-Key"] = idempotency_key + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/extensions/roboledger/{graph_id}/operations/update-taxonomy-block".format( + graph_id=quote(str(graph_id), safe=""), + ), + } + + _kwargs["json"] = body.to_dict() + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + +def _parse_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + if response.status_code == 200: + response_200 = OperationEnvelope.from_dict(response.json()) + + return response_200 + + if response.status_code == 400: + response_400 = OperationError.from_dict(response.json()) + + return response_400 + + if response.status_code == 401: + response_401 = cast(Any, None) + return response_401 + + if response.status_code == 403: + response_403 = cast(Any, None) + return response_403 + + if response.status_code == 404: + response_404 = OperationError.from_dict(response.json()) + + return response_404 + + if response.status_code == 409: + response_409 = OperationError.from_dict(response.json()) + + return response_409 + + if response.status_code == 422: + response_422 = HTTPValidationError.from_dict(response.json()) + + return response_422 + + if response.status_code == 429: + response_429 = cast(Any, None) + return response_429 + + if response.status_code == 500: + response_500 = cast(Any, None) + return response_500 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response( + *, client: AuthenticatedClient | Client, response: httpx.Response +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: UpdateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Update Taxonomy Block + + Incrementally mutate a taxonomy block via typed delta lists (elements/structures/associations/rules + to add, update, remove). Dispatches by the target taxonomy's stored `taxonomy_type`. Library-origin + block types (`reporting_standard`) surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (UpdateTaxonomyBlockRequest): Request body for the ``update-taxonomy-block`` + operation. + + Top-level fields (name / description / version) apply to the taxonomy + row itself. The delta lists mutate atoms incrementally — the validator + (Phase 2.3) re-runs the seven-phase check across the projected post- + update state before anything commits. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + + +def sync( + graph_id: str, + *, + client: AuthenticatedClient, + body: UpdateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Update Taxonomy Block + + Incrementally mutate a taxonomy block via typed delta lists (elements/structures/associations/rules + to add, update, remove). Dispatches by the target taxonomy's stored `taxonomy_type`. Library-origin + block types (`reporting_standard`) surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (UpdateTaxonomyBlockRequest): Request body for the ``update-taxonomy-block`` + operation. + + Top-level fields (name / description / version) apply to the taxonomy + row itself. The delta lists mutate atoms incrementally — the validator + (Phase 2.3) re-runs the seven-phase check across the projected post- + update state before anything commits. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return sync_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ).parsed + + +async def asyncio_detailed( + graph_id: str, + *, + client: AuthenticatedClient, + body: UpdateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Response[Any | HTTPValidationError | OperationEnvelope | OperationError]: + """Update Taxonomy Block + + Incrementally mutate a taxonomy block via typed delta lists (elements/structures/associations/rules + to add, update, remove). Dispatches by the target taxonomy's stored `taxonomy_type`. Library-origin + block types (`reporting_standard`) surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (UpdateTaxonomyBlockRequest): Request body for the ``update-taxonomy-block`` + operation. + + Top-level fields (name / description / version) apply to the taxonomy + row itself. The delta lists mutate atoms incrementally — the validator + (Phase 2.3) re-runs the seven-phase check across the projected post- + update state before anything commits. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[Any | HTTPValidationError | OperationEnvelope | OperationError] + """ + + kwargs = _get_kwargs( + graph_id=graph_id, + body=body, + idempotency_key=idempotency_key, + ) + + response = await client.get_async_httpx_client().request(**kwargs) + + return _build_response(client=client, response=response) + + +async def asyncio( + graph_id: str, + *, + client: AuthenticatedClient, + body: UpdateTaxonomyBlockRequest, + idempotency_key: None | str | Unset = UNSET, +) -> Any | HTTPValidationError | OperationEnvelope | OperationError | None: + """Update Taxonomy Block + + Incrementally mutate a taxonomy block via typed delta lists (elements/structures/associations/rules + to add, update, remove). Dispatches by the target taxonomy's stored `taxonomy_type`. Library-origin + block types (`reporting_standard`) surface 501. + + **Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours + return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict. + + Args: + graph_id (str): + idempotency_key (None | str | Unset): + body (UpdateTaxonomyBlockRequest): Request body for the ``update-taxonomy-block`` + operation. + + Top-level fields (name / description / version) apply to the taxonomy + row itself. The delta lists mutate atoms incrementally — the validator + (Phase 2.3) re-runs the seven-phase check across the projected post- + update state before anything commits. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Any | HTTPValidationError | OperationEnvelope | OperationError + """ + + return ( + await asyncio_detailed( + graph_id=graph_id, + client=client, + body=body, + idempotency_key=idempotency_key, + ) + ).parsed diff --git a/robosystems_client/clients/ledger_client.py b/robosystems_client/clients/ledger_client.py index f7a0b83..c6a7167 100644 --- a/robosystems_client/clients/ledger_client.py +++ b/robosystems_client/clients/ledger_client.py @@ -62,6 +62,21 @@ from ..api.extensions_robo_ledger.op_truncate_schedule import ( sync_detailed as op_truncate_schedule, ) +from ..api.extensions_robo_ledger.op_create_taxonomy_block import ( + sync_detailed as op_create_taxonomy_block, +) +from ..api.extensions_robo_ledger.op_update_taxonomy_block import ( + sync_detailed as op_update_taxonomy_block, +) +from ..api.extensions_robo_ledger.op_delete_taxonomy_block import ( + sync_detailed as op_delete_taxonomy_block, +) +from ..api.extensions_robo_ledger.op_dispose_schedule import ( + sync_detailed as op_dispose_schedule, +) +from ..api.extensions_robo_ledger.op_evaluate_rules import ( + sync_detailed as op_evaluate_rules, +) from ..api.extensions_robo_ledger.op_update_entity import ( sync_detailed as op_update_entity, ) @@ -229,6 +244,11 @@ from ..models.reopen_period_operation import ReopenPeriodOperation from ..models.set_close_target_operation import SetCloseTargetOperation from ..models.truncate_schedule_operation import TruncateScheduleOperation +from ..models.create_taxonomy_block_request import CreateTaxonomyBlockRequest +from ..models.update_taxonomy_block_request import UpdateTaxonomyBlockRequest +from ..models.delete_taxonomy_block_request import DeleteTaxonomyBlockRequest +from ..models.dispose_schedule_request import DisposeScheduleRequest +from ..models.evaluate_rules_request import EvaluateRulesRequest from ..models.update_entity_request import UpdateEntityRequest from ..types import UNSET @@ -532,25 +552,44 @@ def list_taxonomies( return parse_taxonomies(data) def create_taxonomy_block( - self, graph_id: str, body: dict[str, Any] + self, graph_id: str, body: dict[str, Any], idempotency_key: str | None = None ) -> dict[str, Any]: """Create a taxonomy block atomically (taxonomy + structures + elements + associations + rules in one envelope). - - Until the SDK is regenerated with a typed ``op_create_taxonomy_block``, - this facade method POSTs the body directly via the shared httpx - client. Returns the unwrapped ``TaxonomyBlockEnvelope`` dict. """ - path = f"/extensions/roboledger/{graph_id}/operations/create-taxonomy-block" - client = self._get_client() - httpx_client = client.get_httpx_client() - response = httpx_client.post(path, json=body) - if response.status_code not in (HTTPStatus.OK, HTTPStatus.ACCEPTED): - raise RuntimeError( - f"Create taxonomy block failed: {response.status_code}: {response.text}" - ) - payload = response.json() - return payload.get("result") or payload + request = CreateTaxonomyBlockRequest.from_dict(body) + response = op_create_taxonomy_block( + graph_id=graph_id, + body=request, + client=self._get_client(), + idempotency_key=idempotency_key if idempotency_key is not None else UNSET, + ) + envelope = self._call_op("Create taxonomy block", response) + return envelope.result or {} + + def update_taxonomy_block( + self, graph_id: str, body: dict[str, Any] + ) -> dict[str, Any]: + """Update a taxonomy block — add/update/remove elements, structures, associations, or rules.""" + request = UpdateTaxonomyBlockRequest.from_dict(body) + response = op_update_taxonomy_block( + graph_id=graph_id, body=request, client=self._get_client() + ) + envelope = self._call_op("Update taxonomy block", response) + return envelope.result or {} + + def delete_taxonomy_block( + self, graph_id: str, taxonomy_id: str, reason: str, cascade_facts: bool = False + ) -> dict[str, Any]: + """Delete a taxonomy block. Cascades through elements, structures, and associations.""" + request = DeleteTaxonomyBlockRequest.from_dict( + {"taxonomy_id": taxonomy_id, "reason": reason, "cascade_facts": cascade_facts} + ) + response = op_delete_taxonomy_block( + graph_id=graph_id, body=request, client=self._get_client() + ) + envelope = self._call_op("Delete taxonomy block", response) + return envelope.result if envelope.result is not None else {"deleted": True} def link_entity_taxonomy( self, @@ -814,6 +853,60 @@ def truncate_schedule( envelope = self._call_op("Truncate schedule", response) return envelope.result or {} + def dispose_schedule( + self, + graph_id: str, + structure_id: str, + disposal_date: str, + memo: str, + reason: str, + sale_proceeds: int | None = None, + proceeds_element_id: str | None = None, + gain_loss_element_id: str | None = None, + ) -> dict[str, Any]: + """Dispose of a schedule asset — post a disposal entry and delete forward facts.""" + body_dict: dict[str, Any] = { + "structure_id": structure_id, + "disposal_date": disposal_date, + "memo": memo, + "reason": reason, + } + if sale_proceeds is not None: + body_dict["sale_proceeds"] = sale_proceeds + if proceeds_element_id is not None: + body_dict["proceeds_element_id"] = proceeds_element_id + if gain_loss_element_id is not None: + body_dict["gain_loss_element_id"] = gain_loss_element_id + request = DisposeScheduleRequest.from_dict(body_dict) + response = op_dispose_schedule( + graph_id=graph_id, body=request, client=self._get_client() + ) + envelope = self._call_op("Dispose schedule", response) + return envelope.result or {} + + def evaluate_rules( + self, + graph_id: str, + structure_id: str, + fact_set_id: str | None = None, + period_start: str | None = None, + period_end: str | None = None, + ) -> dict[str, Any]: + """Evaluate taxonomy rules against facts in a structure.""" + body_dict: dict[str, Any] = {"structure_id": structure_id} + if fact_set_id is not None: + body_dict["fact_set_id"] = fact_set_id + if period_start is not None: + body_dict["period_start"] = period_start + if period_end is not None: + body_dict["period_end"] = period_end + request = EvaluateRulesRequest.from_dict(body_dict) + response = op_evaluate_rules( + graph_id=graph_id, body=request, client=self._get_client() + ) + envelope = self._call_op("Evaluate rules", response) + return envelope.result or {} + def update_schedule( self, graph_id: str, structure_id: str, body: dict[str, Any] ) -> dict[str, Any]: diff --git a/robosystems_client/models/__init__.py b/robosystems_client/models/__init__.py index 3901659..0f3f6f3 100644 --- a/robosystems_client/models/__init__.py +++ b/robosystems_client/models/__init__.py @@ -89,6 +89,11 @@ from .create_security_request_terms import CreateSecurityRequestTerms from .create_subgraph_request import CreateSubgraphRequest from .create_subgraph_request_metadata_type_0 import CreateSubgraphRequestMetadataType0 +from .create_taxonomy_block_request import CreateTaxonomyBlockRequest +from .create_taxonomy_block_request_metadata import CreateTaxonomyBlockRequestMetadata +from .create_taxonomy_block_request_taxonomy_type import ( + CreateTaxonomyBlockRequestTaxonomyType, +) from .create_transaction_request import CreateTransactionRequest from .create_transaction_request_status import CreateTransactionRequestStatus from .create_view_request import CreateViewRequest @@ -120,6 +125,7 @@ from .delete_report_operation import DeleteReportOperation from .delete_security_operation import DeleteSecurityOperation from .delete_subgraph_op import DeleteSubgraphOp +from .delete_taxonomy_block_request import DeleteTaxonomyBlockRequest from .detailed_transactions_response import DetailedTransactionsResponse from .detailed_transactions_response_date_range import ( DetailedTransactionsResponseDateRange, @@ -134,6 +140,8 @@ from .document_upload_request import DocumentUploadRequest from .document_upload_response import DocumentUploadResponse from .download_quota import DownloadQuota +from .element_update_patch import ElementUpdatePatch +from .element_update_patch_metadata_type_0 import ElementUpdatePatchMetadataType0 from .email_verification_request import EmailVerificationRequest from .enhanced_credit_transaction_response import EnhancedCreditTransactionResponse from .enhanced_credit_transaction_response_metadata import ( @@ -299,6 +307,8 @@ from .sso_token_response import SSOTokenResponse from .storage_limits import StorageLimits from .storage_summary import StorageSummary +from .structure_update_patch import StructureUpdatePatch +from .structure_update_patch_metadata_type_0 import StructureUpdatePatchMetadataType0 from .subgraph_quota_response import SubgraphQuotaResponse from .subgraph_response import SubgraphResponse from .subgraph_response_metadata_type_0 import SubgraphResponseMetadataType0 @@ -314,6 +324,34 @@ from .table_list_response import TableListResponse from .table_query_request import TableQueryRequest from .table_query_response import TableQueryResponse +from .taxonomy_block_association_request import TaxonomyBlockAssociationRequest +from .taxonomy_block_association_request_association_type import ( + TaxonomyBlockAssociationRequestAssociationType, +) +from .taxonomy_block_association_request_metadata import ( + TaxonomyBlockAssociationRequestMetadata, +) +from .taxonomy_block_element_request import TaxonomyBlockElementRequest +from .taxonomy_block_element_request_metadata import TaxonomyBlockElementRequestMetadata +from .taxonomy_block_rule_request import TaxonomyBlockRuleRequest +from .taxonomy_block_rule_request_metadata import TaxonomyBlockRuleRequestMetadata +from .taxonomy_block_rule_request_rule_category import ( + TaxonomyBlockRuleRequestRuleCategory, +) +from .taxonomy_block_rule_request_rule_pattern import ( + TaxonomyBlockRuleRequestRulePattern, +) +from .taxonomy_block_rule_request_severity import TaxonomyBlockRuleRequestSeverity +from .taxonomy_block_rule_request_variables_item import ( + TaxonomyBlockRuleRequestVariablesItem, +) +from .taxonomy_block_structure_request import TaxonomyBlockStructureRequest +from .taxonomy_block_structure_request_metadata import ( + TaxonomyBlockStructureRequestMetadata, +) +from .taxonomy_block_structure_request_structure_type import ( + TaxonomyBlockStructureRequestStructureType, +) from .tier_capacity import TierCapacity from .token_pricing import TokenPricing from .transaction_summary_response import TransactionSummaryResponse @@ -336,6 +374,7 @@ from .update_publish_list_operation import UpdatePublishListOperation from .update_security_operation import UpdateSecurityOperation from .update_security_operation_terms_type_0 import UpdateSecurityOperationTermsType0 +from .update_taxonomy_block_request import UpdateTaxonomyBlockRequest from .update_user_request import UpdateUserRequest from .upgrade_subscription_request import UpgradeSubscriptionRequest from .user_graphs_response import UserGraphsResponse @@ -425,6 +464,9 @@ "CreateSecurityRequestTerms", "CreateSubgraphRequest", "CreateSubgraphRequestMetadataType0", + "CreateTaxonomyBlockRequest", + "CreateTaxonomyBlockRequestMetadata", + "CreateTaxonomyBlockRequestTaxonomyType", "CreateTransactionRequest", "CreateTransactionRequestStatus", "CreateViewRequest", @@ -452,6 +494,7 @@ "DeleteReportOperation", "DeleteSecurityOperation", "DeleteSubgraphOp", + "DeleteTaxonomyBlockRequest", "DetailedTransactionsResponse", "DetailedTransactionsResponseDateRange", "DetailedTransactionsResponseSummary", @@ -464,6 +507,8 @@ "DocumentUploadRequest", "DocumentUploadResponse", "DownloadQuota", + "ElementUpdatePatch", + "ElementUpdatePatchMetadataType0", "EmailVerificationRequest", "EnhancedCreditTransactionResponse", "EnhancedCreditTransactionResponseMetadata", @@ -607,6 +652,8 @@ "SSOTokenResponse", "StorageLimits", "StorageSummary", + "StructureUpdatePatch", + "StructureUpdatePatchMetadataType0", "SubgraphQuotaResponse", "SubgraphResponse", "SubgraphResponseMetadataType0", @@ -620,6 +667,20 @@ "TableListResponse", "TableQueryRequest", "TableQueryResponse", + "TaxonomyBlockAssociationRequest", + "TaxonomyBlockAssociationRequestAssociationType", + "TaxonomyBlockAssociationRequestMetadata", + "TaxonomyBlockElementRequest", + "TaxonomyBlockElementRequestMetadata", + "TaxonomyBlockRuleRequest", + "TaxonomyBlockRuleRequestMetadata", + "TaxonomyBlockRuleRequestRuleCategory", + "TaxonomyBlockRuleRequestRulePattern", + "TaxonomyBlockRuleRequestSeverity", + "TaxonomyBlockRuleRequestVariablesItem", + "TaxonomyBlockStructureRequest", + "TaxonomyBlockStructureRequestMetadata", + "TaxonomyBlockStructureRequestStructureType", "TierCapacity", "TokenPricing", "TransactionSummaryResponse", @@ -640,6 +701,7 @@ "UpdatePublishListOperation", "UpdateSecurityOperation", "UpdateSecurityOperationTermsType0", + "UpdateTaxonomyBlockRequest", "UpdateUserRequest", "UpgradeSubscriptionRequest", "UserGraphsResponse", diff --git a/robosystems_client/models/create_taxonomy_block_request.py b/robosystems_client/models/create_taxonomy_block_request.py new file mode 100644 index 0000000..0305e82 --- /dev/null +++ b/robosystems_client/models/create_taxonomy_block_request.py @@ -0,0 +1,311 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..models.create_taxonomy_block_request_taxonomy_type import ( + CreateTaxonomyBlockRequestTaxonomyType, +) +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.create_taxonomy_block_request_metadata import ( + CreateTaxonomyBlockRequestMetadata, + ) + from ..models.taxonomy_block_association_request import ( + TaxonomyBlockAssociationRequest, + ) + from ..models.taxonomy_block_element_request import TaxonomyBlockElementRequest + from ..models.taxonomy_block_rule_request import TaxonomyBlockRuleRequest + from ..models.taxonomy_block_structure_request import TaxonomyBlockStructureRequest + + +T = TypeVar("T", bound="CreateTaxonomyBlockRequest") + + +@_attrs_define +class CreateTaxonomyBlockRequest: + """Request body for the ``create-taxonomy-block`` operation. + + One envelope per taxonomy instance. ``taxonomy_type`` discriminates + which block-type handler the command dispatcher routes to. + ``parent_taxonomy_id`` is required for ``reporting_extension`` (which + extends a library taxonomy) and ignored otherwise. + + The library path (seeding ``reporting_standard`` rows) does NOT flow + through this envelope — it uses a dedicated library writer that bypasses + these caps and tenant scoping. + + Attributes: + name (str): Taxonomy display name. + taxonomy_type (CreateTaxonomyBlockRequestTaxonomyType): Block-type discriminator. ``chart_of_accounts`` and + ``custom_ontology`` construct from scratch; ``reporting_extension`` extends an existing library + ``reporting_standard``. + parent_taxonomy_id (None | str | Unset): Required when ``taxonomy_type == 'reporting_extension'`` — the id of + the library ``reporting_standard`` being extended. + version (None | str | Unset): + description (None | str | Unset): + standard (None | str | Unset): + namespace_uri (None | str | Unset): + elements (list[TaxonomyBlockElementRequest] | Unset): + structures (list[TaxonomyBlockStructureRequest] | Unset): + associations (list[TaxonomyBlockAssociationRequest] | Unset): + rules (list[TaxonomyBlockRuleRequest] | Unset): + metadata (CreateTaxonomyBlockRequestMetadata | Unset): + """ + + name: str + taxonomy_type: CreateTaxonomyBlockRequestTaxonomyType + parent_taxonomy_id: None | str | Unset = UNSET + version: None | str | Unset = UNSET + description: None | str | Unset = UNSET + standard: None | str | Unset = UNSET + namespace_uri: None | str | Unset = UNSET + elements: list[TaxonomyBlockElementRequest] | Unset = UNSET + structures: list[TaxonomyBlockStructureRequest] | Unset = UNSET + associations: list[TaxonomyBlockAssociationRequest] | Unset = UNSET + rules: list[TaxonomyBlockRuleRequest] | Unset = UNSET + metadata: CreateTaxonomyBlockRequestMetadata | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + name = self.name + + taxonomy_type = self.taxonomy_type.value + + parent_taxonomy_id: None | str | Unset + if isinstance(self.parent_taxonomy_id, Unset): + parent_taxonomy_id = UNSET + else: + parent_taxonomy_id = self.parent_taxonomy_id + + version: None | str | Unset + if isinstance(self.version, Unset): + version = UNSET + else: + version = self.version + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + standard: None | str | Unset + if isinstance(self.standard, Unset): + standard = UNSET + else: + standard = self.standard + + namespace_uri: None | str | Unset + if isinstance(self.namespace_uri, Unset): + namespace_uri = UNSET + else: + namespace_uri = self.namespace_uri + + elements: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.elements, Unset): + elements = [] + for elements_item_data in self.elements: + elements_item = elements_item_data.to_dict() + elements.append(elements_item) + + structures: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.structures, Unset): + structures = [] + for structures_item_data in self.structures: + structures_item = structures_item_data.to_dict() + structures.append(structures_item) + + associations: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.associations, Unset): + associations = [] + for associations_item_data in self.associations: + associations_item = associations_item_data.to_dict() + associations.append(associations_item) + + rules: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.rules, Unset): + rules = [] + for rules_item_data in self.rules: + rules_item = rules_item_data.to_dict() + rules.append(rules_item) + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "name": name, + "taxonomy_type": taxonomy_type, + } + ) + if parent_taxonomy_id is not UNSET: + field_dict["parent_taxonomy_id"] = parent_taxonomy_id + if version is not UNSET: + field_dict["version"] = version + if description is not UNSET: + field_dict["description"] = description + if standard is not UNSET: + field_dict["standard"] = standard + if namespace_uri is not UNSET: + field_dict["namespace_uri"] = namespace_uri + if elements is not UNSET: + field_dict["elements"] = elements + if structures is not UNSET: + field_dict["structures"] = structures + if associations is not UNSET: + field_dict["associations"] = associations + if rules is not UNSET: + field_dict["rules"] = rules + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.create_taxonomy_block_request_metadata import ( + CreateTaxonomyBlockRequestMetadata, + ) + from ..models.taxonomy_block_association_request import ( + TaxonomyBlockAssociationRequest, + ) + from ..models.taxonomy_block_element_request import TaxonomyBlockElementRequest + from ..models.taxonomy_block_rule_request import TaxonomyBlockRuleRequest + from ..models.taxonomy_block_structure_request import TaxonomyBlockStructureRequest + + d = dict(src_dict) + name = d.pop("name") + + taxonomy_type = CreateTaxonomyBlockRequestTaxonomyType(d.pop("taxonomy_type")) + + def _parse_parent_taxonomy_id(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + parent_taxonomy_id = _parse_parent_taxonomy_id(d.pop("parent_taxonomy_id", UNSET)) + + def _parse_version(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + version = _parse_version(d.pop("version", UNSET)) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_standard(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + standard = _parse_standard(d.pop("standard", UNSET)) + + def _parse_namespace_uri(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + namespace_uri = _parse_namespace_uri(d.pop("namespace_uri", UNSET)) + + _elements = d.pop("elements", UNSET) + elements: list[TaxonomyBlockElementRequest] | Unset = UNSET + if _elements is not UNSET: + elements = [] + for elements_item_data in _elements: + elements_item = TaxonomyBlockElementRequest.from_dict(elements_item_data) + + elements.append(elements_item) + + _structures = d.pop("structures", UNSET) + structures: list[TaxonomyBlockStructureRequest] | Unset = UNSET + if _structures is not UNSET: + structures = [] + for structures_item_data in _structures: + structures_item = TaxonomyBlockStructureRequest.from_dict(structures_item_data) + + structures.append(structures_item) + + _associations = d.pop("associations", UNSET) + associations: list[TaxonomyBlockAssociationRequest] | Unset = UNSET + if _associations is not UNSET: + associations = [] + for associations_item_data in _associations: + associations_item = TaxonomyBlockAssociationRequest.from_dict( + associations_item_data + ) + + associations.append(associations_item) + + _rules = d.pop("rules", UNSET) + rules: list[TaxonomyBlockRuleRequest] | Unset = UNSET + if _rules is not UNSET: + rules = [] + for rules_item_data in _rules: + rules_item = TaxonomyBlockRuleRequest.from_dict(rules_item_data) + + rules.append(rules_item) + + _metadata = d.pop("metadata", UNSET) + metadata: CreateTaxonomyBlockRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = CreateTaxonomyBlockRequestMetadata.from_dict(_metadata) + + create_taxonomy_block_request = cls( + name=name, + taxonomy_type=taxonomy_type, + parent_taxonomy_id=parent_taxonomy_id, + version=version, + description=description, + standard=standard, + namespace_uri=namespace_uri, + elements=elements, + structures=structures, + associations=associations, + rules=rules, + metadata=metadata, + ) + + create_taxonomy_block_request.additional_properties = d + return create_taxonomy_block_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/create_taxonomy_block_request_metadata.py b/robosystems_client/models/create_taxonomy_block_request_metadata.py new file mode 100644 index 0000000..c81b560 --- /dev/null +++ b/robosystems_client/models/create_taxonomy_block_request_metadata.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="CreateTaxonomyBlockRequestMetadata") + + +@_attrs_define +class CreateTaxonomyBlockRequestMetadata: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + create_taxonomy_block_request_metadata = cls() + + create_taxonomy_block_request_metadata.additional_properties = d + return create_taxonomy_block_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/create_taxonomy_block_request_taxonomy_type.py b/robosystems_client/models/create_taxonomy_block_request_taxonomy_type.py new file mode 100644 index 0000000..bae3429 --- /dev/null +++ b/robosystems_client/models/create_taxonomy_block_request_taxonomy_type.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class CreateTaxonomyBlockRequestTaxonomyType(str, Enum): + CHART_OF_ACCOUNTS = "chart_of_accounts" + CUSTOM_ONTOLOGY = "custom_ontology" + REPORTING_EXTENSION = "reporting_extension" + REPORTING_STANDARD = "reporting_standard" + SCHEDULE = "schedule" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/delete_taxonomy_block_request.py b/robosystems_client/models/delete_taxonomy_block_request.py new file mode 100644 index 0000000..c743604 --- /dev/null +++ b/robosystems_client/models/delete_taxonomy_block_request.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="DeleteTaxonomyBlockRequest") + + +@_attrs_define +class DeleteTaxonomyBlockRequest: + """Request body for the ``delete-taxonomy-block`` operation. + + ``cascade_facts=False`` (default) fails the delete if any Fact rows + reference elements in this taxonomy. ``cascade_facts=True`` deletes the + referencing facts alongside the taxonomy; the response reports + ``facts_deleted``. + + Attributes: + taxonomy_id (str): + reason (str): Human-readable justification (audit log). + cascade_facts (bool | Unset): Default: False. + """ + + taxonomy_id: str + reason: str + cascade_facts: bool | Unset = False + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + taxonomy_id = self.taxonomy_id + + reason = self.reason + + cascade_facts = self.cascade_facts + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "taxonomy_id": taxonomy_id, + "reason": reason, + } + ) + if cascade_facts is not UNSET: + field_dict["cascade_facts"] = cascade_facts + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_id = d.pop("taxonomy_id") + + reason = d.pop("reason") + + cascade_facts = d.pop("cascade_facts", UNSET) + + delete_taxonomy_block_request = cls( + taxonomy_id=taxonomy_id, + reason=reason, + cascade_facts=cascade_facts, + ) + + delete_taxonomy_block_request.additional_properties = d + return delete_taxonomy_block_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/element_update_patch.py b/robosystems_client/models/element_update_patch.py new file mode 100644 index 0000000..d8638e7 --- /dev/null +++ b/robosystems_client/models/element_update_patch.py @@ -0,0 +1,268 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.element_update_patch_metadata_type_0 import ( + ElementUpdatePatchMetadataType0, + ) + + +T = TypeVar("T", bound="ElementUpdatePatch") + + +@_attrs_define +class ElementUpdatePatch: + """Partial-update patch for a single element, keyed by qname. + + Attributes: + qname (str): qname identifier of the element to update. + name (None | str | Unset): + description (None | str | Unset): + classification (None | str | Unset): + balance_type (None | str | Unset): + period_type (None | str | Unset): + is_monetary (bool | None | Unset): + code (None | str | Unset): + parent_ref (None | str | Unset): + metadata (ElementUpdatePatchMetadataType0 | None | Unset): + """ + + qname: str + name: None | str | Unset = UNSET + description: None | str | Unset = UNSET + classification: None | str | Unset = UNSET + balance_type: None | str | Unset = UNSET + period_type: None | str | Unset = UNSET + is_monetary: bool | None | Unset = UNSET + code: None | str | Unset = UNSET + parent_ref: None | str | Unset = UNSET + metadata: ElementUpdatePatchMetadataType0 | None | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + from ..models.element_update_patch_metadata_type_0 import ( + ElementUpdatePatchMetadataType0, + ) + + qname = self.qname + + name: None | str | Unset + if isinstance(self.name, Unset): + name = UNSET + else: + name = self.name + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + classification: None | str | Unset + if isinstance(self.classification, Unset): + classification = UNSET + else: + classification = self.classification + + balance_type: None | str | Unset + if isinstance(self.balance_type, Unset): + balance_type = UNSET + else: + balance_type = self.balance_type + + period_type: None | str | Unset + if isinstance(self.period_type, Unset): + period_type = UNSET + else: + period_type = self.period_type + + is_monetary: bool | None | Unset + if isinstance(self.is_monetary, Unset): + is_monetary = UNSET + else: + is_monetary = self.is_monetary + + code: None | str | Unset + if isinstance(self.code, Unset): + code = UNSET + else: + code = self.code + + parent_ref: None | str | Unset + if isinstance(self.parent_ref, Unset): + parent_ref = UNSET + else: + parent_ref = self.parent_ref + + metadata: dict[str, Any] | None | Unset + if isinstance(self.metadata, Unset): + metadata = UNSET + elif isinstance(self.metadata, ElementUpdatePatchMetadataType0): + metadata = self.metadata.to_dict() + else: + metadata = self.metadata + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "qname": qname, + } + ) + if name is not UNSET: + field_dict["name"] = name + if description is not UNSET: + field_dict["description"] = description + if classification is not UNSET: + field_dict["classification"] = classification + if balance_type is not UNSET: + field_dict["balance_type"] = balance_type + if period_type is not UNSET: + field_dict["period_type"] = period_type + if is_monetary is not UNSET: + field_dict["is_monetary"] = is_monetary + if code is not UNSET: + field_dict["code"] = code + if parent_ref is not UNSET: + field_dict["parent_ref"] = parent_ref + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.element_update_patch_metadata_type_0 import ( + ElementUpdatePatchMetadataType0, + ) + + d = dict(src_dict) + qname = d.pop("qname") + + def _parse_name(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + name = _parse_name(d.pop("name", UNSET)) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_classification(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + classification = _parse_classification(d.pop("classification", UNSET)) + + def _parse_balance_type(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + balance_type = _parse_balance_type(d.pop("balance_type", UNSET)) + + def _parse_period_type(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + period_type = _parse_period_type(d.pop("period_type", UNSET)) + + def _parse_is_monetary(data: object) -> bool | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(bool | None | Unset, data) + + is_monetary = _parse_is_monetary(d.pop("is_monetary", UNSET)) + + def _parse_code(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + code = _parse_code(d.pop("code", UNSET)) + + def _parse_parent_ref(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + parent_ref = _parse_parent_ref(d.pop("parent_ref", UNSET)) + + def _parse_metadata(data: object) -> ElementUpdatePatchMetadataType0 | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, dict): + raise TypeError() + metadata_type_0 = ElementUpdatePatchMetadataType0.from_dict(data) + + return metadata_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(ElementUpdatePatchMetadataType0 | None | Unset, data) + + metadata = _parse_metadata(d.pop("metadata", UNSET)) + + element_update_patch = cls( + qname=qname, + name=name, + description=description, + classification=classification, + balance_type=balance_type, + period_type=period_type, + is_monetary=is_monetary, + code=code, + parent_ref=parent_ref, + metadata=metadata, + ) + + element_update_patch.additional_properties = d + return element_update_patch + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/element_update_patch_metadata_type_0.py b/robosystems_client/models/element_update_patch_metadata_type_0.py new file mode 100644 index 0000000..425c078 --- /dev/null +++ b/robosystems_client/models/element_update_patch_metadata_type_0.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="ElementUpdatePatchMetadataType0") + + +@_attrs_define +class ElementUpdatePatchMetadataType0: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + element_update_patch_metadata_type_0 = cls() + + element_update_patch_metadata_type_0.additional_properties = d + return element_update_patch_metadata_type_0 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/structure_update_patch.py b/robosystems_client/models/structure_update_patch.py new file mode 100644 index 0000000..4d29df7 --- /dev/null +++ b/robosystems_client/models/structure_update_patch.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.structure_update_patch_metadata_type_0 import ( + StructureUpdatePatchMetadataType0, + ) + + +T = TypeVar("T", bound="StructureUpdatePatch") + + +@_attrs_define +class StructureUpdatePatch: + """Partial-update patch for a single structure, keyed by structure_id. + + Attributes: + structure_id (str): Structure id to update. + name (None | str | Unset): + description (None | str | Unset): + role_uri (None | str | Unset): + metadata (None | StructureUpdatePatchMetadataType0 | Unset): + """ + + structure_id: str + name: None | str | Unset = UNSET + description: None | str | Unset = UNSET + role_uri: None | str | Unset = UNSET + metadata: None | StructureUpdatePatchMetadataType0 | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + from ..models.structure_update_patch_metadata_type_0 import ( + StructureUpdatePatchMetadataType0, + ) + + structure_id = self.structure_id + + name: None | str | Unset + if isinstance(self.name, Unset): + name = UNSET + else: + name = self.name + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + role_uri: None | str | Unset + if isinstance(self.role_uri, Unset): + role_uri = UNSET + else: + role_uri = self.role_uri + + metadata: dict[str, Any] | None | Unset + if isinstance(self.metadata, Unset): + metadata = UNSET + elif isinstance(self.metadata, StructureUpdatePatchMetadataType0): + metadata = self.metadata.to_dict() + else: + metadata = self.metadata + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "structure_id": structure_id, + } + ) + if name is not UNSET: + field_dict["name"] = name + if description is not UNSET: + field_dict["description"] = description + if role_uri is not UNSET: + field_dict["role_uri"] = role_uri + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.structure_update_patch_metadata_type_0 import ( + StructureUpdatePatchMetadataType0, + ) + + d = dict(src_dict) + structure_id = d.pop("structure_id") + + def _parse_name(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + name = _parse_name(d.pop("name", UNSET)) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_role_uri(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + role_uri = _parse_role_uri(d.pop("role_uri", UNSET)) + + def _parse_metadata( + data: object, + ) -> None | StructureUpdatePatchMetadataType0 | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + try: + if not isinstance(data, dict): + raise TypeError() + metadata_type_0 = StructureUpdatePatchMetadataType0.from_dict(data) + + return metadata_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | StructureUpdatePatchMetadataType0 | Unset, data) + + metadata = _parse_metadata(d.pop("metadata", UNSET)) + + structure_update_patch = cls( + structure_id=structure_id, + name=name, + description=description, + role_uri=role_uri, + metadata=metadata, + ) + + structure_update_patch.additional_properties = d + return structure_update_patch + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/structure_update_patch_metadata_type_0.py b/robosystems_client/models/structure_update_patch_metadata_type_0.py new file mode 100644 index 0000000..f742242 --- /dev/null +++ b/robosystems_client/models/structure_update_patch_metadata_type_0.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="StructureUpdatePatchMetadataType0") + + +@_attrs_define +class StructureUpdatePatchMetadataType0: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + structure_update_patch_metadata_type_0 = cls() + + structure_update_patch_metadata_type_0.additional_properties = d + return structure_update_patch_metadata_type_0 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_association_request.py b/robosystems_client/models/taxonomy_block_association_request.py new file mode 100644 index 0000000..adcd8ee --- /dev/null +++ b/robosystems_client/models/taxonomy_block_association_request.py @@ -0,0 +1,181 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..models.taxonomy_block_association_request_association_type import ( + TaxonomyBlockAssociationRequestAssociationType, +) +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.taxonomy_block_association_request_metadata import ( + TaxonomyBlockAssociationRequestMetadata, + ) + + +T = TypeVar("T", bound="TaxonomyBlockAssociationRequest") + + +@_attrs_define +class TaxonomyBlockAssociationRequest: + """Association (arc) between two elements, scoped to a structure. + + Attributes: + structure_ref (str): Envelope-local structure name (references a structure declared in the same envelope). + from_ref (str): qname of the source element. + to_ref (str): qname of the target element. + association_type (TaxonomyBlockAssociationRequestAssociationType): DB ``associations.association_type`` enum. + ``presentation`` = parent-child hierarchy; ``calculation`` = summation arc. + order_value (float | None | Unset): + arcrole (None | str | Unset): + weight (float | None | Unset): Calculation-arc coefficient (+1 / -1 for summation, other values for weighted + rollups). Null for non-calculation arcs. + metadata (TaxonomyBlockAssociationRequestMetadata | Unset): + """ + + structure_ref: str + from_ref: str + to_ref: str + association_type: TaxonomyBlockAssociationRequestAssociationType + order_value: float | None | Unset = UNSET + arcrole: None | str | Unset = UNSET + weight: float | None | Unset = UNSET + metadata: TaxonomyBlockAssociationRequestMetadata | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + structure_ref = self.structure_ref + + from_ref = self.from_ref + + to_ref = self.to_ref + + association_type = self.association_type.value + + order_value: float | None | Unset + if isinstance(self.order_value, Unset): + order_value = UNSET + else: + order_value = self.order_value + + arcrole: None | str | Unset + if isinstance(self.arcrole, Unset): + arcrole = UNSET + else: + arcrole = self.arcrole + + weight: float | None | Unset + if isinstance(self.weight, Unset): + weight = UNSET + else: + weight = self.weight + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "structure_ref": structure_ref, + "from_ref": from_ref, + "to_ref": to_ref, + "association_type": association_type, + } + ) + if order_value is not UNSET: + field_dict["order_value"] = order_value + if arcrole is not UNSET: + field_dict["arcrole"] = arcrole + if weight is not UNSET: + field_dict["weight"] = weight + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.taxonomy_block_association_request_metadata import ( + TaxonomyBlockAssociationRequestMetadata, + ) + + d = dict(src_dict) + structure_ref = d.pop("structure_ref") + + from_ref = d.pop("from_ref") + + to_ref = d.pop("to_ref") + + association_type = TaxonomyBlockAssociationRequestAssociationType( + d.pop("association_type") + ) + + def _parse_order_value(data: object) -> float | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(float | None | Unset, data) + + order_value = _parse_order_value(d.pop("order_value", UNSET)) + + def _parse_arcrole(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + arcrole = _parse_arcrole(d.pop("arcrole", UNSET)) + + def _parse_weight(data: object) -> float | None | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(float | None | Unset, data) + + weight = _parse_weight(d.pop("weight", UNSET)) + + _metadata = d.pop("metadata", UNSET) + metadata: TaxonomyBlockAssociationRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = TaxonomyBlockAssociationRequestMetadata.from_dict(_metadata) + + taxonomy_block_association_request = cls( + structure_ref=structure_ref, + from_ref=from_ref, + to_ref=to_ref, + association_type=association_type, + order_value=order_value, + arcrole=arcrole, + weight=weight, + metadata=metadata, + ) + + taxonomy_block_association_request.additional_properties = d + return taxonomy_block_association_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_association_request_association_type.py b/robosystems_client/models/taxonomy_block_association_request_association_type.py new file mode 100644 index 0000000..e82200a --- /dev/null +++ b/robosystems_client/models/taxonomy_block_association_request_association_type.py @@ -0,0 +1,13 @@ +from enum import Enum + + +class TaxonomyBlockAssociationRequestAssociationType(str, Enum): + CALCULATION = "calculation" + EQUIVALENCE = "equivalence" + ESSENCE_ALIAS = "essence-alias" + GENERAL_SPECIAL = "general-special" + MAPPING = "mapping" + PRESENTATION = "presentation" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/taxonomy_block_association_request_metadata.py b/robosystems_client/models/taxonomy_block_association_request_metadata.py new file mode 100644 index 0000000..d919932 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_association_request_metadata.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="TaxonomyBlockAssociationRequestMetadata") + + +@_attrs_define +class TaxonomyBlockAssociationRequestMetadata: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_block_association_request_metadata = cls() + + taxonomy_block_association_request_metadata.additional_properties = d + return taxonomy_block_association_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_element_request.py b/robosystems_client/models/taxonomy_block_element_request.py new file mode 100644 index 0000000..621f963 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_element_request.py @@ -0,0 +1,267 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.taxonomy_block_element_request_metadata import ( + TaxonomyBlockElementRequestMetadata, + ) + + +T = TypeVar("T", bound="TaxonomyBlockElementRequest") + + +@_attrs_define +class TaxonomyBlockElementRequest: + """Element definition inside a Taxonomy Block envelope. + + ``qname`` is the envelope-local identifier — must be unique within the + envelope's ``elements`` list and is used by association / rule / patch + payloads as the reference token. ``parent_ref`` may reference another + envelope-local qname or, for ``reporting_extension`` blocks, a library + element qname. + + Attributes: + qname (str): Envelope-local element identifier. Must be unique within the envelope's ``elements`` list. Used as + the reference token for associations, rules, and update patches. + name (str): Human-readable element name (e.g. 'Total Assets'). + classification (None | str | Unset): FASB metamodel trait for the element. Required for ``chart_of_accounts`` + blocks; optional for ``custom_ontology``. + balance_type (None | str | Unset): 'debit' | 'credit' | null for non-monetary concepts. + element_type (str | Unset): 'concept' | 'abstract' | 'axis' | 'member' | 'hypercube'. Default: 'concept'. + period_type (None | str | Unset): 'instant' | 'duration' | null (null = derive from classification during + validation). + is_monetary (bool | Unset): True for dollar-denominated concepts. Default: True. + description (None | str | Unset): + code (None | str | Unset): Optional chart-of-accounts code (e.g. '1000', '4100-02'). Only meaningful for + ``chart_of_accounts`` blocks. + sub_classification (None | str | Unset): + parent_ref (None | str | Unset): qname of the parent element — either another envelope-local qname or, for + ``reporting_extension`` blocks, a library element qname. + metadata (TaxonomyBlockElementRequestMetadata | Unset): + """ + + qname: str + name: str + classification: None | str | Unset = UNSET + balance_type: None | str | Unset = UNSET + element_type: str | Unset = "concept" + period_type: None | str | Unset = UNSET + is_monetary: bool | Unset = True + description: None | str | Unset = UNSET + code: None | str | Unset = UNSET + sub_classification: None | str | Unset = UNSET + parent_ref: None | str | Unset = UNSET + metadata: TaxonomyBlockElementRequestMetadata | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + qname = self.qname + + name = self.name + + classification: None | str | Unset + if isinstance(self.classification, Unset): + classification = UNSET + else: + classification = self.classification + + balance_type: None | str | Unset + if isinstance(self.balance_type, Unset): + balance_type = UNSET + else: + balance_type = self.balance_type + + element_type = self.element_type + + period_type: None | str | Unset + if isinstance(self.period_type, Unset): + period_type = UNSET + else: + period_type = self.period_type + + is_monetary = self.is_monetary + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + code: None | str | Unset + if isinstance(self.code, Unset): + code = UNSET + else: + code = self.code + + sub_classification: None | str | Unset + if isinstance(self.sub_classification, Unset): + sub_classification = UNSET + else: + sub_classification = self.sub_classification + + parent_ref: None | str | Unset + if isinstance(self.parent_ref, Unset): + parent_ref = UNSET + else: + parent_ref = self.parent_ref + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "qname": qname, + "name": name, + } + ) + if classification is not UNSET: + field_dict["classification"] = classification + if balance_type is not UNSET: + field_dict["balance_type"] = balance_type + if element_type is not UNSET: + field_dict["element_type"] = element_type + if period_type is not UNSET: + field_dict["period_type"] = period_type + if is_monetary is not UNSET: + field_dict["is_monetary"] = is_monetary + if description is not UNSET: + field_dict["description"] = description + if code is not UNSET: + field_dict["code"] = code + if sub_classification is not UNSET: + field_dict["sub_classification"] = sub_classification + if parent_ref is not UNSET: + field_dict["parent_ref"] = parent_ref + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.taxonomy_block_element_request_metadata import ( + TaxonomyBlockElementRequestMetadata, + ) + + d = dict(src_dict) + qname = d.pop("qname") + + name = d.pop("name") + + def _parse_classification(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + classification = _parse_classification(d.pop("classification", UNSET)) + + def _parse_balance_type(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + balance_type = _parse_balance_type(d.pop("balance_type", UNSET)) + + element_type = d.pop("element_type", UNSET) + + def _parse_period_type(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + period_type = _parse_period_type(d.pop("period_type", UNSET)) + + is_monetary = d.pop("is_monetary", UNSET) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_code(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + code = _parse_code(d.pop("code", UNSET)) + + def _parse_sub_classification(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + sub_classification = _parse_sub_classification(d.pop("sub_classification", UNSET)) + + def _parse_parent_ref(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + parent_ref = _parse_parent_ref(d.pop("parent_ref", UNSET)) + + _metadata = d.pop("metadata", UNSET) + metadata: TaxonomyBlockElementRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = TaxonomyBlockElementRequestMetadata.from_dict(_metadata) + + taxonomy_block_element_request = cls( + qname=qname, + name=name, + classification=classification, + balance_type=balance_type, + element_type=element_type, + period_type=period_type, + is_monetary=is_monetary, + description=description, + code=code, + sub_classification=sub_classification, + parent_ref=parent_ref, + metadata=metadata, + ) + + taxonomy_block_element_request.additional_properties = d + return taxonomy_block_element_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_element_request_metadata.py b/robosystems_client/models/taxonomy_block_element_request_metadata.py new file mode 100644 index 0000000..ea19151 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_element_request_metadata.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="TaxonomyBlockElementRequestMetadata") + + +@_attrs_define +class TaxonomyBlockElementRequestMetadata: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_block_element_request_metadata = cls() + + taxonomy_block_element_request_metadata.additional_properties = d + return taxonomy_block_element_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_rule_request.py b/robosystems_client/models/taxonomy_block_rule_request.py new file mode 100644 index 0000000..4c6dc3c --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request.py @@ -0,0 +1,271 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..models.taxonomy_block_rule_request_rule_category import ( + TaxonomyBlockRuleRequestRuleCategory, +) +from ..models.taxonomy_block_rule_request_rule_pattern import ( + TaxonomyBlockRuleRequestRulePattern, +) +from ..models.taxonomy_block_rule_request_severity import ( + TaxonomyBlockRuleRequestSeverity, +) +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.taxonomy_block_rule_request_metadata import ( + TaxonomyBlockRuleRequestMetadata, + ) + from ..models.taxonomy_block_rule_request_variables_item import ( + TaxonomyBlockRuleRequestVariablesItem, + ) + + +T = TypeVar("T", bound="TaxonomyBlockRuleRequest") + + +@_attrs_define +class TaxonomyBlockRuleRequest: + """Rule definition inside a Taxonomy Block envelope. + + Exactly one of ``target_structure_ref``, ``target_element_qname``, or + ``target_taxonomy_self`` must be set (or all null for a global rule). + The ``model_validator`` enforces this contract at the Pydantic layer. + + Attributes: + name (str): Rule identifier, unique within envelope. + rule_category (TaxonomyBlockRuleRequestRuleCategory): One of 8 cm:VerificationRule subclasses. + rule_pattern (TaxonomyBlockRuleRequestRulePattern): One of 11 cm:BusinessRulePattern mechanisms. + expression (str): XPath-flavored predicate body (the rule expression). + description (None | str | Unset): + variables (list[TaxonomyBlockRuleRequestVariablesItem] | Unset): ``$Variable`` → qname bindings. Each entry is + ``{'variable_name': str, 'variable_qname': str}``. + severity (TaxonomyBlockRuleRequestSeverity | Unset): Default: TaxonomyBlockRuleRequestSeverity.ERROR. + target_structure_ref (None | str | Unset): Envelope-local structure name this rule targets (for structure-scoped + rules). Mutually exclusive with the other target_* fields. + target_element_qname (None | str | Unset): qname of the element this rule targets. Mutually exclusive with the + other target_* fields. + target_taxonomy_self (bool | Unset): True iff the rule targets the envelope's own taxonomy row + (``target_kind='taxonomy'``). Mutually exclusive with the other target_* fields. Default: False. + message (None | str | Unset): + metadata (TaxonomyBlockRuleRequestMetadata | Unset): + """ + + name: str + rule_category: TaxonomyBlockRuleRequestRuleCategory + rule_pattern: TaxonomyBlockRuleRequestRulePattern + expression: str + description: None | str | Unset = UNSET + variables: list[TaxonomyBlockRuleRequestVariablesItem] | Unset = UNSET + severity: TaxonomyBlockRuleRequestSeverity | Unset = ( + TaxonomyBlockRuleRequestSeverity.ERROR + ) + target_structure_ref: None | str | Unset = UNSET + target_element_qname: None | str | Unset = UNSET + target_taxonomy_self: bool | Unset = False + message: None | str | Unset = UNSET + metadata: TaxonomyBlockRuleRequestMetadata | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + name = self.name + + rule_category = self.rule_category.value + + rule_pattern = self.rule_pattern.value + + expression = self.expression + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + variables: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.variables, Unset): + variables = [] + for variables_item_data in self.variables: + variables_item = variables_item_data.to_dict() + variables.append(variables_item) + + severity: str | Unset = UNSET + if not isinstance(self.severity, Unset): + severity = self.severity.value + + target_structure_ref: None | str | Unset + if isinstance(self.target_structure_ref, Unset): + target_structure_ref = UNSET + else: + target_structure_ref = self.target_structure_ref + + target_element_qname: None | str | Unset + if isinstance(self.target_element_qname, Unset): + target_element_qname = UNSET + else: + target_element_qname = self.target_element_qname + + target_taxonomy_self = self.target_taxonomy_self + + message: None | str | Unset + if isinstance(self.message, Unset): + message = UNSET + else: + message = self.message + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "name": name, + "rule_category": rule_category, + "rule_pattern": rule_pattern, + "expression": expression, + } + ) + if description is not UNSET: + field_dict["description"] = description + if variables is not UNSET: + field_dict["variables"] = variables + if severity is not UNSET: + field_dict["severity"] = severity + if target_structure_ref is not UNSET: + field_dict["target_structure_ref"] = target_structure_ref + if target_element_qname is not UNSET: + field_dict["target_element_qname"] = target_element_qname + if target_taxonomy_self is not UNSET: + field_dict["target_taxonomy_self"] = target_taxonomy_self + if message is not UNSET: + field_dict["message"] = message + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.taxonomy_block_rule_request_metadata import ( + TaxonomyBlockRuleRequestMetadata, + ) + from ..models.taxonomy_block_rule_request_variables_item import ( + TaxonomyBlockRuleRequestVariablesItem, + ) + + d = dict(src_dict) + name = d.pop("name") + + rule_category = TaxonomyBlockRuleRequestRuleCategory(d.pop("rule_category")) + + rule_pattern = TaxonomyBlockRuleRequestRulePattern(d.pop("rule_pattern")) + + expression = d.pop("expression") + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + _variables = d.pop("variables", UNSET) + variables: list[TaxonomyBlockRuleRequestVariablesItem] | Unset = UNSET + if _variables is not UNSET: + variables = [] + for variables_item_data in _variables: + variables_item = TaxonomyBlockRuleRequestVariablesItem.from_dict( + variables_item_data + ) + + variables.append(variables_item) + + _severity = d.pop("severity", UNSET) + severity: TaxonomyBlockRuleRequestSeverity | Unset + if isinstance(_severity, Unset): + severity = UNSET + else: + severity = TaxonomyBlockRuleRequestSeverity(_severity) + + def _parse_target_structure_ref(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + target_structure_ref = _parse_target_structure_ref( + d.pop("target_structure_ref", UNSET) + ) + + def _parse_target_element_qname(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + target_element_qname = _parse_target_element_qname( + d.pop("target_element_qname", UNSET) + ) + + target_taxonomy_self = d.pop("target_taxonomy_self", UNSET) + + def _parse_message(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + message = _parse_message(d.pop("message", UNSET)) + + _metadata = d.pop("metadata", UNSET) + metadata: TaxonomyBlockRuleRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = TaxonomyBlockRuleRequestMetadata.from_dict(_metadata) + + taxonomy_block_rule_request = cls( + name=name, + rule_category=rule_category, + rule_pattern=rule_pattern, + expression=expression, + description=description, + variables=variables, + severity=severity, + target_structure_ref=target_structure_ref, + target_element_qname=target_element_qname, + target_taxonomy_self=target_taxonomy_self, + message=message, + metadata=metadata, + ) + + taxonomy_block_rule_request.additional_properties = d + return taxonomy_block_rule_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_rule_request_metadata.py b/robosystems_client/models/taxonomy_block_rule_request_metadata.py new file mode 100644 index 0000000..1fa65e7 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request_metadata.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="TaxonomyBlockRuleRequestMetadata") + + +@_attrs_define +class TaxonomyBlockRuleRequestMetadata: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_block_rule_request_metadata = cls() + + taxonomy_block_rule_request_metadata.additional_properties = d + return taxonomy_block_rule_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_rule_request_rule_category.py b/robosystems_client/models/taxonomy_block_rule_request_rule_category.py new file mode 100644 index 0000000..be81b1b --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request_rule_category.py @@ -0,0 +1,16 @@ +from enum import Enum + + +class TaxonomyBlockRuleRequestRuleCategory(str, Enum): + AUTOMATEDACCOUNTINGANDREPORTINGCHECKS = "AutomatedAccountingAndReportingChecks" + DISCLOSUREMECHANICSRULE = "DisclosureMechanicsRule" + FUNDAMENTALACCOUNTINGCONCEPTRELATION = "FundamentalAccountingConceptRelation" + PEERCONSISTENCYRULE = "PeerConsistencyRule" + PRIORPERIODCONSISTENCYRULE = "PriorPeriodConsistencyRule" + REPORTINGSYSTEMSPECIFICRULE = "ReportingSystemSpecificRule" + REPORTLEVELMODELSTRUCTURERULE = "ReportLevelModelStructureRule" + TODOMANUALTASK = "ToDoManualTask" + XBRLTECHNICALSYNTAXRULE = "XBRLTechnicalSyntaxRule" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/taxonomy_block_rule_request_rule_pattern.py b/robosystems_client/models/taxonomy_block_rule_request_rule_pattern.py new file mode 100644 index 0000000..6a131c8 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request_rule_pattern.py @@ -0,0 +1,18 @@ +from enum import Enum + + +class TaxonomyBlockRuleRequestRulePattern(str, Enum): + ADJUSTMENT = "Adjustment" + COEXISTS = "CoExists" + EQUALTO = "EqualTo" + EXISTS = "Exists" + GREATERTHAN = "GreaterThan" + GREATERTHANOREQUALTOZERO = "GreaterThanOrEqualToZero" + LESSTHAN = "LessThan" + ROLLFORWARD = "RollForward" + ROLLUP = "RollUp" + SUMEQUALS = "SumEquals" + VARIANCE = "Variance" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/taxonomy_block_rule_request_severity.py b/robosystems_client/models/taxonomy_block_rule_request_severity.py new file mode 100644 index 0000000..89ba2e4 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request_severity.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class TaxonomyBlockRuleRequestSeverity(str, Enum): + ERROR = "error" + INFO = "info" + WARNING = "warning" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/taxonomy_block_rule_request_variables_item.py b/robosystems_client/models/taxonomy_block_rule_request_variables_item.py new file mode 100644 index 0000000..6cf67d0 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_rule_request_variables_item.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="TaxonomyBlockRuleRequestVariablesItem") + + +@_attrs_define +class TaxonomyBlockRuleRequestVariablesItem: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_block_rule_request_variables_item = cls() + + taxonomy_block_rule_request_variables_item.additional_properties = d + return taxonomy_block_rule_request_variables_item + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_structure_request.py b/robosystems_client/models/taxonomy_block_structure_request.py new file mode 100644 index 0000000..7513daa --- /dev/null +++ b/robosystems_client/models/taxonomy_block_structure_request.py @@ -0,0 +1,143 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..models.taxonomy_block_structure_request_structure_type import ( + TaxonomyBlockStructureRequestStructureType, +) +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.taxonomy_block_structure_request_metadata import ( + TaxonomyBlockStructureRequestMetadata, + ) + + +T = TypeVar("T", bound="TaxonomyBlockStructureRequest") + + +@_attrs_define +class TaxonomyBlockStructureRequest: + """Structure definition inside a Taxonomy Block envelope. + + Attributes: + name (str): Envelope-local structure name (unique within envelope). + structure_type (TaxonomyBlockStructureRequestStructureType): DB ``structures.structure_type`` enum. CoA blocks + use ``chart_of_accounts``; reporting extensions use the statement family or ``custom``; custom ontology uses + ``custom``. + description (None | str | Unset): + role_uri (None | str | Unset): + metadata (TaxonomyBlockStructureRequestMetadata | Unset): + """ + + name: str + structure_type: TaxonomyBlockStructureRequestStructureType + description: None | str | Unset = UNSET + role_uri: None | str | Unset = UNSET + metadata: TaxonomyBlockStructureRequestMetadata | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + name = self.name + + structure_type = self.structure_type.value + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + role_uri: None | str | Unset + if isinstance(self.role_uri, Unset): + role_uri = UNSET + else: + role_uri = self.role_uri + + metadata: dict[str, Any] | Unset = UNSET + if not isinstance(self.metadata, Unset): + metadata = self.metadata.to_dict() + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "name": name, + "structure_type": structure_type, + } + ) + if description is not UNSET: + field_dict["description"] = description + if role_uri is not UNSET: + field_dict["role_uri"] = role_uri + if metadata is not UNSET: + field_dict["metadata"] = metadata + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.taxonomy_block_structure_request_metadata import ( + TaxonomyBlockStructureRequestMetadata, + ) + + d = dict(src_dict) + name = d.pop("name") + + structure_type = TaxonomyBlockStructureRequestStructureType(d.pop("structure_type")) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_role_uri(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + role_uri = _parse_role_uri(d.pop("role_uri", UNSET)) + + _metadata = d.pop("metadata", UNSET) + metadata: TaxonomyBlockStructureRequestMetadata | Unset + if isinstance(_metadata, Unset): + metadata = UNSET + else: + metadata = TaxonomyBlockStructureRequestMetadata.from_dict(_metadata) + + taxonomy_block_structure_request = cls( + name=name, + structure_type=structure_type, + description=description, + role_uri=role_uri, + metadata=metadata, + ) + + taxonomy_block_structure_request.additional_properties = d + return taxonomy_block_structure_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_structure_request_metadata.py b/robosystems_client/models/taxonomy_block_structure_request_metadata.py new file mode 100644 index 0000000..53694dd --- /dev/null +++ b/robosystems_client/models/taxonomy_block_structure_request_metadata.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="TaxonomyBlockStructureRequestMetadata") + + +@_attrs_define +class TaxonomyBlockStructureRequestMetadata: + """ """ + + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + taxonomy_block_structure_request_metadata = cls() + + taxonomy_block_structure_request_metadata.additional_properties = d + return taxonomy_block_structure_request_metadata + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/robosystems_client/models/taxonomy_block_structure_request_structure_type.py b/robosystems_client/models/taxonomy_block_structure_request_structure_type.py new file mode 100644 index 0000000..3d7cef3 --- /dev/null +++ b/robosystems_client/models/taxonomy_block_structure_request_structure_type.py @@ -0,0 +1,19 @@ +from enum import Enum + + +class TaxonomyBlockStructureRequestStructureType(str, Enum): + BALANCE_SHEET = "balance_sheet" + CASH_FLOW_STATEMENT = "cash_flow_statement" + CHART_OF_ACCOUNTS = "chart_of_accounts" + COA_MAPPING = "coa_mapping" + CUSTOM = "custom" + EQUITY_STATEMENT = "equity_statement" + INCOME_STATEMENT = "income_statement" + METRIC = "metric" + POLICY = "policy" + RECONCILIATION = "reconciliation" + ROLLFORWARD = "rollforward" + SCHEDULE = "schedule" + + def __str__(self) -> str: + return str(self.value) diff --git a/robosystems_client/models/update_taxonomy_block_request.py b/robosystems_client/models/update_taxonomy_block_request.py new file mode 100644 index 0000000..f6710e3 --- /dev/null +++ b/robosystems_client/models/update_taxonomy_block_request.py @@ -0,0 +1,329 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, TypeVar, cast + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +if TYPE_CHECKING: + from ..models.element_update_patch import ElementUpdatePatch + from ..models.structure_update_patch import StructureUpdatePatch + from ..models.taxonomy_block_association_request import ( + TaxonomyBlockAssociationRequest, + ) + from ..models.taxonomy_block_element_request import TaxonomyBlockElementRequest + from ..models.taxonomy_block_rule_request import TaxonomyBlockRuleRequest + from ..models.taxonomy_block_structure_request import TaxonomyBlockStructureRequest + + +T = TypeVar("T", bound="UpdateTaxonomyBlockRequest") + + +@_attrs_define +class UpdateTaxonomyBlockRequest: + """Request body for the ``update-taxonomy-block`` operation. + + Top-level fields (name / description / version) apply to the taxonomy + row itself. The delta lists mutate atoms incrementally — the validator + (Phase 2.3) re-runs the seven-phase check across the projected post- + update state before anything commits. + + Attributes: + taxonomy_id (str): + name (None | str | Unset): + description (None | str | Unset): + version (None | str | Unset): + elements_to_add (list[TaxonomyBlockElementRequest] | Unset): + elements_to_update (list[ElementUpdatePatch] | Unset): + elements_to_remove (list[str] | Unset): qnames of elements to remove. + structures_to_add (list[TaxonomyBlockStructureRequest] | Unset): + structures_to_update (list[StructureUpdatePatch] | Unset): + structures_to_remove (list[str] | Unset): Structure ids to remove. + associations_to_add (list[TaxonomyBlockAssociationRequest] | Unset): + associations_to_remove (list[str] | Unset): Association ids to remove. + rules_to_add (list[TaxonomyBlockRuleRequest] | Unset): + rules_to_remove (list[str] | Unset): Rule ids to remove. + """ + + taxonomy_id: str + name: None | str | Unset = UNSET + description: None | str | Unset = UNSET + version: None | str | Unset = UNSET + elements_to_add: list[TaxonomyBlockElementRequest] | Unset = UNSET + elements_to_update: list[ElementUpdatePatch] | Unset = UNSET + elements_to_remove: list[str] | Unset = UNSET + structures_to_add: list[TaxonomyBlockStructureRequest] | Unset = UNSET + structures_to_update: list[StructureUpdatePatch] | Unset = UNSET + structures_to_remove: list[str] | Unset = UNSET + associations_to_add: list[TaxonomyBlockAssociationRequest] | Unset = UNSET + associations_to_remove: list[str] | Unset = UNSET + rules_to_add: list[TaxonomyBlockRuleRequest] | Unset = UNSET + rules_to_remove: list[str] | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + taxonomy_id = self.taxonomy_id + + name: None | str | Unset + if isinstance(self.name, Unset): + name = UNSET + else: + name = self.name + + description: None | str | Unset + if isinstance(self.description, Unset): + description = UNSET + else: + description = self.description + + version: None | str | Unset + if isinstance(self.version, Unset): + version = UNSET + else: + version = self.version + + elements_to_add: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.elements_to_add, Unset): + elements_to_add = [] + for elements_to_add_item_data in self.elements_to_add: + elements_to_add_item = elements_to_add_item_data.to_dict() + elements_to_add.append(elements_to_add_item) + + elements_to_update: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.elements_to_update, Unset): + elements_to_update = [] + for elements_to_update_item_data in self.elements_to_update: + elements_to_update_item = elements_to_update_item_data.to_dict() + elements_to_update.append(elements_to_update_item) + + elements_to_remove: list[str] | Unset = UNSET + if not isinstance(self.elements_to_remove, Unset): + elements_to_remove = self.elements_to_remove + + structures_to_add: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.structures_to_add, Unset): + structures_to_add = [] + for structures_to_add_item_data in self.structures_to_add: + structures_to_add_item = structures_to_add_item_data.to_dict() + structures_to_add.append(structures_to_add_item) + + structures_to_update: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.structures_to_update, Unset): + structures_to_update = [] + for structures_to_update_item_data in self.structures_to_update: + structures_to_update_item = structures_to_update_item_data.to_dict() + structures_to_update.append(structures_to_update_item) + + structures_to_remove: list[str] | Unset = UNSET + if not isinstance(self.structures_to_remove, Unset): + structures_to_remove = self.structures_to_remove + + associations_to_add: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.associations_to_add, Unset): + associations_to_add = [] + for associations_to_add_item_data in self.associations_to_add: + associations_to_add_item = associations_to_add_item_data.to_dict() + associations_to_add.append(associations_to_add_item) + + associations_to_remove: list[str] | Unset = UNSET + if not isinstance(self.associations_to_remove, Unset): + associations_to_remove = self.associations_to_remove + + rules_to_add: list[dict[str, Any]] | Unset = UNSET + if not isinstance(self.rules_to_add, Unset): + rules_to_add = [] + for rules_to_add_item_data in self.rules_to_add: + rules_to_add_item = rules_to_add_item_data.to_dict() + rules_to_add.append(rules_to_add_item) + + rules_to_remove: list[str] | Unset = UNSET + if not isinstance(self.rules_to_remove, Unset): + rules_to_remove = self.rules_to_remove + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "taxonomy_id": taxonomy_id, + } + ) + if name is not UNSET: + field_dict["name"] = name + if description is not UNSET: + field_dict["description"] = description + if version is not UNSET: + field_dict["version"] = version + if elements_to_add is not UNSET: + field_dict["elements_to_add"] = elements_to_add + if elements_to_update is not UNSET: + field_dict["elements_to_update"] = elements_to_update + if elements_to_remove is not UNSET: + field_dict["elements_to_remove"] = elements_to_remove + if structures_to_add is not UNSET: + field_dict["structures_to_add"] = structures_to_add + if structures_to_update is not UNSET: + field_dict["structures_to_update"] = structures_to_update + if structures_to_remove is not UNSET: + field_dict["structures_to_remove"] = structures_to_remove + if associations_to_add is not UNSET: + field_dict["associations_to_add"] = associations_to_add + if associations_to_remove is not UNSET: + field_dict["associations_to_remove"] = associations_to_remove + if rules_to_add is not UNSET: + field_dict["rules_to_add"] = rules_to_add + if rules_to_remove is not UNSET: + field_dict["rules_to_remove"] = rules_to_remove + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.element_update_patch import ElementUpdatePatch + from ..models.structure_update_patch import StructureUpdatePatch + from ..models.taxonomy_block_association_request import ( + TaxonomyBlockAssociationRequest, + ) + from ..models.taxonomy_block_element_request import TaxonomyBlockElementRequest + from ..models.taxonomy_block_rule_request import TaxonomyBlockRuleRequest + from ..models.taxonomy_block_structure_request import TaxonomyBlockStructureRequest + + d = dict(src_dict) + taxonomy_id = d.pop("taxonomy_id") + + def _parse_name(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + name = _parse_name(d.pop("name", UNSET)) + + def _parse_description(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + description = _parse_description(d.pop("description", UNSET)) + + def _parse_version(data: object) -> None | str | Unset: + if data is None: + return data + if isinstance(data, Unset): + return data + return cast(None | str | Unset, data) + + version = _parse_version(d.pop("version", UNSET)) + + _elements_to_add = d.pop("elements_to_add", UNSET) + elements_to_add: list[TaxonomyBlockElementRequest] | Unset = UNSET + if _elements_to_add is not UNSET: + elements_to_add = [] + for elements_to_add_item_data in _elements_to_add: + elements_to_add_item = TaxonomyBlockElementRequest.from_dict( + elements_to_add_item_data + ) + + elements_to_add.append(elements_to_add_item) + + _elements_to_update = d.pop("elements_to_update", UNSET) + elements_to_update: list[ElementUpdatePatch] | Unset = UNSET + if _elements_to_update is not UNSET: + elements_to_update = [] + for elements_to_update_item_data in _elements_to_update: + elements_to_update_item = ElementUpdatePatch.from_dict( + elements_to_update_item_data + ) + + elements_to_update.append(elements_to_update_item) + + elements_to_remove = cast(list[str], d.pop("elements_to_remove", UNSET)) + + _structures_to_add = d.pop("structures_to_add", UNSET) + structures_to_add: list[TaxonomyBlockStructureRequest] | Unset = UNSET + if _structures_to_add is not UNSET: + structures_to_add = [] + for structures_to_add_item_data in _structures_to_add: + structures_to_add_item = TaxonomyBlockStructureRequest.from_dict( + structures_to_add_item_data + ) + + structures_to_add.append(structures_to_add_item) + + _structures_to_update = d.pop("structures_to_update", UNSET) + structures_to_update: list[StructureUpdatePatch] | Unset = UNSET + if _structures_to_update is not UNSET: + structures_to_update = [] + for structures_to_update_item_data in _structures_to_update: + structures_to_update_item = StructureUpdatePatch.from_dict( + structures_to_update_item_data + ) + + structures_to_update.append(structures_to_update_item) + + structures_to_remove = cast(list[str], d.pop("structures_to_remove", UNSET)) + + _associations_to_add = d.pop("associations_to_add", UNSET) + associations_to_add: list[TaxonomyBlockAssociationRequest] | Unset = UNSET + if _associations_to_add is not UNSET: + associations_to_add = [] + for associations_to_add_item_data in _associations_to_add: + associations_to_add_item = TaxonomyBlockAssociationRequest.from_dict( + associations_to_add_item_data + ) + + associations_to_add.append(associations_to_add_item) + + associations_to_remove = cast(list[str], d.pop("associations_to_remove", UNSET)) + + _rules_to_add = d.pop("rules_to_add", UNSET) + rules_to_add: list[TaxonomyBlockRuleRequest] | Unset = UNSET + if _rules_to_add is not UNSET: + rules_to_add = [] + for rules_to_add_item_data in _rules_to_add: + rules_to_add_item = TaxonomyBlockRuleRequest.from_dict(rules_to_add_item_data) + + rules_to_add.append(rules_to_add_item) + + rules_to_remove = cast(list[str], d.pop("rules_to_remove", UNSET)) + + update_taxonomy_block_request = cls( + taxonomy_id=taxonomy_id, + name=name, + description=description, + version=version, + elements_to_add=elements_to_add, + elements_to_update=elements_to_update, + elements_to_remove=elements_to_remove, + structures_to_add=structures_to_add, + structures_to_update=structures_to_update, + structures_to_remove=structures_to_remove, + associations_to_add=associations_to_add, + associations_to_remove=associations_to_remove, + rules_to_add=rules_to_add, + rules_to_remove=rules_to_remove, + ) + + update_taxonomy_block_request.additional_properties = d + return update_taxonomy_block_request + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties