diff --git a/.github/workflows/updateSDKQueries.yml b/.github/workflows/updateSDKQueries.yml index 8f4b694..16b5a8c 100644 --- a/.github/workflows/updateSDKQueries.yml +++ b/.github/workflows/updateSDKQueries.yml @@ -54,10 +54,14 @@ jobs: rm -rf tests/template-schema cp -R ../graphql-queries/template-schema tests/template-schema + # `make snapshots` regenerates tests/snapshots from the queries just + # copied. Without it the sync PR ships updated queries alongside stale + # snapshots, and the `snapshots` job in tests.yml fails on every sync. - name: Generate SDK working-directory: ./fragment-python run: | make build + make snapshots make lint - name: Create Pull Request diff --git a/fragment/sdk/__init__.py b/fragment/sdk/__init__.py index cb235d1..821a188 100644 --- a/fragment/sdk/__init__.py +++ b/fragment/sdk/__init__.py @@ -1,5 +1,17 @@ # Generated by fragment (with the help of ariadne-codegen) +from .add_ledger_entries import ( + AddLedgerEntries, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount, + AddLedgerEntriesAddLedgerEntriesBadRequestError, + AddLedgerEntriesAddLedgerEntriesInternalError, +) from .add_ledger_entry import ( AddLedgerEntry, AddLedgerEntryAddLedgerEntryAddLedgerEntryResult, @@ -388,6 +400,16 @@ ) __all__ = [ + "AddLedgerEntries", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", "AddLedgerEntry", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResult", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResultEntry", diff --git a/fragment/sdk/add_ledger_entries.py b/fragment/sdk/add_ledger_entries.py new file mode 100644 index 0000000..6ddf981 --- /dev/null +++ b/fragment/sdk/add_ledger_entries.py @@ -0,0 +1,84 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Optional, Union + +from pydantic import Field + +from .base_model import BaseModel + + +class AddLedgerEntries(BaseModel): + add_ledger_entries: Union[ + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", + ] = Field(alias="addLedgerEntries", discriminator="typename__") + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError(BaseModel): + typename__: Literal["AddLedgerEntriesError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + errors: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors(BaseModel): + ik: Any + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult(BaseModel): + typename__: Literal["AddLedgerEntriesResult"] = Field(alias="__typename") + results: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults(BaseModel): + is_ik_replay: bool = Field(alias="isIkReplay") + entry: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry" + lines: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry(BaseModel): + type_: Optional[Any] = Field(alias="type") + id: str + ik: str + posted: Any + created: Any + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines(BaseModel): + id: str + amount: Any + account: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount" + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount( + BaseModel +): + path: str + + +class AddLedgerEntriesAddLedgerEntriesBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +AddLedgerEntries.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines.model_rebuild() diff --git a/fragment/sdk/client.py b/fragment/sdk/client.py index 5896823..b62b33a 100644 --- a/fragment/sdk/client.py +++ b/fragment/sdk/client.py @@ -3,6 +3,7 @@ from typing import Any, Optional +from .add_ledger_entries import AddLedgerEntries from .add_ledger_entry import AddLedgerEntry from .add_ledger_entry_runtime import AddLedgerEntryRuntime from .async_client import AsyncFragmentClient @@ -28,6 +29,7 @@ from .get_schema import GetSchema from .get_workspace import GetWorkspace from .input_types import ( + AddLedgerEntryInput, CreateLedgerInput, CurrencyMatchInput, CustomAccountInput, @@ -208,6 +210,66 @@ async def delete_ledger( data = self.get_data(response) return DeleteLedger.model_validate(data) + async def add_ledger_entries( + self, entries: list[AddLedgerEntryInput], **kwargs: Any + ) -> AddLedgerEntries: + query = gql(""" + mutation addLedgerEntries($entries: [AddLedgerEntryInput!]!) { + addLedgerEntries(entries: $entries) { + __typename + ... on AddLedgerEntriesResult { + results { + isIkReplay + entry { + type + id + ik + posted + created + } + lines { + id + amount + account { + path + } + } + } + } + ... on AddLedgerEntriesError { + code + message + retryable + errors { + ik + code + message + retryable + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = {"entries": entries} + response = await self.execute( + query=query, + operation_name="addLedgerEntries", + variables=variables, + **kwargs + ) + data = self.get_data(response) + return AddLedgerEntries.model_validate(data) + async def add_ledger_entry( self, ik: Any, diff --git a/fragment/std_queries/queries.graphql b/fragment/std_queries/queries.graphql index 12118e7..2ac3e79 100644 --- a/fragment/std_queries/queries.graphql +++ b/fragment/std_queries/queries.graphql @@ -94,6 +94,52 @@ mutation deleteLedger($ledger: LedgerMatchInput!) { } } +mutation addLedgerEntries($entries: [AddLedgerEntryInput!]!) { + addLedgerEntries(entries: $entries) { + __typename + ... on AddLedgerEntriesResult { + results { + isIkReplay + entry { + type + id + ik + posted + created + } + lines { + id + amount + account { + path + } + } + } + } + ... on AddLedgerEntriesError { + code + message + retryable + errors { + ik + code + message + retryable + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } +} + mutation addLedgerEntry( $ik: SafeString! $ledgerIk: SafeString! diff --git a/fragment/sync_sdk/__init__.py b/fragment/sync_sdk/__init__.py index 6ffdf15..8023915 100644 --- a/fragment/sync_sdk/__init__.py +++ b/fragment/sync_sdk/__init__.py @@ -1,5 +1,17 @@ # Generated by fragment (with the help of ariadne-codegen) +from .add_ledger_entries import ( + AddLedgerEntries, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount, + AddLedgerEntriesAddLedgerEntriesBadRequestError, + AddLedgerEntriesAddLedgerEntriesInternalError, +) from .add_ledger_entry import ( AddLedgerEntry, AddLedgerEntryAddLedgerEntryAddLedgerEntryResult, @@ -388,6 +400,16 @@ ) __all__ = [ + "AddLedgerEntries", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", "AddLedgerEntry", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResult", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResultEntry", diff --git a/fragment/sync_sdk/add_ledger_entries.py b/fragment/sync_sdk/add_ledger_entries.py new file mode 100644 index 0000000..6ddf981 --- /dev/null +++ b/fragment/sync_sdk/add_ledger_entries.py @@ -0,0 +1,84 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Optional, Union + +from pydantic import Field + +from .base_model import BaseModel + + +class AddLedgerEntries(BaseModel): + add_ledger_entries: Union[ + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", + ] = Field(alias="addLedgerEntries", discriminator="typename__") + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError(BaseModel): + typename__: Literal["AddLedgerEntriesError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + errors: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors(BaseModel): + ik: Any + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult(BaseModel): + typename__: Literal["AddLedgerEntriesResult"] = Field(alias="__typename") + results: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults(BaseModel): + is_ik_replay: bool = Field(alias="isIkReplay") + entry: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry" + lines: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry(BaseModel): + type_: Optional[Any] = Field(alias="type") + id: str + ik: str + posted: Any + created: Any + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines(BaseModel): + id: str + amount: Any + account: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount" + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount( + BaseModel +): + path: str + + +class AddLedgerEntriesAddLedgerEntriesBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +AddLedgerEntries.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines.model_rebuild() diff --git a/fragment/sync_sdk/client.py b/fragment/sync_sdk/client.py index 545b20c..4d57595 100644 --- a/fragment/sync_sdk/client.py +++ b/fragment/sync_sdk/client.py @@ -3,6 +3,7 @@ from typing import Any, Optional +from .add_ledger_entries import AddLedgerEntries from .add_ledger_entry import AddLedgerEntry from .add_ledger_entry_runtime import AddLedgerEntryRuntime from .create_custom_currency import CreateCustomCurrency @@ -27,6 +28,7 @@ from .get_schema import GetSchema from .get_workspace import GetWorkspace from .input_types import ( + AddLedgerEntryInput, CreateLedgerInput, CurrencyMatchInput, CustomAccountInput, @@ -204,6 +206,66 @@ def delete_ledger(self, ledger: LedgerMatchInput, **kwargs: Any) -> DeleteLedger data = self.get_data(response) return DeleteLedger.model_validate(data) + def add_ledger_entries( + self, entries: list[AddLedgerEntryInput], **kwargs: Any + ) -> AddLedgerEntries: + query = gql(""" + mutation addLedgerEntries($entries: [AddLedgerEntryInput!]!) { + addLedgerEntries(entries: $entries) { + __typename + ... on AddLedgerEntriesResult { + results { + isIkReplay + entry { + type + id + ik + posted + created + } + lines { + id + amount + account { + path + } + } + } + } + ... on AddLedgerEntriesError { + code + message + retryable + errors { + ik + code + message + retryable + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = {"entries": entries} + response = self.execute( + query=query, + operation_name="addLedgerEntries", + variables=variables, + **kwargs + ) + data = self.get_data(response) + return AddLedgerEntries.model_validate(data) + def add_ledger_entry( self, ik: Any, diff --git a/tests/snapshots/001-marketing-schema/sdk/__init__.py b/tests/snapshots/001-marketing-schema/sdk/__init__.py index 43ca152..39c0604 100644 --- a/tests/snapshots/001-marketing-schema/sdk/__init__.py +++ b/tests/snapshots/001-marketing-schema/sdk/__init__.py @@ -1,5 +1,17 @@ # Generated by fragment (with the help of ariadne-codegen) +from .add_ledger_entries import ( + AddLedgerEntries, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines, + AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount, + AddLedgerEntriesAddLedgerEntriesBadRequestError, + AddLedgerEntriesAddLedgerEntriesInternalError, +) from .add_ledger_entry import ( AddLedgerEntry, AddLedgerEntryAddLedgerEntryAddLedgerEntryResult, @@ -505,6 +517,16 @@ ) __all__ = [ + "AddLedgerEntries", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", "AddLedgerEntry", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResult", "AddLedgerEntryAddLedgerEntryAddLedgerEntryResultEntry", diff --git a/tests/snapshots/001-marketing-schema/sdk/add_ledger_entries.py b/tests/snapshots/001-marketing-schema/sdk/add_ledger_entries.py new file mode 100644 index 0000000..04a86a5 --- /dev/null +++ b/tests/snapshots/001-marketing-schema/sdk/add_ledger_entries.py @@ -0,0 +1,84 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: tests/snapshots/001-marketing-schema/ + +from typing import Any, Literal, Optional, Union + +from pydantic import Field + +from .base_model import BaseModel + + +class AddLedgerEntries(BaseModel): + add_ledger_entries: Union[ + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError", + "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult", + "AddLedgerEntriesAddLedgerEntriesBadRequestError", + "AddLedgerEntriesAddLedgerEntriesInternalError", + ] = Field(alias="addLedgerEntries", discriminator="typename__") + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError(BaseModel): + typename__: Literal["AddLedgerEntriesError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + errors: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesErrorErrors(BaseModel): + ik: Any + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult(BaseModel): + typename__: Literal["AddLedgerEntriesResult"] = Field(alias="__typename") + results: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults(BaseModel): + is_ik_replay: bool = Field(alias="isIkReplay") + entry: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry" + lines: list["AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines"] + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsEntry(BaseModel): + type_: Optional[Any] = Field(alias="type") + id: str + ik: str + posted: Any + created: Any + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines(BaseModel): + id: str + amount: Any + account: "AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount" + + +class AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLinesAccount( + BaseModel +): + path: str + + +class AddLedgerEntriesAddLedgerEntriesBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class AddLedgerEntriesAddLedgerEntriesInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +AddLedgerEntries.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesError.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResult.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResults.model_rebuild() +AddLedgerEntriesAddLedgerEntriesAddLedgerEntriesResultResultsLines.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/client.py b/tests/snapshots/001-marketing-schema/sdk/client.py index 199a693..c127eb3 100644 --- a/tests/snapshots/001-marketing-schema/sdk/client.py +++ b/tests/snapshots/001-marketing-schema/sdk/client.py @@ -3,6 +3,7 @@ from typing import Any, Optional +from .add_ledger_entries import AddLedgerEntries from .add_ledger_entry import AddLedgerEntry from .add_ledger_entry_runtime import AddLedgerEntryRuntime from .async_client import AsyncFragmentClient @@ -28,6 +29,7 @@ from .get_schema import GetSchema from .get_workspace import GetWorkspace from .input_types import ( + AddLedgerEntryInput, CreateLedgerInput, CurrencyMatchInput, CustomAccountInput, @@ -977,6 +979,66 @@ async def delete_ledger( data = self.get_data(response) return DeleteLedger.model_validate(data) + async def add_ledger_entries( + self, entries: list[AddLedgerEntryInput], **kwargs: Any + ) -> AddLedgerEntries: + query = gql(""" + mutation addLedgerEntries($entries: [AddLedgerEntryInput!]!) { + addLedgerEntries(entries: $entries) { + __typename + ... on AddLedgerEntriesResult { + results { + isIkReplay + entry { + type + id + ik + posted + created + } + lines { + id + amount + account { + path + } + } + } + } + ... on AddLedgerEntriesError { + code + message + retryable + errors { + ik + code + message + retryable + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = {"entries": entries} + response = await self.execute( + query=query, + operation_name="addLedgerEntries", + variables=variables, + **kwargs + ) + data = self.get_data(response) + return AddLedgerEntries.model_validate(data) + async def add_ledger_entry( self, ik: Any,