diff --git a/fragment/sdk/__init__.py b/fragment/sdk/__init__.py index c6efa4c..20b69e6 100644 --- a/fragment/sdk/__init__.py +++ b/fragment/sdk/__init__.py @@ -61,6 +61,8 @@ CreatePaymentCreatePaymentCreatePaymentResult, CreatePaymentCreatePaymentCreatePaymentResultPayment, CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes, CreatePaymentCreatePaymentInternalError, ) from .create_payment_method_setup import ( @@ -114,9 +116,11 @@ LedgerMigrationStatus, LedgerTypes, LinkType, + PaymentAttemptStatus, PaymentCurrencyCode, PaymentMethodSetupStatus, PaymentMode, + PaymentRefundStatus, PaymentStatus, PostLinesAs, ReadBalanceConsistencyMode, @@ -203,7 +207,13 @@ GetLedgerEntryLedgerEntryLinesNodes, GetLedgerEntryLedgerEntryLinesNodesAccount, ) -from .get_payment import GetPayment, GetPaymentPayment, GetPaymentPaymentCurrency +from .get_payment import ( + GetPayment, + GetPaymentPayment, + GetPaymentPaymentCurrency, + GetPaymentPaymentRefunds, + GetPaymentPaymentRefundsNodes, +) from .get_payment_method import ( GetPaymentMethod, GetPaymentMethodPaymentMethodCardPaymentMethod, @@ -285,6 +295,7 @@ PaymentMethodsFilterSet, PaymentsFilterSet, PaymentStatusFilter, + RefundPaymentInput, SceneEntryInput, SceneEventInput, SceneInput, @@ -396,6 +407,8 @@ ListPaymentsLedgerPayments, ListPaymentsLedgerPaymentsNodes, ListPaymentsLedgerPaymentsNodesCurrency, + ListPaymentsLedgerPaymentsNodesRefunds, + ListPaymentsLedgerPaymentsNodesRefundsNodes, ListPaymentsLedgerPaymentsPageInfo, ) from .migrate_ledger_entry import ( @@ -434,6 +447,28 @@ ReconcileTxRuntimeReconcileTxReconcileTxResultLines, ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount, ) +from .refund_payment import ( + RefundPayment, + RefundPaymentRefundPaymentBadRequestError, + RefundPaymentRefundPaymentInternalError, + RefundPaymentRefundPaymentRefundPaymentResult, + RefundPaymentRefundPaymentRefundPaymentResultPayment, + RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes, + RefundPaymentRefundPaymentRefundPaymentResultRefund, +) +from .retry_payment import ( + RetryPayment, + RetryPaymentRetryPaymentBadRequestError, + RetryPaymentRetryPaymentInternalError, + RetryPaymentRetryPaymentRetryPaymentResult, + RetryPaymentRetryPaymentRetryPaymentResultAttempt, + RetryPaymentRetryPaymentRetryPaymentResultPayment, + RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes, +) from .reverse_ledger_entry import ( ReverseLedgerEntry, ReverseLedgerEntryReverseLedgerEntryBadRequestError, @@ -565,6 +600,8 @@ "CreatePaymentCreatePaymentCreatePaymentResult", "CreatePaymentCreatePaymentCreatePaymentResultPayment", "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes", "CreatePaymentCreatePaymentInternalError", "CreatePaymentInput", "CreatePaymentMethodSetup", @@ -676,6 +713,8 @@ "GetPaymentMethodSetupPaymentMethodSetupPaymentMethodPaymentMethod", "GetPaymentPayment", "GetPaymentPaymentCurrency", + "GetPaymentPaymentRefunds", + "GetPaymentPaymentRefundsNodes", "GetSchema", "GetSchemaSchema", "GetSchemaSchemaVersion", @@ -783,6 +822,8 @@ "ListPaymentsLedgerPayments", "ListPaymentsLedgerPaymentsNodes", "ListPaymentsLedgerPaymentsNodesCurrency", + "ListPaymentsLedgerPaymentsNodesRefunds", + "ListPaymentsLedgerPaymentsNodesRefundsNodes", "ListPaymentsLedgerPaymentsPageInfo", "MigrateLedgerEntry", "MigrateLedgerEntryInput", @@ -801,6 +842,7 @@ "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLines", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodes", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodesAccount", + "PaymentAttemptStatus", "PaymentCurrencyCode", "PaymentMatchInput", "PaymentMethodMatchInput", @@ -808,6 +850,7 @@ "PaymentMethodSetupStatus", "PaymentMethodsFilterSet", "PaymentMode", + "PaymentRefundStatus", "PaymentStatus", "PaymentStatusFilter", "PaymentsFilterSet", @@ -827,6 +870,25 @@ "ReconcileTxRuntimeReconcileTxReconcileTxResultEntry", "ReconcileTxRuntimeReconcileTxReconcileTxResultLines", "ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount", + "RefundPayment", + "RefundPaymentInput", + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + "RefundPaymentRefundPaymentRefundPaymentResultPayment", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes", + "RefundPaymentRefundPaymentRefundPaymentResultRefund", + "RetryPayment", + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + "RetryPaymentRetryPaymentRetryPaymentResultAttempt", + "RetryPaymentRetryPaymentRetryPaymentResultPayment", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes", "ReverseLedgerEntry", "ReverseLedgerEntryReverseLedgerEntryBadRequestError", "ReverseLedgerEntryReverseLedgerEntryInternalError", diff --git a/fragment/sdk/client.py b/fragment/sdk/client.py index 631a4a8..00fd1cb 100644 --- a/fragment/sdk/client.py +++ b/fragment/sdk/client.py @@ -70,6 +70,8 @@ from .migrate_ledger_entry import MigrateLedgerEntry from .reconcile_tx import ReconcileTx from .reconcile_tx_runtime import ReconcileTxRuntime +from .refund_payment import RefundPayment +from .retry_payment import RetryPayment from .reverse_ledger_entry import ReverseLedgerEntry from .store_schema import StoreSchema from .sync_custom_accounts import SyncCustomAccounts @@ -1959,6 +1961,16 @@ async def create_payment( currency { code } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } ... on BadRequestError { @@ -1988,6 +2000,147 @@ async def create_payment( data = self.get_data(response) return CreatePayment.model_validate(data) + async def retry_payment( + self, + attempt_ik: Any, + payment_ik: Any, + ledger_ik: Any, + payment_method: Optional[PaymentMethodMatchInput] = None, + **kwargs: Any + ) -> RetryPayment: + query = gql(""" + mutation retryPayment($attemptIk: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $paymentMethod: PaymentMethodMatchInput) { + retryPayment( + attemptIk: $attemptIk + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + paymentMethod: $paymentMethod + ) { + __typename + ... on RetryPaymentResult { + isIkReplay + attempt { + id + status + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "attemptIk": attempt_ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "paymentMethod": payment_method, + } + response = await self.execute( + query=query, operation_name="retryPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RetryPayment.model_validate(data) + + async def refund_payment( + self, + ik: Any, + payment_ik: Any, + ledger_ik: Any, + amount: Any, + parameters: Optional[Any] = None, + **kwargs: Any + ) -> RefundPayment: + query = gql(""" + mutation refundPayment($ik: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $amount: Int96!, $parameters: JSON) { + refundPayment( + ik: $ik + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + refund: {amount: $amount, parameters: $parameters} + ) { + __typename + ... on RefundPaymentResult { + isIkReplay + refund { + id + ik + amount + status + created + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "ik": ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "amount": amount, + "parameters": parameters, + } + response = await self.execute( + query=query, operation_name="refundPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RefundPayment.model_validate(data) + async def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPayment: query = gql(""" query getPayment($ik: SafeString!, $ledgerIk: SafeString!) { @@ -2006,6 +2159,16 @@ async def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPaymen mode parameters created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } """) @@ -2040,6 +2203,16 @@ async def list_payments( type typeVersion created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } pageInfo { hasNextPage diff --git a/fragment/sdk/create_payment.py b/fragment/sdk/create_payment.py index cffc8c8..ddaddee 100644 --- a/fragment/sdk/create_payment.py +++ b/fragment/sdk/create_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class CreatePayment(BaseModel): @@ -37,12 +37,26 @@ class CreatePaymentCreatePaymentCreatePaymentResultPayment(BaseModel): amount: Any mode: PaymentMode currency: "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds" class CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency(BaseModel): code: PaymentCurrencyCode +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds(BaseModel): + nodes: list["CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes"] + + +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class CreatePaymentCreatePaymentInternalError(BaseModel): typename__: Literal["InternalError"] = Field(alias="__typename") code: str @@ -53,3 +67,4 @@ class CreatePaymentCreatePaymentInternalError(BaseModel): CreatePayment.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResult.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResultPayment.model_rebuild() +CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds.model_rebuild() diff --git a/fragment/sdk/enums.py b/fragment/sdk/enums.py index 71c68b3..48410d9 100644 --- a/fragment/sdk/enums.py +++ b/fragment/sdk/enums.py @@ -261,6 +261,12 @@ class LinkType(str, Enum): UnitLink = "UnitLink" +class PaymentAttemptStatus(str, Enum): + failed = "failed" + processing = "processing" + succeeded = "succeeded" + + class PaymentCurrencyCode(str, Enum): USD = "USD" @@ -278,6 +284,12 @@ class PaymentMode(str, Enum): sandbox = "sandbox" +class PaymentRefundStatus(str, Enum): + failed = "failed" + processing = "processing" + settled = "settled" + + class PaymentStatus(str, Enum): accepted = "accepted" needs_payment_method = "needs_payment_method" @@ -321,6 +333,8 @@ class SchemaLedgerEntryStatus(str, Enum): class SchemaPaymentAccountingEventKey(str, Enum): initiated = "initiated" + refund_failed = "refund_failed" + refund_initiated = "refund_initiated" settled = "settled" @@ -335,6 +349,8 @@ class SchemaPaymentTypeStatus(str, Enum): class SchemaSystemLineKind(str, Enum): payment_fee_line = "payment_fee_line" + payment_refund_line = "payment_refund_line" + payment_refund_reversal_line = "payment_refund_reversal_line" payment_settlement_line = "payment_settlement_line" diff --git a/fragment/sdk/get_payment.py b/fragment/sdk/get_payment.py index 1cc49a0..f3c0c0c 100644 --- a/fragment/sdk/get_payment.py +++ b/fragment/sdk/get_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class GetPayment(BaseModel): @@ -24,6 +24,8 @@ class GetPaymentPayment(BaseModel): mode: PaymentMode parameters: Any created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "GetPaymentPaymentRefunds" class GetPaymentPaymentCurrency(BaseModel): @@ -32,5 +34,18 @@ class GetPaymentPaymentCurrency(BaseModel): precision: int +class GetPaymentPaymentRefunds(BaseModel): + nodes: list["GetPaymentPaymentRefundsNodes"] + + +class GetPaymentPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + GetPayment.model_rebuild() GetPaymentPayment.model_rebuild() +GetPaymentPaymentRefunds.model_rebuild() diff --git a/fragment/sdk/input_types.py b/fragment/sdk/input_types.py index 434d796..5a6cb08 100644 --- a/fragment/sdk/input_types.py +++ b/fragment/sdk/input_types.py @@ -716,11 +716,13 @@ class MigrateLedgerEntryInput(BaseModel): class PaymentMatchInput(BaseModel): - """Specify a Ledger Payment by using `ledger` and `ik`.""" + """Specify a Payment by `id`, or by `ledger` and `ik`.""" - ik: Any + id: Optional[str] = None + "The FRAGMENT ID of the Payment." + ik: Optional[Any] = None "The Idempotency Key the Payment was created with." - ledger: "LedgerMatchInput" + ledger: Optional["LedgerMatchInput"] = None "The Ledger the Payment belongs to." @@ -767,6 +769,15 @@ class PaymentsFilterSet(BaseModel): "Use this to filter Payments by their status." +class RefundPaymentInput(BaseModel): + """The Payment Refund to create.""" + + amount: Any + "The amount to refund, in whole cents." + parameters: Optional[Any] = None + "Values for the parameters only the refund entries use." + + class SceneEntryInput(BaseModel): """A simulated Ledger Entry posted as a part of a Scene.""" @@ -1048,6 +1059,10 @@ class SchemaPaymentAccountingInput(BaseModel): initiated: Optional["SchemaPaymentEntryInput"] = None "Posted when the payment is captured. Optional." + refund_failed: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when an initiated refund fails. Optional." + refund_initiated: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when a refund of the settled payment is initiated. Optional." settled: "SchemaPaymentEntryInput" "Posted when the payment settles. Every Payment Type must define it." diff --git a/fragment/sdk/list_payments.py b/fragment/sdk/list_payments.py index a336e2b..23cb34b 100644 --- a/fragment/sdk/list_payments.py +++ b/fragment/sdk/list_payments.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentRefundStatus, PaymentStatus class ListPayments(BaseModel): @@ -31,12 +31,26 @@ class ListPaymentsLedgerPaymentsNodes(BaseModel): type_: Any = Field(alias="type") type_version: int = Field(alias="typeVersion") created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "ListPaymentsLedgerPaymentsNodesRefunds" class ListPaymentsLedgerPaymentsNodesCurrency(BaseModel): code: PaymentCurrencyCode +class ListPaymentsLedgerPaymentsNodesRefunds(BaseModel): + nodes: list["ListPaymentsLedgerPaymentsNodesRefundsNodes"] + + +class ListPaymentsLedgerPaymentsNodesRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class ListPaymentsLedgerPaymentsPageInfo(BaseModel): has_next_page: bool = Field(alias="hasNextPage") end_cursor: Optional[str] = Field(alias="endCursor") @@ -48,3 +62,4 @@ class ListPaymentsLedgerPaymentsPageInfo(BaseModel): ListPaymentsLedger.model_rebuild() ListPaymentsLedgerPayments.model_rebuild() ListPaymentsLedgerPaymentsNodes.model_rebuild() +ListPaymentsLedgerPaymentsNodesRefunds.model_rebuild() diff --git a/fragment/sdk/refund_payment.py b/fragment/sdk/refund_payment.py new file mode 100644 index 0000000..c76e10a --- /dev/null +++ b/fragment/sdk/refund_payment.py @@ -0,0 +1,79 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus + + +class RefundPayment(BaseModel): + refund_payment: Union[ + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + ] = Field(alias="refundPayment", discriminator="typename__") + + +class RefundPaymentRefundPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentRefundPaymentResult(BaseModel): + typename__: Literal["RefundPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + refund: "RefundPaymentRefundPaymentRefundPaymentResultRefund" + payment: "RefundPaymentRefundPaymentRefundPaymentResultPayment" + + +class RefundPaymentRefundPaymentRefundPaymentResultRefund(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +class RefundPaymentRefundPaymentRefundPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds" + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds(BaseModel): + nodes: list["RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes"] + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RefundPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResult.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds.model_rebuild() diff --git a/fragment/sdk/retry_payment.py b/fragment/sdk/retry_payment.py new file mode 100644 index 0000000..771911c --- /dev/null +++ b/fragment/sdk/retry_payment.py @@ -0,0 +1,82 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import ( + PaymentAttemptStatus, + PaymentCurrencyCode, + PaymentMode, + PaymentRefundStatus, + PaymentStatus, +) + + +class RetryPayment(BaseModel): + retry_payment: Union[ + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + ] = Field(alias="retryPayment", discriminator="typename__") + + +class RetryPaymentRetryPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentRetryPaymentResult(BaseModel): + typename__: Literal["RetryPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + attempt: "RetryPaymentRetryPaymentRetryPaymentResultAttempt" + payment: "RetryPaymentRetryPaymentRetryPaymentResultPayment" + + +class RetryPaymentRetryPaymentRetryPaymentResultAttempt(BaseModel): + id: str + status: PaymentAttemptStatus + + +class RetryPaymentRetryPaymentRetryPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds" + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds(BaseModel): + nodes: list["RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes"] + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RetryPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResult.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds.model_rebuild() diff --git a/fragment/std_queries/queries.graphql b/fragment/std_queries/queries.graphql index 4b4ac5c..35990f7 100644 --- a/fragment/std_queries/queries.graphql +++ b/fragment/std_queries/queries.graphql @@ -1364,6 +1364,124 @@ mutation createPayment( currency { code } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } +} + +mutation retryPayment( + $attemptIk: SafeString! + $paymentIk: SafeString! + $ledgerIk: SafeString! + $paymentMethod: PaymentMethodMatchInput +) { + retryPayment( + attemptIk: $attemptIk + payment: { ik: $paymentIk, ledger: { ik: $ledgerIk } } + paymentMethod: $paymentMethod + ) { + __typename + ... on RetryPaymentResult { + isIkReplay + attempt { + id + status + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } +} + +mutation refundPayment( + $ik: SafeString! + $paymentIk: SafeString! + $ledgerIk: SafeString! + $amount: Int96! + $parameters: JSON +) { + refundPayment( + ik: $ik + payment: { ik: $paymentIk, ledger: { ik: $ledgerIk } } + refund: { amount: $amount, parameters: $parameters } + ) { + __typename + ... on RefundPaymentResult { + isIkReplay + refund { + id + ik + amount + status + created + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } ... on BadRequestError { @@ -1395,6 +1513,16 @@ query getPayment($ik: SafeString!, $ledgerIk: SafeString!) { mode parameters created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } @@ -1418,6 +1546,16 @@ query listPayments( type typeVersion created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } pageInfo { hasNextPage diff --git a/fragment/sync_sdk/__init__.py b/fragment/sync_sdk/__init__.py index 869c817..121b19a 100644 --- a/fragment/sync_sdk/__init__.py +++ b/fragment/sync_sdk/__init__.py @@ -60,6 +60,8 @@ CreatePaymentCreatePaymentCreatePaymentResult, CreatePaymentCreatePaymentCreatePaymentResultPayment, CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes, CreatePaymentCreatePaymentInternalError, ) from .create_payment_method_setup import ( @@ -113,9 +115,11 @@ LedgerMigrationStatus, LedgerTypes, LinkType, + PaymentAttemptStatus, PaymentCurrencyCode, PaymentMethodSetupStatus, PaymentMode, + PaymentRefundStatus, PaymentStatus, PostLinesAs, ReadBalanceConsistencyMode, @@ -202,7 +206,13 @@ GetLedgerEntryLedgerEntryLinesNodes, GetLedgerEntryLedgerEntryLinesNodesAccount, ) -from .get_payment import GetPayment, GetPaymentPayment, GetPaymentPaymentCurrency +from .get_payment import ( + GetPayment, + GetPaymentPayment, + GetPaymentPaymentCurrency, + GetPaymentPaymentRefunds, + GetPaymentPaymentRefundsNodes, +) from .get_payment_method import ( GetPaymentMethod, GetPaymentMethodPaymentMethodCardPaymentMethod, @@ -284,6 +294,7 @@ PaymentMethodsFilterSet, PaymentsFilterSet, PaymentStatusFilter, + RefundPaymentInput, SceneEntryInput, SceneEventInput, SceneInput, @@ -395,6 +406,8 @@ ListPaymentsLedgerPayments, ListPaymentsLedgerPaymentsNodes, ListPaymentsLedgerPaymentsNodesCurrency, + ListPaymentsLedgerPaymentsNodesRefunds, + ListPaymentsLedgerPaymentsNodesRefundsNodes, ListPaymentsLedgerPaymentsPageInfo, ) from .migrate_ledger_entry import ( @@ -433,6 +446,28 @@ ReconcileTxRuntimeReconcileTxReconcileTxResultLines, ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount, ) +from .refund_payment import ( + RefundPayment, + RefundPaymentRefundPaymentBadRequestError, + RefundPaymentRefundPaymentInternalError, + RefundPaymentRefundPaymentRefundPaymentResult, + RefundPaymentRefundPaymentRefundPaymentResultPayment, + RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes, + RefundPaymentRefundPaymentRefundPaymentResultRefund, +) +from .retry_payment import ( + RetryPayment, + RetryPaymentRetryPaymentBadRequestError, + RetryPaymentRetryPaymentInternalError, + RetryPaymentRetryPaymentRetryPaymentResult, + RetryPaymentRetryPaymentRetryPaymentResultAttempt, + RetryPaymentRetryPaymentRetryPaymentResultPayment, + RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes, +) from .reverse_ledger_entry import ( ReverseLedgerEntry, ReverseLedgerEntryReverseLedgerEntryBadRequestError, @@ -564,6 +599,8 @@ "CreatePaymentCreatePaymentCreatePaymentResult", "CreatePaymentCreatePaymentCreatePaymentResultPayment", "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes", "CreatePaymentCreatePaymentInternalError", "CreatePaymentInput", "CreatePaymentMethodSetup", @@ -675,6 +712,8 @@ "GetPaymentMethodSetupPaymentMethodSetupPaymentMethodPaymentMethod", "GetPaymentPayment", "GetPaymentPaymentCurrency", + "GetPaymentPaymentRefunds", + "GetPaymentPaymentRefundsNodes", "GetSchema", "GetSchemaSchema", "GetSchemaSchemaVersion", @@ -782,6 +821,8 @@ "ListPaymentsLedgerPayments", "ListPaymentsLedgerPaymentsNodes", "ListPaymentsLedgerPaymentsNodesCurrency", + "ListPaymentsLedgerPaymentsNodesRefunds", + "ListPaymentsLedgerPaymentsNodesRefundsNodes", "ListPaymentsLedgerPaymentsPageInfo", "MigrateLedgerEntry", "MigrateLedgerEntryInput", @@ -800,6 +841,7 @@ "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLines", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodes", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodesAccount", + "PaymentAttemptStatus", "PaymentCurrencyCode", "PaymentMatchInput", "PaymentMethodMatchInput", @@ -807,6 +849,7 @@ "PaymentMethodSetupStatus", "PaymentMethodsFilterSet", "PaymentMode", + "PaymentRefundStatus", "PaymentStatus", "PaymentStatusFilter", "PaymentsFilterSet", @@ -826,6 +869,25 @@ "ReconcileTxRuntimeReconcileTxReconcileTxResultEntry", "ReconcileTxRuntimeReconcileTxReconcileTxResultLines", "ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount", + "RefundPayment", + "RefundPaymentInput", + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + "RefundPaymentRefundPaymentRefundPaymentResultPayment", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes", + "RefundPaymentRefundPaymentRefundPaymentResultRefund", + "RetryPayment", + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + "RetryPaymentRetryPaymentRetryPaymentResultAttempt", + "RetryPaymentRetryPaymentRetryPaymentResultPayment", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes", "ReverseLedgerEntry", "ReverseLedgerEntryReverseLedgerEntryBadRequestError", "ReverseLedgerEntryReverseLedgerEntryInternalError", diff --git a/fragment/sync_sdk/client.py b/fragment/sync_sdk/client.py index 36d8734..1116cdd 100644 --- a/fragment/sync_sdk/client.py +++ b/fragment/sync_sdk/client.py @@ -69,6 +69,8 @@ from .migrate_ledger_entry import MigrateLedgerEntry from .reconcile_tx import ReconcileTx from .reconcile_tx_runtime import ReconcileTxRuntime +from .refund_payment import RefundPayment +from .retry_payment import RetryPayment from .reverse_ledger_entry import ReverseLedgerEntry from .store_schema import StoreSchema from .sync_client import SyncFragmentClient @@ -1953,6 +1955,16 @@ def create_payment( currency { code } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } ... on BadRequestError { @@ -1982,6 +1994,147 @@ def create_payment( data = self.get_data(response) return CreatePayment.model_validate(data) + def retry_payment( + self, + attempt_ik: Any, + payment_ik: Any, + ledger_ik: Any, + payment_method: Optional[PaymentMethodMatchInput] = None, + **kwargs: Any + ) -> RetryPayment: + query = gql(""" + mutation retryPayment($attemptIk: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $paymentMethod: PaymentMethodMatchInput) { + retryPayment( + attemptIk: $attemptIk + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + paymentMethod: $paymentMethod + ) { + __typename + ... on RetryPaymentResult { + isIkReplay + attempt { + id + status + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "attemptIk": attempt_ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "paymentMethod": payment_method, + } + response = self.execute( + query=query, operation_name="retryPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RetryPayment.model_validate(data) + + def refund_payment( + self, + ik: Any, + payment_ik: Any, + ledger_ik: Any, + amount: Any, + parameters: Optional[Any] = None, + **kwargs: Any + ) -> RefundPayment: + query = gql(""" + mutation refundPayment($ik: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $amount: Int96!, $parameters: JSON) { + refundPayment( + ik: $ik + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + refund: {amount: $amount, parameters: $parameters} + ) { + __typename + ... on RefundPaymentResult { + isIkReplay + refund { + id + ik + amount + status + created + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "ik": ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "amount": amount, + "parameters": parameters, + } + response = self.execute( + query=query, operation_name="refundPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RefundPayment.model_validate(data) + def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPayment: query = gql(""" query getPayment($ik: SafeString!, $ledgerIk: SafeString!) { @@ -2000,6 +2153,16 @@ def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPayment: mode parameters created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } """) @@ -2034,6 +2197,16 @@ def list_payments( type typeVersion created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } pageInfo { hasNextPage diff --git a/fragment/sync_sdk/create_payment.py b/fragment/sync_sdk/create_payment.py index cffc8c8..ddaddee 100644 --- a/fragment/sync_sdk/create_payment.py +++ b/fragment/sync_sdk/create_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class CreatePayment(BaseModel): @@ -37,12 +37,26 @@ class CreatePaymentCreatePaymentCreatePaymentResultPayment(BaseModel): amount: Any mode: PaymentMode currency: "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds" class CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency(BaseModel): code: PaymentCurrencyCode +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds(BaseModel): + nodes: list["CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes"] + + +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class CreatePaymentCreatePaymentInternalError(BaseModel): typename__: Literal["InternalError"] = Field(alias="__typename") code: str @@ -53,3 +67,4 @@ class CreatePaymentCreatePaymentInternalError(BaseModel): CreatePayment.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResult.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResultPayment.model_rebuild() +CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds.model_rebuild() diff --git a/fragment/sync_sdk/enums.py b/fragment/sync_sdk/enums.py index 71c68b3..48410d9 100644 --- a/fragment/sync_sdk/enums.py +++ b/fragment/sync_sdk/enums.py @@ -261,6 +261,12 @@ class LinkType(str, Enum): UnitLink = "UnitLink" +class PaymentAttemptStatus(str, Enum): + failed = "failed" + processing = "processing" + succeeded = "succeeded" + + class PaymentCurrencyCode(str, Enum): USD = "USD" @@ -278,6 +284,12 @@ class PaymentMode(str, Enum): sandbox = "sandbox" +class PaymentRefundStatus(str, Enum): + failed = "failed" + processing = "processing" + settled = "settled" + + class PaymentStatus(str, Enum): accepted = "accepted" needs_payment_method = "needs_payment_method" @@ -321,6 +333,8 @@ class SchemaLedgerEntryStatus(str, Enum): class SchemaPaymentAccountingEventKey(str, Enum): initiated = "initiated" + refund_failed = "refund_failed" + refund_initiated = "refund_initiated" settled = "settled" @@ -335,6 +349,8 @@ class SchemaPaymentTypeStatus(str, Enum): class SchemaSystemLineKind(str, Enum): payment_fee_line = "payment_fee_line" + payment_refund_line = "payment_refund_line" + payment_refund_reversal_line = "payment_refund_reversal_line" payment_settlement_line = "payment_settlement_line" diff --git a/fragment/sync_sdk/get_payment.py b/fragment/sync_sdk/get_payment.py index 1cc49a0..f3c0c0c 100644 --- a/fragment/sync_sdk/get_payment.py +++ b/fragment/sync_sdk/get_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class GetPayment(BaseModel): @@ -24,6 +24,8 @@ class GetPaymentPayment(BaseModel): mode: PaymentMode parameters: Any created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "GetPaymentPaymentRefunds" class GetPaymentPaymentCurrency(BaseModel): @@ -32,5 +34,18 @@ class GetPaymentPaymentCurrency(BaseModel): precision: int +class GetPaymentPaymentRefunds(BaseModel): + nodes: list["GetPaymentPaymentRefundsNodes"] + + +class GetPaymentPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + GetPayment.model_rebuild() GetPaymentPayment.model_rebuild() +GetPaymentPaymentRefunds.model_rebuild() diff --git a/fragment/sync_sdk/input_types.py b/fragment/sync_sdk/input_types.py index 434d796..5a6cb08 100644 --- a/fragment/sync_sdk/input_types.py +++ b/fragment/sync_sdk/input_types.py @@ -716,11 +716,13 @@ class MigrateLedgerEntryInput(BaseModel): class PaymentMatchInput(BaseModel): - """Specify a Ledger Payment by using `ledger` and `ik`.""" + """Specify a Payment by `id`, or by `ledger` and `ik`.""" - ik: Any + id: Optional[str] = None + "The FRAGMENT ID of the Payment." + ik: Optional[Any] = None "The Idempotency Key the Payment was created with." - ledger: "LedgerMatchInput" + ledger: Optional["LedgerMatchInput"] = None "The Ledger the Payment belongs to." @@ -767,6 +769,15 @@ class PaymentsFilterSet(BaseModel): "Use this to filter Payments by their status." +class RefundPaymentInput(BaseModel): + """The Payment Refund to create.""" + + amount: Any + "The amount to refund, in whole cents." + parameters: Optional[Any] = None + "Values for the parameters only the refund entries use." + + class SceneEntryInput(BaseModel): """A simulated Ledger Entry posted as a part of a Scene.""" @@ -1048,6 +1059,10 @@ class SchemaPaymentAccountingInput(BaseModel): initiated: Optional["SchemaPaymentEntryInput"] = None "Posted when the payment is captured. Optional." + refund_failed: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when an initiated refund fails. Optional." + refund_initiated: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when a refund of the settled payment is initiated. Optional." settled: "SchemaPaymentEntryInput" "Posted when the payment settles. Every Payment Type must define it." diff --git a/fragment/sync_sdk/list_payments.py b/fragment/sync_sdk/list_payments.py index a336e2b..23cb34b 100644 --- a/fragment/sync_sdk/list_payments.py +++ b/fragment/sync_sdk/list_payments.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentRefundStatus, PaymentStatus class ListPayments(BaseModel): @@ -31,12 +31,26 @@ class ListPaymentsLedgerPaymentsNodes(BaseModel): type_: Any = Field(alias="type") type_version: int = Field(alias="typeVersion") created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "ListPaymentsLedgerPaymentsNodesRefunds" class ListPaymentsLedgerPaymentsNodesCurrency(BaseModel): code: PaymentCurrencyCode +class ListPaymentsLedgerPaymentsNodesRefunds(BaseModel): + nodes: list["ListPaymentsLedgerPaymentsNodesRefundsNodes"] + + +class ListPaymentsLedgerPaymentsNodesRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class ListPaymentsLedgerPaymentsPageInfo(BaseModel): has_next_page: bool = Field(alias="hasNextPage") end_cursor: Optional[str] = Field(alias="endCursor") @@ -48,3 +62,4 @@ class ListPaymentsLedgerPaymentsPageInfo(BaseModel): ListPaymentsLedger.model_rebuild() ListPaymentsLedgerPayments.model_rebuild() ListPaymentsLedgerPaymentsNodes.model_rebuild() +ListPaymentsLedgerPaymentsNodesRefunds.model_rebuild() diff --git a/fragment/sync_sdk/refund_payment.py b/fragment/sync_sdk/refund_payment.py new file mode 100644 index 0000000..c76e10a --- /dev/null +++ b/fragment/sync_sdk/refund_payment.py @@ -0,0 +1,79 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus + + +class RefundPayment(BaseModel): + refund_payment: Union[ + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + ] = Field(alias="refundPayment", discriminator="typename__") + + +class RefundPaymentRefundPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentRefundPaymentResult(BaseModel): + typename__: Literal["RefundPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + refund: "RefundPaymentRefundPaymentRefundPaymentResultRefund" + payment: "RefundPaymentRefundPaymentRefundPaymentResultPayment" + + +class RefundPaymentRefundPaymentRefundPaymentResultRefund(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +class RefundPaymentRefundPaymentRefundPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds" + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds(BaseModel): + nodes: list["RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes"] + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RefundPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResult.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds.model_rebuild() diff --git a/fragment/sync_sdk/retry_payment.py b/fragment/sync_sdk/retry_payment.py new file mode 100644 index 0000000..771911c --- /dev/null +++ b/fragment/sync_sdk/retry_payment.py @@ -0,0 +1,82 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: queries/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import ( + PaymentAttemptStatus, + PaymentCurrencyCode, + PaymentMode, + PaymentRefundStatus, + PaymentStatus, +) + + +class RetryPayment(BaseModel): + retry_payment: Union[ + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + ] = Field(alias="retryPayment", discriminator="typename__") + + +class RetryPaymentRetryPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentRetryPaymentResult(BaseModel): + typename__: Literal["RetryPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + attempt: "RetryPaymentRetryPaymentRetryPaymentResultAttempt" + payment: "RetryPaymentRetryPaymentRetryPaymentResultPayment" + + +class RetryPaymentRetryPaymentRetryPaymentResultAttempt(BaseModel): + id: str + status: PaymentAttemptStatus + + +class RetryPaymentRetryPaymentRetryPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds" + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds(BaseModel): + nodes: list["RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes"] + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RetryPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResult.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/__init__.py b/tests/snapshots/001-marketing-schema/sdk/__init__.py index d9d1112..7af1bdf 100644 --- a/tests/snapshots/001-marketing-schema/sdk/__init__.py +++ b/tests/snapshots/001-marketing-schema/sdk/__init__.py @@ -61,6 +61,8 @@ CreatePaymentCreatePaymentCreatePaymentResult, CreatePaymentCreatePaymentCreatePaymentResultPayment, CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds, + CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes, CreatePaymentCreatePaymentInternalError, ) from .create_payment_method_setup import ( @@ -114,9 +116,11 @@ LedgerMigrationStatus, LedgerTypes, LinkType, + PaymentAttemptStatus, PaymentCurrencyCode, PaymentMethodSetupStatus, PaymentMode, + PaymentRefundStatus, PaymentStatus, PostLinesAs, ReadBalanceConsistencyMode, @@ -203,7 +207,13 @@ GetLedgerEntryLedgerEntryLinesNodes, GetLedgerEntryLedgerEntryLinesNodesAccount, ) -from .get_payment import GetPayment, GetPaymentPayment, GetPaymentPaymentCurrency +from .get_payment import ( + GetPayment, + GetPaymentPayment, + GetPaymentPaymentCurrency, + GetPaymentPaymentRefunds, + GetPaymentPaymentRefundsNodes, +) from .get_payment_method import ( GetPaymentMethod, GetPaymentMethodPaymentMethodCardPaymentMethod, @@ -285,6 +295,7 @@ PaymentMethodsFilterSet, PaymentsFilterSet, PaymentStatusFilter, + RefundPaymentInput, SceneEntryInput, SceneEventInput, SceneInput, @@ -396,6 +407,8 @@ ListPaymentsLedgerPayments, ListPaymentsLedgerPaymentsNodes, ListPaymentsLedgerPaymentsNodesCurrency, + ListPaymentsLedgerPaymentsNodesRefunds, + ListPaymentsLedgerPaymentsNodesRefundsNodes, ListPaymentsLedgerPaymentsPageInfo, ) from .migrate_ledger_entry import ( @@ -551,6 +564,28 @@ ReconcileTxRuntimeReconcileTxReconcileTxResultLines, ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount, ) +from .refund_payment import ( + RefundPayment, + RefundPaymentRefundPaymentBadRequestError, + RefundPaymentRefundPaymentInternalError, + RefundPaymentRefundPaymentRefundPaymentResult, + RefundPaymentRefundPaymentRefundPaymentResultPayment, + RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds, + RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes, + RefundPaymentRefundPaymentRefundPaymentResultRefund, +) +from .retry_payment import ( + RetryPayment, + RetryPaymentRetryPaymentBadRequestError, + RetryPaymentRetryPaymentInternalError, + RetryPaymentRetryPaymentRetryPaymentResult, + RetryPaymentRetryPaymentRetryPaymentResultAttempt, + RetryPaymentRetryPaymentRetryPaymentResultPayment, + RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds, + RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes, +) from .reverse_ledger_entry import ( ReverseLedgerEntry, ReverseLedgerEntryReverseLedgerEntryBadRequestError, @@ -682,6 +717,8 @@ "CreatePaymentCreatePaymentCreatePaymentResult", "CreatePaymentCreatePaymentCreatePaymentResultPayment", "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds", + "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes", "CreatePaymentCreatePaymentInternalError", "CreatePaymentInput", "CreatePaymentMethodSetup", @@ -793,6 +830,8 @@ "GetPaymentMethodSetupPaymentMethodSetupPaymentMethodPaymentMethod", "GetPaymentPayment", "GetPaymentPaymentCurrency", + "GetPaymentPaymentRefunds", + "GetPaymentPaymentRefundsNodes", "GetSchema", "GetSchemaSchema", "GetSchemaSchemaVersion", @@ -900,6 +939,8 @@ "ListPaymentsLedgerPayments", "ListPaymentsLedgerPaymentsNodes", "ListPaymentsLedgerPaymentsNodesCurrency", + "ListPaymentsLedgerPaymentsNodesRefunds", + "ListPaymentsLedgerPaymentsNodesRefundsNodes", "ListPaymentsLedgerPaymentsPageInfo", "MigrateLedgerEntry", "MigrateLedgerEntryInput", @@ -918,6 +959,7 @@ "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLines", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodes", "MigrateLedgerEntryMigrateLedgerEntryMigrateLedgerEntryResultReversingLedgerEntryLinesNodesAccount", + "PaymentAttemptStatus", "PaymentCurrencyCode", "PaymentMatchInput", "PaymentMethodMatchInput", @@ -925,6 +967,7 @@ "PaymentMethodSetupStatus", "PaymentMethodsFilterSet", "PaymentMode", + "PaymentRefundStatus", "PaymentStatus", "PaymentStatusFilter", "PaymentsFilterSet", @@ -1043,6 +1086,25 @@ "ReconcileTxRuntimeReconcileTxReconcileTxResultEntry", "ReconcileTxRuntimeReconcileTxReconcileTxResultLines", "ReconcileTxRuntimeReconcileTxReconcileTxResultLinesAccount", + "RefundPayment", + "RefundPaymentInput", + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + "RefundPaymentRefundPaymentRefundPaymentResultPayment", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds", + "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes", + "RefundPaymentRefundPaymentRefundPaymentResultRefund", + "RetryPayment", + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + "RetryPaymentRetryPaymentRetryPaymentResultAttempt", + "RetryPaymentRetryPaymentRetryPaymentResultPayment", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds", + "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes", "ReverseLedgerEntry", "ReverseLedgerEntryReverseLedgerEntryBadRequestError", "ReverseLedgerEntryReverseLedgerEntryInternalError", diff --git a/tests/snapshots/001-marketing-schema/sdk/client.py b/tests/snapshots/001-marketing-schema/sdk/client.py index 1142d7e..25d309d 100644 --- a/tests/snapshots/001-marketing-schema/sdk/client.py +++ b/tests/snapshots/001-marketing-schema/sdk/client.py @@ -79,6 +79,8 @@ from .post_restaurant_payout_settle import PostRestaurantPayoutSettle from .reconcile_tx import ReconcileTx from .reconcile_tx_runtime import ReconcileTxRuntime +from .refund_payment import RefundPayment +from .retry_payment import RetryPayment from .reverse_ledger_entry import ReverseLedgerEntry from .store_schema import StoreSchema from .sync_custom_accounts import SyncCustomAccounts @@ -2728,6 +2730,16 @@ async def create_payment( currency { code } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } ... on BadRequestError { @@ -2757,6 +2769,147 @@ async def create_payment( data = self.get_data(response) return CreatePayment.model_validate(data) + async def retry_payment( + self, + attempt_ik: Any, + payment_ik: Any, + ledger_ik: Any, + payment_method: Optional[PaymentMethodMatchInput] = None, + **kwargs: Any + ) -> RetryPayment: + query = gql(""" + mutation retryPayment($attemptIk: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $paymentMethod: PaymentMethodMatchInput) { + retryPayment( + attemptIk: $attemptIk + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + paymentMethod: $paymentMethod + ) { + __typename + ... on RetryPaymentResult { + isIkReplay + attempt { + id + status + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "attemptIk": attempt_ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "paymentMethod": payment_method, + } + response = await self.execute( + query=query, operation_name="retryPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RetryPayment.model_validate(data) + + async def refund_payment( + self, + ik: Any, + payment_ik: Any, + ledger_ik: Any, + amount: Any, + parameters: Optional[Any] = None, + **kwargs: Any + ) -> RefundPayment: + query = gql(""" + mutation refundPayment($ik: SafeString!, $paymentIk: SafeString!, $ledgerIk: SafeString!, $amount: Int96!, $parameters: JSON) { + refundPayment( + ik: $ik + payment: {ik: $paymentIk, ledger: {ik: $ledgerIk}} + refund: {amount: $amount, parameters: $parameters} + ) { + __typename + ... on RefundPaymentResult { + isIkReplay + refund { + id + ik + amount + status + created + } + payment { + id + ik + status + amount + mode + currency { + code + } + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } + } + } + ... on BadRequestError { + code + message + retryable + } + ... on InternalError { + code + message + retryable + } + } + } + """) + variables: dict[str, object] = { + "ik": ik, + "paymentIk": payment_ik, + "ledgerIk": ledger_ik, + "amount": amount, + "parameters": parameters, + } + response = await self.execute( + query=query, operation_name="refundPayment", variables=variables, **kwargs + ) + data = self.get_data(response) + return RefundPayment.model_validate(data) + async def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPayment: query = gql(""" query getPayment($ik: SafeString!, $ledgerIk: SafeString!) { @@ -2775,6 +2928,16 @@ async def get_payment(self, ik: Any, ledger_ik: Any, **kwargs: Any) -> GetPaymen mode parameters created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } } """) @@ -2809,6 +2972,16 @@ async def list_payments( type typeVersion created + refundedAmount + refunds { + nodes { + id + ik + amount + status + created + } + } } pageInfo { hasNextPage diff --git a/tests/snapshots/001-marketing-schema/sdk/create_payment.py b/tests/snapshots/001-marketing-schema/sdk/create_payment.py index 2856ace..3c67318 100644 --- a/tests/snapshots/001-marketing-schema/sdk/create_payment.py +++ b/tests/snapshots/001-marketing-schema/sdk/create_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class CreatePayment(BaseModel): @@ -37,12 +37,26 @@ class CreatePaymentCreatePaymentCreatePaymentResultPayment(BaseModel): amount: Any mode: PaymentMode currency: "CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds" class CreatePaymentCreatePaymentCreatePaymentResultPaymentCurrency(BaseModel): code: PaymentCurrencyCode +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds(BaseModel): + nodes: list["CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes"] + + +class CreatePaymentCreatePaymentCreatePaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class CreatePaymentCreatePaymentInternalError(BaseModel): typename__: Literal["InternalError"] = Field(alias="__typename") code: str @@ -53,3 +67,4 @@ class CreatePaymentCreatePaymentInternalError(BaseModel): CreatePayment.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResult.model_rebuild() CreatePaymentCreatePaymentCreatePaymentResultPayment.model_rebuild() +CreatePaymentCreatePaymentCreatePaymentResultPaymentRefunds.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/enums.py b/tests/snapshots/001-marketing-schema/sdk/enums.py index 71c68b3..48410d9 100644 --- a/tests/snapshots/001-marketing-schema/sdk/enums.py +++ b/tests/snapshots/001-marketing-schema/sdk/enums.py @@ -261,6 +261,12 @@ class LinkType(str, Enum): UnitLink = "UnitLink" +class PaymentAttemptStatus(str, Enum): + failed = "failed" + processing = "processing" + succeeded = "succeeded" + + class PaymentCurrencyCode(str, Enum): USD = "USD" @@ -278,6 +284,12 @@ class PaymentMode(str, Enum): sandbox = "sandbox" +class PaymentRefundStatus(str, Enum): + failed = "failed" + processing = "processing" + settled = "settled" + + class PaymentStatus(str, Enum): accepted = "accepted" needs_payment_method = "needs_payment_method" @@ -321,6 +333,8 @@ class SchemaLedgerEntryStatus(str, Enum): class SchemaPaymentAccountingEventKey(str, Enum): initiated = "initiated" + refund_failed = "refund_failed" + refund_initiated = "refund_initiated" settled = "settled" @@ -335,6 +349,8 @@ class SchemaPaymentTypeStatus(str, Enum): class SchemaSystemLineKind(str, Enum): payment_fee_line = "payment_fee_line" + payment_refund_line = "payment_refund_line" + payment_refund_reversal_line = "payment_refund_reversal_line" payment_settlement_line = "payment_settlement_line" diff --git a/tests/snapshots/001-marketing-schema/sdk/get_payment.py b/tests/snapshots/001-marketing-schema/sdk/get_payment.py index 004db4f..9b0aa8a 100644 --- a/tests/snapshots/001-marketing-schema/sdk/get_payment.py +++ b/tests/snapshots/001-marketing-schema/sdk/get_payment.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentMode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus class GetPayment(BaseModel): @@ -24,6 +24,8 @@ class GetPaymentPayment(BaseModel): mode: PaymentMode parameters: Any created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "GetPaymentPaymentRefunds" class GetPaymentPaymentCurrency(BaseModel): @@ -32,5 +34,18 @@ class GetPaymentPaymentCurrency(BaseModel): precision: int +class GetPaymentPaymentRefunds(BaseModel): + nodes: list["GetPaymentPaymentRefundsNodes"] + + +class GetPaymentPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + GetPayment.model_rebuild() GetPaymentPayment.model_rebuild() +GetPaymentPaymentRefunds.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/input_types.py b/tests/snapshots/001-marketing-schema/sdk/input_types.py index 434d796..5a6cb08 100644 --- a/tests/snapshots/001-marketing-schema/sdk/input_types.py +++ b/tests/snapshots/001-marketing-schema/sdk/input_types.py @@ -716,11 +716,13 @@ class MigrateLedgerEntryInput(BaseModel): class PaymentMatchInput(BaseModel): - """Specify a Ledger Payment by using `ledger` and `ik`.""" + """Specify a Payment by `id`, or by `ledger` and `ik`.""" - ik: Any + id: Optional[str] = None + "The FRAGMENT ID of the Payment." + ik: Optional[Any] = None "The Idempotency Key the Payment was created with." - ledger: "LedgerMatchInput" + ledger: Optional["LedgerMatchInput"] = None "The Ledger the Payment belongs to." @@ -767,6 +769,15 @@ class PaymentsFilterSet(BaseModel): "Use this to filter Payments by their status." +class RefundPaymentInput(BaseModel): + """The Payment Refund to create.""" + + amount: Any + "The amount to refund, in whole cents." + parameters: Optional[Any] = None + "Values for the parameters only the refund entries use." + + class SceneEntryInput(BaseModel): """A simulated Ledger Entry posted as a part of a Scene.""" @@ -1048,6 +1059,10 @@ class SchemaPaymentAccountingInput(BaseModel): initiated: Optional["SchemaPaymentEntryInput"] = None "Posted when the payment is captured. Optional." + refund_failed: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when an initiated refund fails. Optional." + refund_initiated: Optional["SchemaPaymentEntryInput"] = None + "EXPERIMENTAL: Posted when a refund of the settled payment is initiated. Optional." settled: "SchemaPaymentEntryInput" "Posted when the payment settles. Every Payment Type must define it." diff --git a/tests/snapshots/001-marketing-schema/sdk/list_payments.py b/tests/snapshots/001-marketing-schema/sdk/list_payments.py index 1360e7a..a8b6776 100644 --- a/tests/snapshots/001-marketing-schema/sdk/list_payments.py +++ b/tests/snapshots/001-marketing-schema/sdk/list_payments.py @@ -6,7 +6,7 @@ from pydantic import Field from .base_model import BaseModel -from .enums import PaymentCurrencyCode, PaymentStatus +from .enums import PaymentCurrencyCode, PaymentRefundStatus, PaymentStatus class ListPayments(BaseModel): @@ -31,12 +31,26 @@ class ListPaymentsLedgerPaymentsNodes(BaseModel): type_: Any = Field(alias="type") type_version: int = Field(alias="typeVersion") created: Any + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "ListPaymentsLedgerPaymentsNodesRefunds" class ListPaymentsLedgerPaymentsNodesCurrency(BaseModel): code: PaymentCurrencyCode +class ListPaymentsLedgerPaymentsNodesRefunds(BaseModel): + nodes: list["ListPaymentsLedgerPaymentsNodesRefundsNodes"] + + +class ListPaymentsLedgerPaymentsNodesRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + class ListPaymentsLedgerPaymentsPageInfo(BaseModel): has_next_page: bool = Field(alias="hasNextPage") end_cursor: Optional[str] = Field(alias="endCursor") @@ -48,3 +62,4 @@ class ListPaymentsLedgerPaymentsPageInfo(BaseModel): ListPaymentsLedger.model_rebuild() ListPaymentsLedgerPayments.model_rebuild() ListPaymentsLedgerPaymentsNodes.model_rebuild() +ListPaymentsLedgerPaymentsNodesRefunds.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/refund_payment.py b/tests/snapshots/001-marketing-schema/sdk/refund_payment.py new file mode 100644 index 0000000..9168a27 --- /dev/null +++ b/tests/snapshots/001-marketing-schema/sdk/refund_payment.py @@ -0,0 +1,79 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: tests/snapshots/001-marketing-schema/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import PaymentCurrencyCode, PaymentMode, PaymentRefundStatus, PaymentStatus + + +class RefundPayment(BaseModel): + refund_payment: Union[ + "RefundPaymentRefundPaymentBadRequestError", + "RefundPaymentRefundPaymentInternalError", + "RefundPaymentRefundPaymentRefundPaymentResult", + ] = Field(alias="refundPayment", discriminator="typename__") + + +class RefundPaymentRefundPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RefundPaymentRefundPaymentRefundPaymentResult(BaseModel): + typename__: Literal["RefundPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + refund: "RefundPaymentRefundPaymentRefundPaymentResultRefund" + payment: "RefundPaymentRefundPaymentRefundPaymentResultPayment" + + +class RefundPaymentRefundPaymentRefundPaymentResultRefund(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +class RefundPaymentRefundPaymentRefundPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds" + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds(BaseModel): + nodes: list["RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes"] + + +class RefundPaymentRefundPaymentRefundPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RefundPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResult.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPayment.model_rebuild() +RefundPaymentRefundPaymentRefundPaymentResultPaymentRefunds.model_rebuild() diff --git a/tests/snapshots/001-marketing-schema/sdk/retry_payment.py b/tests/snapshots/001-marketing-schema/sdk/retry_payment.py new file mode 100644 index 0000000..a646a8f --- /dev/null +++ b/tests/snapshots/001-marketing-schema/sdk/retry_payment.py @@ -0,0 +1,82 @@ +# Generated by fragment (with the help of ariadne-codegen) +# Source: tests/snapshots/001-marketing-schema/ + +from typing import Any, Literal, Union + +from pydantic import Field + +from .base_model import BaseModel +from .enums import ( + PaymentAttemptStatus, + PaymentCurrencyCode, + PaymentMode, + PaymentRefundStatus, + PaymentStatus, +) + + +class RetryPayment(BaseModel): + retry_payment: Union[ + "RetryPaymentRetryPaymentBadRequestError", + "RetryPaymentRetryPaymentInternalError", + "RetryPaymentRetryPaymentRetryPaymentResult", + ] = Field(alias="retryPayment", discriminator="typename__") + + +class RetryPaymentRetryPaymentBadRequestError(BaseModel): + typename__: Literal["BadRequestError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentInternalError(BaseModel): + typename__: Literal["InternalError"] = Field(alias="__typename") + code: str + message: str + retryable: bool + + +class RetryPaymentRetryPaymentRetryPaymentResult(BaseModel): + typename__: Literal["RetryPaymentResult"] = Field(alias="__typename") + is_ik_replay: bool = Field(alias="isIkReplay") + attempt: "RetryPaymentRetryPaymentRetryPaymentResultAttempt" + payment: "RetryPaymentRetryPaymentRetryPaymentResultPayment" + + +class RetryPaymentRetryPaymentRetryPaymentResultAttempt(BaseModel): + id: str + status: PaymentAttemptStatus + + +class RetryPaymentRetryPaymentRetryPaymentResultPayment(BaseModel): + id: str + ik: Any + status: PaymentStatus + amount: Any + mode: PaymentMode + currency: "RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency" + refunded_amount: Any = Field(alias="refundedAmount") + refunds: "RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds" + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentCurrency(BaseModel): + code: PaymentCurrencyCode + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds(BaseModel): + nodes: list["RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes"] + + +class RetryPaymentRetryPaymentRetryPaymentResultPaymentRefundsNodes(BaseModel): + id: str + ik: Any + amount: Any + status: PaymentRefundStatus + created: Any + + +RetryPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResult.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPayment.model_rebuild() +RetryPaymentRetryPaymentRetryPaymentResultPaymentRefunds.model_rebuild() diff --git a/tests/snapshots/schema.graphql b/tests/snapshots/schema.graphql index e4bc654..e8cf7dd 100644 --- a/tests/snapshots/schema.graphql +++ b/tests/snapshots/schema.graphql @@ -228,6 +228,15 @@ input ChartOfAccountsInput { defaultCurrencyMode: CurrencyMode } +"""An attempt the payer made through checkout.""" +type CheckoutPaymentAttempt implements PaymentAttempt { + """The ID of this Payment attempt.""" + id: ID! + + """The status of this Payment attempt.""" + status: PaymentAttemptStatus! +} + input CreateCustomCurrencyInput { """ The currency code for custom currencies. It can be up to 36 characters long. This is used for display purposes. @@ -3731,6 +3740,43 @@ type Mutation { entry: LedgerEntryInput! ): ReconcileTxResponse! + """ + Refund a settled Payment. + + The Payment's Payment Type must define the `refund_initiated` and `refund_failed` Ledger Entries. + A Payment can be refunded at most 10 times. + """ + refundPayment( + """ + The [Idempotency Key](https://fragment.dev/api-reference/api-overview#idempotency) for this Payment Refund. Can be up to 128 characters long. + """ + ik: SafeString! + + """The Payment to refund.""" + payment: PaymentMatchInput! + + """The Payment Refund to create.""" + refund: RefundPaymentInput! + ): RefundPaymentResponse! + + """ + Retry a Payment on a saved Payment Method after its latest attempt was declined, rejected or canceled. + """ + retryPayment( + """ + The [Idempotency Key](https://fragment.dev/api-reference/api-overview#idempotency) for this Retry, unique within the Payment. Can be up to 128 characters long. + """ + attemptIk: SafeString! + + """The Payment to retry.""" + payment: PaymentMatchInput! + + """ + The saved Payment Method to charge. When omitted, charges the previous attempt's saved Payment Method. + """ + paymentMethod: PaymentMethodMatchInput + ): RetryPaymentResponse! + """Reverses a Ledger Entry""" reverseLedgerEntry( """The Fragment ID of the Ledger Entry to reverse""" @@ -3837,6 +3883,9 @@ type Payment { """The amount of this Payment, in whole cents.""" amount: Int96! + """The Payment's attempts, newest first.""" + attempts: PaymentAttemptsConnection! + """The credential the payments SDK presents to `confirmPayment`.""" clientSecret: String! created: DateTime! @@ -3866,6 +3915,12 @@ type Payment { """Parameters the Payment was created with.""" parameters: JSON! + """The amount refunded from this Payment, in whole cents.""" + refundedAmount: Int96! + + """The Payment's refunds, newest first.""" + refunds: PaymentRefundsConnection! + """The status of this Payment.""" status: PaymentStatus! @@ -3876,8 +3931,58 @@ type Payment { typeVersion: Int! } +"""One try at charging a Payment.""" +interface PaymentAttempt { + """The ID of this Payment attempt.""" + id: ID! + + """The status of this Payment attempt.""" + status: PaymentAttemptStatus! +} + +"""Status of a Payment attempt.""" +enum PaymentAttemptStatus { + failed + processing + succeeded +} + +"""A paginated list of Payment attempts.""" +type PaymentAttemptsConnection { + """The current page of results.""" + nodes: [PaymentAttempt!]! + + """The pagination info for this list.""" + pageInfo: PageInfo! +} + +"""The payer abandoned or failed the 3DS check.""" +type PaymentCard3DSCanceledEvent implements PaymentEvent { + """The ID of this Payment event.""" + id: ID! + + """When this event occurred.""" + occurredAt: DateTime! + + """ + The status of the Payment after this event. Always `needs_payment_method`, even while a newer attempt keeps the Payment `processing`. + """ + paymentStatus: PaymentStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + """The card network captured the Payment.""" type PaymentCardCapturedEvent implements PaymentEvent { + """The captured attempt. `null` on events recorded before attempts.""" + attempt: PaymentAttempt + + """ + The status of the attempt after this event. Always `succeeded`. `null` on events recorded before attempt statuses. + """ + attemptStatus: PaymentAttemptStatus + """The ID of this Payment event.""" id: ID! @@ -3889,20 +3994,64 @@ type PaymentCardCapturedEvent implements PaymentEvent { """When this event occurred.""" occurredAt: DateTime! + """The status of the Payment after this event. Always `accepted`.""" + paymentStatus: PaymentStatus! + """The status of the Payment after this event.""" - status: PaymentStatus! + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + +"""The card was declined, or the charge refused.""" +type PaymentCardDeclinedEvent implements PaymentEvent { + """The attempt that failed.""" + attempt: PaymentAttempt! + + """The status of the attempt after this event. Always `failed`.""" + attemptStatus: PaymentAttemptStatus! + + """ + The payment processor's reason for the decline, `null` when it gave none. + """ + declineCode: String + + """The ID of this Payment event.""" + id: ID! + + """When this event occurred.""" + occurredAt: DateTime! + + """ + The status of the Payment after this event. Always `needs_payment_method`, even while a newer attempt keeps the Payment `processing`. + """ + paymentStatus: PaymentStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") } """The payer went through checkout.""" type PaymentCheckoutEvent implements PaymentEvent { + """ + The attempt checkout started. `null` on events recorded before attempts. + """ + attempt: PaymentAttempt + + """ + The status of the attempt after this event. Always `processing`. `null` on events recorded before attempt statuses. + """ + attemptStatus: PaymentAttemptStatus + """The ID of this Payment event.""" id: ID! """When this event occurred.""" occurredAt: DateTime! + """The status of the Payment after this event. Always `processing`.""" + paymentStatus: PaymentStatus! + """The status of the Payment after this event.""" - status: PaymentStatus! + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") } """The Payment was created.""" @@ -3913,8 +4062,13 @@ type PaymentCreatedEvent implements PaymentEvent { """When this event occurred.""" occurredAt: DateTime! + """ + The status of the Payment after this event: `needs_payment_method` for checkout, `processing` for a saved Payment Method. + """ + paymentStatus: PaymentStatus! + """The status of the Payment after this event.""" - status: PaymentStatus! + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") } """The currency a Payment is denominated in.""" @@ -3947,7 +4101,7 @@ interface PaymentEvent { occurredAt: DateTime! """The status of the Payment after this event.""" - status: PaymentStatus! + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") } """A paginated list of Payment events.""" @@ -3959,13 +4113,16 @@ type PaymentEventsConnection { pageInfo: PageInfo! } -"""Specify a Ledger Payment by using `ledger` and `ik`.""" +"""Specify a Payment by `id`, or by `ledger` and `ik`.""" input PaymentMatchInput { + """The FRAGMENT ID of the Payment.""" + id: ID + """The Idempotency Key the Payment was created with.""" - ik: SafeString! + ik: SafeString """The Ledger the Payment belongs to.""" - ledger: LedgerMatchInput! + ledger: LedgerMatchInput } """A payment method saved for a User.""" @@ -4067,6 +4224,132 @@ enum PaymentMode { sandbox } +"""A refund issued against a Payment.""" +type PaymentRefund { + """The amount of this Payment Refund, in whole cents.""" + amount: Int96! + + """When this Payment Refund was created.""" + created: DateTime! + + """The ID of this Payment Refund.""" + id: ID! + + """ + The [Idempotency Key](https://fragment.dev/api-reference/api-overview#idempotency) the Payment Refund was created with. + """ + ik: SafeString! + + """The status of this Payment Refund.""" + status: PaymentRefundStatus! +} + +"""A refund against the Payment failed.""" +type PaymentRefundFailedEvent implements PaymentEvent { + """The ID of this Payment event.""" + id: ID! + + """The refund reversal's Ledger Entry.""" + ledgerEntry: LedgerEntry! + + """When this event occurred.""" + occurredAt: DateTime! + + """The status of the Payment after this event.""" + paymentStatus: PaymentStatus! + + """The Payment Refund this event describes.""" + refund: PaymentRefund! + + """The status of the refund after this event. Always `failed`.""" + refundStatus: PaymentRefundStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + +"""A refund was initiated against the Payment.""" +type PaymentRefundInitiatedEvent implements PaymentEvent { + """The ID of this Payment event.""" + id: ID! + + """The refund's Ledger Entry.""" + ledgerEntry: LedgerEntry! + + """When this event occurred.""" + occurredAt: DateTime! + + """The status of the Payment after this event.""" + paymentStatus: PaymentStatus! + + """The Payment Refund this event describes.""" + refund: PaymentRefund! + + """The status of the refund after this event. Always `processing`.""" + refundStatus: PaymentRefundStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + +"""A refund against the Payment settled.""" +type PaymentRefundSettledEvent implements PaymentEvent { + """The ID of this Payment event.""" + id: ID! + + """When this event occurred.""" + occurredAt: DateTime! + + """The status of the Payment after this event.""" + paymentStatus: PaymentStatus! + + """The Payment Refund this event describes.""" + refund: PaymentRefund! + + """The status of the refund after this event. Always `settled`.""" + refundStatus: PaymentRefundStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + +"""Status of a Payment refund.""" +enum PaymentRefundStatus { + failed + processing + settled +} + +"""A paginated list of Payment refunds.""" +type PaymentRefundsConnection { + """The current page of results.""" + nodes: [PaymentRefund!]! + + """The pagination info for this list.""" + pageInfo: PageInfo! +} + +"""The Customer retried the Payment on a saved payment method.""" +type PaymentRetryEvent implements PaymentEvent { + """The attempt the Retry started.""" + attempt: SavedPaymentMethodPaymentAttempt! + + """The status of the attempt after this event. Always `processing`.""" + attemptStatus: PaymentAttemptStatus! + + """The ID of this Payment event.""" + id: ID! + + """When this event occurred.""" + occurredAt: DateTime! + + """The status of the Payment after this event. Always `processing`.""" + paymentStatus: PaymentStatus! + + """The status of the Payment after this event.""" + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") +} + """The Payment settled.""" type PaymentSettledEvent implements PaymentEvent { """The ID of this Payment event.""" @@ -4078,8 +4361,11 @@ type PaymentSettledEvent implements PaymentEvent { """When this event occurred.""" occurredAt: DateTime! + """The status of the Payment after this event. Always `settled`.""" + paymentStatus: PaymentStatus! + """The status of the Payment after this event.""" - status: PaymentStatus! + status: PaymentStatus! @deprecated(reason: "Use `paymentStatus` on each event type.") } """Status of a Payment.""" @@ -4273,7 +4559,7 @@ type Query { """Get all links in a workspace""" links: LinksConnection! - """Get a single Payment by its Idempotency Key.""" + """Get a single Payment by its ID or Idempotency Key in a Ledger.""" payment( """The Ledger Payment to query.""" payment: PaymentMatchInput! @@ -4406,6 +4692,47 @@ type ReconciliationReport { intervals: [AgingInterval!]! } +"""The Payment Refund to create.""" +input RefundPaymentInput { + """The amount to refund, in whole cents.""" + amount: Int96! + + """Values for the parameters only the refund entries use.""" + parameters: JSON +} + +union RefundPaymentResponse = BadRequestError | InternalError | RefundPaymentResult + +"""The created Payment Refund.""" +type RefundPaymentResult { + """ + Whether an earlier call with the same `ik` created this Payment Refund. + """ + isIkReplay: Boolean! + + """The Payment after reserving the refund amount.""" + payment: Payment! + + """The created Payment Refund.""" + refund: PaymentRefund! +} + +union RetryPaymentResponse = BadRequestError | InternalError | RetryPaymentResult + +"""The Payment and the attempt the Retry started.""" +type RetryPaymentResult { + """The attempt this `attemptIk` started. Its outcome events name it.""" + attempt: SavedPaymentMethodPaymentAttempt! + + """ + Whether an earlier call with the same `attemptIk` started this attempt. + """ + isIkReplay: Boolean! + + """The retried Payment.""" + payment: Payment! +} + union ReverseLedgerEntryResponse = BadRequestError | InternalError | ReverseLedgerEntryResult type ReverseLedgerEntryResult { @@ -4424,6 +4751,15 @@ A string with delimiter characters `/`, `#`, and `:` disallowed, as well as para """ scalar SafeString +"""An attempt that charged a saved Payment Method.""" +type SavedPaymentMethodPaymentAttempt implements PaymentAttempt { + """The ID of this Payment attempt.""" + id: ID! + + """The status of this Payment attempt.""" + status: PaymentAttemptStatus! +} + """A simulated Ledger Entry posted as a part of a Scene.""" input SceneEntryInput { """Any parameters to be used as inputs to this simulated Ledger Entry.""" @@ -4974,6 +5310,12 @@ enum SchemaPaymentAccountingEventKey { """The payment was captured and is guaranteed to settle.""" initiated + """EXPERIMENTAL: An initiated refund failed.""" + refund_failed + + """EXPERIMENTAL: A refund of the settled payment is initiated.""" + refund_initiated + """The payment settled.""" settled } @@ -4986,6 +5328,14 @@ input SchemaPaymentAccountingInput { """Posted when the payment is captured. Optional.""" initiated: SchemaPaymentEntryInput + """EXPERIMENTAL: Posted when an initiated refund fails. Optional.""" + refund_failed: SchemaPaymentEntryInput + + """ + EXPERIMENTAL: Posted when a refund of the settled payment is initiated. Optional. + """ + refund_initiated: SchemaPaymentEntryInput + """Posted when the payment settles. Every Payment Type must define it.""" settled: SchemaPaymentEntryInput! } @@ -5114,6 +5464,16 @@ enum SchemaSystemLineKind { """ payment_fee_line + """ + The line removing the refund amount from the Payment Account when a Refund is initiated. + """ + payment_refund_line + + """ + The line restoring the refund amount to the Payment Account when a Refund fails. + """ + payment_refund_reversal_line + """ The line carrying the settled payment amount, posted to the Payment Account. """