diff --git a/.fern/metadata.json b/.fern/metadata.json index 532f6c1..ec92118 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -23,6 +23,6 @@ } ] }, - "originGitCommit": "efe71642022d9d3303fd78c648e5b2539192230e", - "sdkVersion": "1.2.2" + "originGitCommit": "a5724e8dfeba2338da634f270044ac597694f772", + "sdkVersion": "1.2.3" } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 921b844..bda43d0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -240,14 +240,14 @@ files = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a"}, - {file = "certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580"}, + {file = "certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897"}, + {file = "certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d"}, ] [[package]] @@ -1072,15 +1072,15 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyjwt" -version = "2.12.1" +version = "2.13.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "python_version >= \"3.10\"" files = [ - {file = "pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c"}, - {file = "pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b"}, + {file = "pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728"}, + {file = "pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423"}, ] [package.dependencies] @@ -1088,9 +1088,6 @@ typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==7.10.7)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=8.4.2,<9.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==7.10.7)", "pytest (>=8.4.2,<9.0.0)"] [[package]] name = "pytest" diff --git a/reference.md b/reference.md index 631a8ae..13ed0d6 100644 --- a/reference.md +++ b/reference.md @@ -143,6 +143,94 @@ client.accounts.get_account_member( + + + + +
client.accounts.count_account_members(...) -> CountAccountMembersResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.accounts.count_account_members( + ids=[ + "ids" + ], + q="q", + limit=1000000, + offset=1000000, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` + +
+
+ +
+
+ +**q:** `typing.Optional[str]` — Search filter + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Page limit (default 100) + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Page offset (default 0) + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -1675,7 +1763,7 @@ client.billing.list_customers_with_subscriptions( "company_ids" ], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -1781,7 +1869,7 @@ client.billing.count_customers( "company_ids" ], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -2519,6 +2607,65 @@ client.billing.upsert_payment_method( + + + + +
client.billing.delete_payment_method_by_external_id(...) -> DeletePaymentMethodByExternalIdResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.billing.delete_payment_method_by_external_id( + billing_id="billing_id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**billing_id:** `str` — billing_id + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -2558,7 +2705,7 @@ client.billing.list_billing_prices( product_ids=[ "product_ids" ], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -3015,7 +3162,7 @@ client.billing.list_billing_product_prices( product_ids=[ "product_ids" ], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -3357,7 +3504,7 @@ client.billing.list_billing_products( is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, @@ -3526,7 +3673,7 @@ client.billing.count_billing_products( is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, @@ -5767,7 +5914,7 @@ client.credits.list_grants_for_credit( -
client.credits.get_enriched_credit_ledger(...) -> GetEnrichedCreditLedgerResponse +
client.credits.acquire_credit_lease(...) -> AcquireCreditLeaseResponse
@@ -5788,15 +5935,10 @@ client = Schematic( environment=SchematicEnvironment.DEFAULT, ) -client.credits.get_enriched_credit_ledger( +client.credits.acquire_credit_lease( company_id="company_id", - billing_credit_id="billing_credit_id", - feature_id="feature_id", - period="daily", - start_time="start_time", - end_time="end_time", - limit=1000000, - offset=1000000, + credit_type_id="credit_type_id", + requested_amount=1.1, ) ``` @@ -5821,39 +5963,7 @@ client.credits.get_enriched_credit_ledger(
-**period:** `CreditLedgerPeriod` - -
-
- -
-
- -**billing_credit_id:** `typing.Optional[str]` - -
-
- -
-
- -**feature_id:** `typing.Optional[str]` - -
-
- -
-
- -**start_time:** `typing.Optional[str]` - -
-
- -
-
- -**end_time:** `typing.Optional[str]` +**credit_type_id:** `str`
@@ -5861,7 +5971,7 @@ client.credits.get_enriched_credit_ledger(
-**limit:** `typing.Optional[int]` — Page limit (default 100) +**requested_amount:** `float`
@@ -5869,7 +5979,7 @@ client.credits.get_enriched_credit_ledger(
-**offset:** `typing.Optional[int]` — Page offset (default 0) +**expires_at:** `typing.Optional[datetime.datetime]`
@@ -5889,7 +5999,7 @@ client.credits.get_enriched_credit_ledger(
-
client.credits.count_credit_ledger(...) -> CountCreditLedgerResponse +
client.credits.extend_credit_lease(...) -> ExtendCreditLeaseResponse
@@ -5910,15 +6020,9 @@ client = Schematic( environment=SchematicEnvironment.DEFAULT, ) -client.credits.count_credit_ledger( - company_id="company_id", - billing_credit_id="billing_credit_id", - feature_id="feature_id", - period="daily", - start_time="start_time", - end_time="end_time", - limit=1000000, - offset=1000000, +client.credits.extend_credit_lease( + lease_id="lease_id", + additional_amount=1.1, ) ``` @@ -5935,7 +6039,7 @@ client.credits.count_credit_ledger(
-**company_id:** `str` +**lease_id:** `str` — lease_id
@@ -5943,7 +6047,7 @@ client.credits.count_credit_ledger(
-**period:** `CreditLedgerPeriod` +**additional_amount:** `float`
@@ -5951,7 +6055,7 @@ client.credits.count_credit_ledger(
-**billing_credit_id:** `typing.Optional[str]` +**expires_at:** `typing.Optional[datetime.datetime]`
@@ -5959,31 +6063,61 @@ client.credits.count_credit_ledger(
-**feature_id:** `typing.Optional[str]` +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
-
-**start_time:** `typing.Optional[str]` -
+
+
client.credits.release_credit_lease(...) -> ReleaseCreditLeaseResponse
-**end_time:** `typing.Optional[str]` - +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.credits.release_credit_lease( + lease_id="lease_id", + request={ + "key": "value" + }, +) + +``` +
+
+#### ⚙️ Parameters +
-**limit:** `typing.Optional[int]` — Page limit (default 100) +
+
+ +**lease_id:** `str` — lease_id
@@ -5991,7 +6125,7 @@ client.credits.count_credit_ledger(
-**offset:** `typing.Optional[int]` — Page offset (default 0) +**request:** `ReleaseCreditLeaseRequestBody`
@@ -6011,7 +6145,7 @@ client.credits.count_credit_ledger(
-
client.credits.list_billing_plan_credit_grants(...) -> ListBillingPlanCreditGrantsResponse +
client.credits.get_enriched_credit_ledger(...) -> GetEnrichedCreditLedgerResponse
@@ -6032,16 +6166,260 @@ client = Schematic( environment=SchematicEnvironment.DEFAULT, ) -client.credits.list_billing_plan_credit_grants( - credit_id="credit_id", - ids=[ - "ids" - ], - plan_id="plan_id", - plan_ids=[ - "plan_ids" - ], - plan_version_id="plan_version_id", +client.credits.get_enriched_credit_ledger( + company_id="company_id", + billing_credit_id="billing_credit_id", + feature_id="feature_id", + period="daily", + start_time="start_time", + end_time="end_time", + limit=1000000, + offset=1000000, +) + +``` +
+
+ + + +#### ⚙️ Parameters + +
+
+ +
+
+ +**company_id:** `str` + +
+
+ +
+
+ +**period:** `CreditLedgerPeriod` + +
+
+ +
+
+ +**billing_credit_id:** `typing.Optional[str]` + +
+
+ +
+
+ +**feature_id:** `typing.Optional[str]` + +
+
+ +
+
+ +**start_time:** `typing.Optional[str]` + +
+
+ +
+
+ +**end_time:** `typing.Optional[str]` + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Page limit (default 100) + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Page offset (default 0) + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + + + +
+ +
client.credits.count_credit_ledger(...) -> CountCreditLedgerResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.credits.count_credit_ledger( + company_id="company_id", + billing_credit_id="billing_credit_id", + feature_id="feature_id", + period="daily", + start_time="start_time", + end_time="end_time", + limit=1000000, + offset=1000000, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**company_id:** `str` + +
+
+ +
+
+ +**period:** `CreditLedgerPeriod` + +
+
+ +
+
+ +**billing_credit_id:** `typing.Optional[str]` + +
+
+ +
+
+ +**feature_id:** `typing.Optional[str]` + +
+
+ +
+
+ +**start_time:** `typing.Optional[str]` + +
+
+ +
+
+ +**end_time:** `typing.Optional[str]` + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Page limit (default 100) + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Page offset (default 0) + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.credits.list_billing_plan_credit_grants(...) -> ListBillingPlanCreditGrantsResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.credits.list_billing_plan_credit_grants( + credit_id="credit_id", + ids=[ + "ids" + ], + plan_id="plan_id", + plan_ids=[ + "plan_ids" + ], + plan_version_id="plan_version_id", plan_version_ids=[ "plan_version_ids" ], @@ -6784,7 +7162,7 @@ client.credits.count_credit_event_ledger(
```python -from schematic import Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody +from schematic import Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, CheckoutFieldValue, UpdatePayInAdvanceRequestBody from schematic.environment import SchematicEnvironment client = Schematic( @@ -6811,6 +7189,12 @@ client.checkout.internal( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -6936,7 +7320,7 @@ client.checkout.get_checkout_data(
```python -from schematic import Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody +from schematic import Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, CheckoutFieldValue, UpdatePayInAdvanceRequestBody from schematic.environment import SchematicEnvironment client = Schematic( @@ -6963,6 +7347,12 @@ client.checkout.preview_checkout_internal( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -7021,7 +7411,7 @@ client.checkout.preview_checkout_internal(
```python -from schematic import Schematic, PlanSelection, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody +from schematic import Schematic, PlanSelection, UpdateCreditBundleRequestBody, CheckoutFieldValue, UpdatePayInAdvanceRequestBody from schematic.environment import SchematicEnvironment client = Schematic( @@ -7042,6 +7432,12 @@ client.checkout.manage_plan( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -7097,7 +7493,7 @@ client.checkout.manage_plan(
```python -from schematic import Schematic, PlanSelection, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody +from schematic import Schematic, PlanSelection, UpdateCreditBundleRequestBody, CheckoutFieldValue, UpdatePayInAdvanceRequestBody from schematic.environment import SchematicEnvironment client = Schematic( @@ -7118,6 +7514,12 @@ client.checkout.preview_manage_plan( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -7338,6 +7740,9 @@ client.companies.list_companies( "plan_ids" ], plan_version_id="plan_version_id", + plan_version_ids=[ + "plan_version_ids" + ], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -7426,6 +7831,14 @@ client.companies.list_companies(
+**plan_version_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + +
+
+ +
+
+ **q:** `typing.Optional[str]` — Search for companies by name, keys or string traits
@@ -7766,6 +8179,9 @@ client.companies.count_companies( "plan_ids" ], plan_version_id="plan_version_id", + plan_version_ids=[ + "plan_version_ids" + ], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -7854,6 +8270,14 @@ client.companies.count_companies(
+**plan_version_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + +
+
+ +
+
+ **q:** `typing.Optional[str]` — Search for companies by name, keys or string traits
@@ -11312,7 +11736,7 @@ client.entitlements.list_feature_usage( "feature_ids" ], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -11540,7 +11964,7 @@ client.entitlements.count_feature_usage( "feature_ids" ], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -12207,6 +12631,14 @@ client.entitlements.create_plan_entitlement(
+**usage_quantity:** `typing.Optional[int]` — The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + +
+
+ +
+
+ **value_bool:** `typing.Optional[bool]`
@@ -12542,7 +12974,15 @@ client.entitlements.update_plan_entitlement(
-**soft_limit:** `typing.Optional[int]` +**soft_limit:** `typing.Optional[int]` + +
+
+ +
+
+ +**tier_mode:** `typing.Optional[BillingTiersMode]`
@@ -12550,7 +12990,7 @@ client.entitlements.update_plan_entitlement(
-**tier_mode:** `typing.Optional[BillingTiersMode]` +**usage_quantity:** `typing.Optional[int]` — The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use.
@@ -12715,7 +13155,7 @@ client = Schematic( ) client.entitlements.upsert_plan_entitlement_for_billing_product( - billing_provider="orb", + billing_provider="metronome", external_resource_id="external_resource_id", feature_id="feature_id", plan_id="plan_id", @@ -12944,6 +13384,14 @@ client.entitlements.upsert_plan_entitlement_for_billing_product(
+**usage_quantity:** `typing.Optional[int]` — The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + +
+
+ +
+
+ **value_bool:** `typing.Optional[bool]`
@@ -13487,6 +13935,76 @@ client.plans.list_custom_plan_billings(
+
+
+
+ +
client.plans.mark_custom_plan_billing_paid(...) -> MarkCustomPlanBillingPaidResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.plans.mark_custom_plan_billing_paid( + custom_plan_billing_id="custom_plan_billing_id", + request={ + "key": "value" + }, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**custom_plan_billing_id:** `str` — custom_plan_billing_id + +
+
+ +
+
+ +**request:** `MarkCustomPlanBillingPaidRequestBody` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -13718,6 +14236,7 @@ client.plans.list_plans( plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -13834,6 +14353,14 @@ client.plans.list_plans(
+**with_entitlements:** `typing.Optional[bool]` — Include each plan's entitlements in the response + +
+
+ +
+
+ **without_entitlement_for:** `typing.Optional[str]` — Filter out plans that already have a plan entitlement for the specified feature ID
@@ -14225,7 +14752,7 @@ client = Schematic( ) client.plans.upsert_plan_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", name="name", @@ -14522,6 +15049,7 @@ client.plans.count_plans( plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -14638,6 +15166,14 @@ client.plans.count_plans(
+**with_entitlements:** `typing.Optional[bool]` — Include each plan's entitlements in the response + +
+
+ +
+
+ **without_entitlement_for:** `typing.Optional[str]` — Filter out plans that already have a plan entitlement for the specified feature ID
@@ -16338,7 +16874,7 @@ client.features.list_features( ids=[ "ids" ], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", @@ -16881,7 +17417,7 @@ client = Schematic( ) client.features.upsert_feature_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", feature_type="boolean", @@ -17047,7 +17583,7 @@ client.features.count_features( ids=[ "ids" ], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", @@ -18538,6 +19074,65 @@ client.integrationsapi.get_integration_webhook_url(
+ +
+
+ +
client.integrationsapi.install_integration(...) -> InstallIntegrationResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.integrationsapi.install_integration( + type="clerk", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `InstallIntegrationRequestBody` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -18589,15 +19184,123 @@ client.integrationsapi.start_data_import(
-**company_matching_criteria:** `typing.Optional[CompanyMatchingCriteria]` - -
-
- +**company_matching_criteria:** `typing.Optional[CompanyMatchingCriteria]` + + + + +
+
+ +**company_matching_field:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+ + + + + + +
+ +
client.integrationsapi.load_sample_data_set() -> LoadSampleDataSetResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.integrationsapi.load_sample_data_set() + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.integrationsapi.assume_stripe_installed(...) -> AssumeStripeInstalledResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.integrationsapi.assume_stripe_installed( + type="clerk", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+
-**company_matching_field:** `typing.Optional[str]` +**request:** `InstallIntegrationRequestBody`
@@ -18617,7 +19320,7 @@ client.integrationsapi.start_data_import(
-
client.integrationsapi.load_sample_data_set_v_2() -> LoadSampleDataSetV2Response +
client.integrationsapi.install_stripe(...) -> InstallStripeResponse
@@ -18638,7 +19341,9 @@ client = Schematic( environment=SchematicEnvironment.DEFAULT, ) -client.integrationsapi.load_sample_data_set_v_2() +client.integrationsapi.install_stripe( + type="clerk", +) ```
@@ -18654,6 +19359,14 @@ client.integrationsapi.load_sample_data_set_v_2()
+**request:** `InstallIntegrationRequestBody` + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -19007,6 +19720,14 @@ client.plangroups.create_plan_group(
+**custom_checkout_fields:** `typing.Optional[typing.List[CheckoutFieldInput]]` + +
+
+ +
+
+ **custom_plan_config:** `typing.Optional[CustomPlanConfig]`
@@ -19354,6 +20075,14 @@ client.plangroups.update_plan_group(
+**custom_checkout_fields:** `typing.Optional[typing.List[CheckoutFieldInput]]` + +
+
+ +
+
+ **custom_plan_config:** `typing.Optional[CustomPlanConfig]`
@@ -19562,6 +20291,65 @@ client.planmigrations.list_company_migrations(
+ +
+
+ +
client.planmigrations.retry_company_migration(...) -> RetryCompanyMigrationResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.planmigrations.retry_company_migration( + plan_version_company_migration_id="plan_version_company_migration_id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**plan_version_company_migration_id:** `str` — plan_version_company_migration_id + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -19743,6 +20531,125 @@ client.planmigrations.list_migrations( + + +
+ +
client.planmigrations.create_migration(...) -> CreateMigrationResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.planmigrations.create_migration( + company_ids=[ + "company_ids" + ], + excluded_company_ids=[ + "excluded_company_ids" + ], + plan_id="plan_id", + plan_version_id_to="plan_version_id_to", + plan_version_ids_from=[ + "plan_version_ids_from" + ], + strategy="immediate", + target_plan_type="plan", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**company_ids:** `typing.List[str]` + +
+
+ +
+
+ +**excluded_company_ids:** `typing.List[str]` + +
+
+ +
+
+ +**plan_id:** `str` + +
+
+ +
+
+ +**plan_version_id_to:** `str` + +
+
+ +
+
+ +**plan_version_ids_from:** `typing.List[str]` + +
+
+ +
+
+ +**strategy:** `PlanVersionMigrationStrategy` + +
+
+ +
+
+ +**target_plan_type:** `PlanType` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -19802,6 +20709,76 @@ client.planmigrations.get_migration( + + +
+ +
client.planmigrations.retry_migration(...) -> RetryMigrationResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from schematic import Schematic +from schematic.environment import SchematicEnvironment + +client = Schematic( + api_key="", + environment=SchematicEnvironment.DEFAULT, +) + +client.planmigrations.retry_migration( + plan_version_migration_id="plan_version_migration_id", + error_codes=[ + "ambiguous_subscription_item" + ], +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**plan_version_migration_id:** `str` — plan_version_migration_id + +
+
+ +
+
+ +**error_codes:** `typing.List[MigrationErrorCode]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
diff --git a/src/schematic/__init__.py b/src/schematic/__init__.py index 5866425..26025d0 100644 --- a/src/schematic/__init__.py +++ b/src/schematic/__init__.py @@ -31,6 +31,7 @@ BillingCreditGrantReason, BillingCreditGrantResponseData, BillingCreditGrantZeroedOutReason, + BillingCreditLedgerAuthority, BillingCreditLedgerResponseData, BillingCreditResponseData, BillingCreditRolloverPolicy, @@ -57,6 +58,7 @@ BillingProductPricing, BillingProductResponseData, BillingProviderType, + BillingStrategy, BillingSubscriptionDiscount, BillingSubscriptionDiscountView, BillingSubscriptionResponseData, @@ -73,6 +75,10 @@ CheckFlagsBulkResponseData, CheckFlagsResponseData, CheckoutDataResponseData, + CheckoutFieldInput, + CheckoutFieldResponseData, + CheckoutFieldValue, + CheckoutFieldWithValue, CheckoutSettingsResponseData, CheckoutSubscription, ClerkIntegrationConfig, @@ -139,6 +145,7 @@ CreditGrantDetail, CreditGrantExpiryRequestBody, CreditGrantSortOrder, + CreditLeaseResponseData, CreditLedgerEnrichedEntryResponseData, CreditLedgerPeriod, CreditTransferResponseData, @@ -146,6 +153,7 @@ CreditTriggerConfig, CreditUsage, CreditUsageAggregation, + CreditUsageReason, CreditsAutoTopupCompanySummary, CreditsAutoTopupCreditSummary, CreditsAutoTopupHardFailure, @@ -216,11 +224,16 @@ FlagView, GenericPreviewObject, InsightsSummaryResponseData, + InstallIntegrationRequestBody, IntegrationCapabilities, IntegrationConfig, IntegrationConfig_Clerk, + IntegrationConfig_Metronome, IntegrationConfig_Orb, IntegrationConfig_Stripe, + IntegrationConfig_Workos, + IntegrationInstallConfig, + IntegrationInstallResponseData, IntegrationResponseData, IntegrationState, IntegrationType, @@ -237,9 +250,12 @@ ManagePlanPreviewResponseResponseData, ManagePlanRequest, ManagePlanResponseResponseData, + MarkCustomPlanBillingPaidRequestBody, MeterRequestBody, MetricPeriod, MetricPeriodMonthReset, + MetronomeIntegrationConfig, + MigrationErrorCode, MrrResponseData, OrbIntegrationConfig, OrderedPlansInGroup, @@ -268,6 +284,7 @@ PlanGrowthResponseData, PlanIcon, PlanIssueResponseData, + PlanPriceCadence, PlanResponseData, PlanSelection, PlanSnapshotView, @@ -292,6 +309,7 @@ QuickstartResp, RawEventBatchResponseData, RawEventResponseData, + ReleaseCreditLeaseRequestBody, Rule, RuleConditionDetailResponseData, RuleConditionGroupDetailResponseData, @@ -373,6 +391,7 @@ WebhookStatus, WebhookUrl, WhoAmIResponseData, + WorkOsIntegrationConfig, ) from .errors import BadRequestError, ForbiddenError, InternalServerError, NotFoundError, UnauthorizedError from . import ( @@ -399,6 +418,8 @@ ) from .accesstokens import IssueTemporaryAccessTokenResponse from .accounts import ( + CountAccountMembersParams, + CountAccountMembersResponse, CountApiKeysParams, CountApiKeysResponse, CountAuditLogsParams, @@ -430,6 +451,7 @@ CountCustomersParams, CountCustomersResponse, DeleteBillingProductResponse, + DeletePaymentMethodByExternalIdResponse, DeleteProductPriceResponse, ListBillingPricesParams, ListBillingPricesResponse, @@ -535,6 +557,7 @@ ) from .componentspublic import GetPublicPlansResponse from .credits import ( + AcquireCreditLeaseResponse, CountBillingCreditsGrantsParams, CountBillingCreditsGrantsResponse, CountBillingCreditsParams, @@ -555,6 +578,7 @@ DeleteBillingPlanCreditGrantParams, DeleteBillingPlanCreditGrantResponse, DeleteCreditBundleResponse, + ExtendCreditLeaseResponse, GetCreditBundleResponse, GetEnrichedCreditLedgerParams, GetEnrichedCreditLedgerResponse, @@ -575,6 +599,7 @@ ListCreditEventLedgerResponse, ListGrantsForCreditParams, ListGrantsForCreditResponse, + ReleaseCreditLeaseResponse, SoftDeleteBillingCreditResponse, UpdateBillingCreditResponse, UpdateBillingPlanCreditGrantResponse, @@ -666,10 +691,13 @@ GetTopFeaturesByUsageResponse, ) from .integrationsapi import ( + AssumeStripeInstalledResponse, GetIntegrationWebhookUrlResponse, + InstallIntegrationResponse, + InstallStripeResponse, ListIntegrationsParams, ListIntegrationsResponse, - LoadSampleDataSetV2Response, + LoadSampleDataSetResponse, RunIntegrationResponse, StartDataImportResponse, UninstallIntegrationResponse, @@ -681,11 +709,14 @@ CountCompanyMigrationsResponse, CountMigrationsParams, CountMigrationsResponse, + CreateMigrationResponse, GetMigrationResponse, ListCompanyMigrationsParams, ListCompanyMigrationsResponse, ListMigrationsParams, ListMigrationsResponse, + RetryCompanyMigrationResponse, + RetryMigrationResponse, ) from .plans import ( CountBillingProductMatchCompaniesParams, @@ -707,6 +738,7 @@ ListPlanIssuesResponse, ListPlansParams, ListPlansResponse, + MarkCustomPlanBillingPaidResponse, PublishPlanVersionResponse, RetryCustomPlanBillingResponse, UpdateCompanyPlansResponse, @@ -741,6 +773,7 @@ "AccountMemberPermission": ".types", "AccountMemberResponseData": ".types", "AccountMemberRole": ".types", + "AcquireCreditLeaseResponse": ".credits", "ActivityEntryResponseData": ".types", "ActivityResponseResponseData": ".types", "ActorType": ".types", @@ -749,6 +782,7 @@ "ApiKeyIntegrationResponseData": ".types", "ApiKeyResponseData": ".types", "ApiKeyScope": ".types", + "AssumeStripeInstalledResponse": ".integrationsapi", "AsyncSchematic": ".client", "AsyncSchematicConfig": ".client", "AuditLogListResponseData": ".types", @@ -765,6 +799,7 @@ "BillingCreditGrantReason": ".types", "BillingCreditGrantResponseData": ".types", "BillingCreditGrantZeroedOutReason": ".types", + "BillingCreditLedgerAuthority": ".types", "BillingCreditLedgerResponseData": ".types", "BillingCreditResponseData": ".types", "BillingCreditRolloverPolicy": ".types", @@ -791,6 +826,7 @@ "BillingProductPricing": ".types", "BillingProductResponseData": ".types", "BillingProviderType": ".types", + "BillingStrategy": ".types", "BillingSubscriptionDiscount": ".types", "BillingSubscriptionDiscountView": ".types", "BillingSubscriptionResponseData": ".types", @@ -811,6 +847,10 @@ "CheckFlagsResponse": ".features", "CheckFlagsResponseData": ".types", "CheckoutDataResponseData": ".types", + "CheckoutFieldInput": ".types", + "CheckoutFieldResponseData": ".types", + "CheckoutFieldValue": ".types", + "CheckoutFieldWithValue": ".types", "CheckoutInternalResponse": ".checkout", "CheckoutSettingsResponseData": ".types", "CheckoutSubscription": ".types", @@ -849,6 +889,8 @@ "ConditionResponseData": ".types", "ConditionType": ".types", "ConditionView": ".types", + "CountAccountMembersParams": ".accounts", + "CountAccountMembersResponse": ".accounts", "CountApiKeysParams": ".accounts", "CountApiKeysResponse": ".accounts", "CountAuditLogsParams": ".accounts", @@ -933,6 +975,7 @@ "CreateFeatureResponse": ".features", "CreateFlagRequestBody": ".types", "CreateFlagResponse": ".features", + "CreateMigrationResponse": ".planmigrations", "CreateOrUpdateConditionGroupRequestBody": ".types", "CreateOrUpdateConditionRequestBody": ".types", "CreateOrUpdateFlagRequestBody": ".types", @@ -960,6 +1003,7 @@ "CreditGrantDetail": ".types", "CreditGrantExpiryRequestBody": ".types", "CreditGrantSortOrder": ".types", + "CreditLeaseResponseData": ".types", "CreditLedgerEnrichedEntryResponseData": ".types", "CreditLedgerPeriod": ".types", "CreditTransferResponseData": ".types", @@ -967,6 +1011,7 @@ "CreditTriggerConfig": ".types", "CreditUsage": ".types", "CreditUsageAggregation": ".types", + "CreditUsageReason": ".types", "CreditsAutoTopupCompanySummary": ".types", "CreditsAutoTopupCreditSummary": ".types", "CreditsAutoTopupHardFailure": ".types", @@ -998,6 +1043,7 @@ "DeleteEnvironmentResponse": ".accounts", "DeleteFeatureResponse": ".features", "DeleteFlagResponse": ".features", + "DeletePaymentMethodByExternalIdResponse": ".billing", "DeletePlanEntitlementResponse": ".entitlements", "DeletePlanResponse": ".plans", "DeletePlanVersionParams": ".plans", @@ -1039,6 +1085,7 @@ "EventStatus": ".types", "EventSummaryResponseData": ".types", "EventType": ".types", + "ExtendCreditLeaseResponse": ".credits", "FeatureCompanyResponseData": ".types", "FeatureCompanyUserResponseData": ".types", "FeatureDetailResponseData": ".types", @@ -1118,11 +1165,18 @@ "GetWhoAmIResponse": ".accounts", "GrantBillingCreditsToCompanyResponse": ".credits", "InsightsSummaryResponseData": ".types", + "InstallIntegrationRequestBody": ".types", + "InstallIntegrationResponse": ".integrationsapi", + "InstallStripeResponse": ".integrationsapi", "IntegrationCapabilities": ".types", "IntegrationConfig": ".types", "IntegrationConfig_Clerk": ".types", + "IntegrationConfig_Metronome": ".types", "IntegrationConfig_Orb": ".types", "IntegrationConfig_Stripe": ".types", + "IntegrationConfig_Workos": ".types", + "IntegrationInstallConfig": ".types", + "IntegrationInstallResponseData": ".types", "IntegrationResponseData": ".types", "IntegrationState": ".types", "IntegrationType": ".types", @@ -1228,7 +1282,7 @@ "ListWebhookEventsResponse": ".webhooks", "ListWebhooksParams": ".webhooks", "ListWebhooksResponse": ".webhooks", - "LoadSampleDataSetV2Response": ".integrationsapi", + "LoadSampleDataSetResponse": ".integrationsapi", "LocalCache": ".client", "LookupCompanyParams": ".companies", "LookupCompanyResponse": ".companies", @@ -1238,9 +1292,13 @@ "ManagePlanRequest": ".types", "ManagePlanResponse": ".checkout", "ManagePlanResponseResponseData": ".types", + "MarkCustomPlanBillingPaidRequestBody": ".types", + "MarkCustomPlanBillingPaidResponse": ".plans", "MeterRequestBody": ".types", "MetricPeriod": ".types", "MetricPeriodMonthReset": ".types", + "MetronomeIntegrationConfig": ".types", + "MigrationErrorCode": ".types", "MrrResponseData": ".types", "NotFoundError": ".errors", "OrbIntegrationConfig": ".types", @@ -1270,6 +1328,7 @@ "PlanGrowthResponseData": ".types", "PlanIcon": ".types", "PlanIssueResponseData": ".types", + "PlanPriceCadence": ".types", "PlanResponseData": ".types", "PlanSelection": ".types", "PlanSnapshotView": ".types", @@ -1300,7 +1359,11 @@ "QuickstartResponse": ".accounts", "RawEventBatchResponseData": ".types", "RawEventResponseData": ".types", + "ReleaseCreditLeaseRequestBody": ".types", + "ReleaseCreditLeaseResponse": ".credits", + "RetryCompanyMigrationResponse": ".planmigrations", "RetryCustomPlanBillingResponse": ".plans", + "RetryMigrationResponse": ".planmigrations", "Rule": ".types", "RuleConditionDetailResponseData": ".types", "RuleConditionGroupDetailResponseData": ".types", @@ -1426,6 +1489,7 @@ "WebhookStatus": ".types", "WebhookUrl": ".types", "WhoAmIResponseData": ".types", + "WorkOsIntegrationConfig": ".types", "ZeroOutGrantResponse": ".credits", "__version__": ".version", "accesstokens": ".accesstokens", @@ -1476,6 +1540,7 @@ def __dir__(): "AccountMemberPermission", "AccountMemberResponseData", "AccountMemberRole", + "AcquireCreditLeaseResponse", "ActivityEntryResponseData", "ActivityResponseResponseData", "ActorType", @@ -1484,6 +1549,7 @@ def __dir__(): "ApiKeyIntegrationResponseData", "ApiKeyResponseData", "ApiKeyScope", + "AssumeStripeInstalledResponse", "AsyncSchematic", "AsyncSchematicConfig", "AuditLogListResponseData", @@ -1500,6 +1566,7 @@ def __dir__(): "BillingCreditGrantReason", "BillingCreditGrantResponseData", "BillingCreditGrantZeroedOutReason", + "BillingCreditLedgerAuthority", "BillingCreditLedgerResponseData", "BillingCreditResponseData", "BillingCreditRolloverPolicy", @@ -1526,6 +1593,7 @@ def __dir__(): "BillingProductPricing", "BillingProductResponseData", "BillingProviderType", + "BillingStrategy", "BillingSubscriptionDiscount", "BillingSubscriptionDiscountView", "BillingSubscriptionResponseData", @@ -1546,6 +1614,10 @@ def __dir__(): "CheckFlagsResponse", "CheckFlagsResponseData", "CheckoutDataResponseData", + "CheckoutFieldInput", + "CheckoutFieldResponseData", + "CheckoutFieldValue", + "CheckoutFieldWithValue", "CheckoutInternalResponse", "CheckoutSettingsResponseData", "CheckoutSubscription", @@ -1584,6 +1656,8 @@ def __dir__(): "ConditionResponseData", "ConditionType", "ConditionView", + "CountAccountMembersParams", + "CountAccountMembersResponse", "CountApiKeysParams", "CountApiKeysResponse", "CountAuditLogsParams", @@ -1668,6 +1742,7 @@ def __dir__(): "CreateFeatureResponse", "CreateFlagRequestBody", "CreateFlagResponse", + "CreateMigrationResponse", "CreateOrUpdateConditionGroupRequestBody", "CreateOrUpdateConditionRequestBody", "CreateOrUpdateFlagRequestBody", @@ -1695,6 +1770,7 @@ def __dir__(): "CreditGrantDetail", "CreditGrantExpiryRequestBody", "CreditGrantSortOrder", + "CreditLeaseResponseData", "CreditLedgerEnrichedEntryResponseData", "CreditLedgerPeriod", "CreditTransferResponseData", @@ -1702,6 +1778,7 @@ def __dir__(): "CreditTriggerConfig", "CreditUsage", "CreditUsageAggregation", + "CreditUsageReason", "CreditsAutoTopupCompanySummary", "CreditsAutoTopupCreditSummary", "CreditsAutoTopupHardFailure", @@ -1733,6 +1810,7 @@ def __dir__(): "DeleteEnvironmentResponse", "DeleteFeatureResponse", "DeleteFlagResponse", + "DeletePaymentMethodByExternalIdResponse", "DeletePlanEntitlementResponse", "DeletePlanResponse", "DeletePlanVersionParams", @@ -1774,6 +1852,7 @@ def __dir__(): "EventStatus", "EventSummaryResponseData", "EventType", + "ExtendCreditLeaseResponse", "FeatureCompanyResponseData", "FeatureCompanyUserResponseData", "FeatureDetailResponseData", @@ -1853,11 +1932,18 @@ def __dir__(): "GetWhoAmIResponse", "GrantBillingCreditsToCompanyResponse", "InsightsSummaryResponseData", + "InstallIntegrationRequestBody", + "InstallIntegrationResponse", + "InstallStripeResponse", "IntegrationCapabilities", "IntegrationConfig", "IntegrationConfig_Clerk", + "IntegrationConfig_Metronome", "IntegrationConfig_Orb", "IntegrationConfig_Stripe", + "IntegrationConfig_Workos", + "IntegrationInstallConfig", + "IntegrationInstallResponseData", "IntegrationResponseData", "IntegrationState", "IntegrationType", @@ -1963,7 +2049,7 @@ def __dir__(): "ListWebhookEventsResponse", "ListWebhooksParams", "ListWebhooksResponse", - "LoadSampleDataSetV2Response", + "LoadSampleDataSetResponse", "LocalCache", "LookupCompanyParams", "LookupCompanyResponse", @@ -1973,9 +2059,13 @@ def __dir__(): "ManagePlanRequest", "ManagePlanResponse", "ManagePlanResponseResponseData", + "MarkCustomPlanBillingPaidRequestBody", + "MarkCustomPlanBillingPaidResponse", "MeterRequestBody", "MetricPeriod", "MetricPeriodMonthReset", + "MetronomeIntegrationConfig", + "MigrationErrorCode", "MrrResponseData", "NotFoundError", "OrbIntegrationConfig", @@ -2005,6 +2095,7 @@ def __dir__(): "PlanGrowthResponseData", "PlanIcon", "PlanIssueResponseData", + "PlanPriceCadence", "PlanResponseData", "PlanSelection", "PlanSnapshotView", @@ -2035,7 +2126,11 @@ def __dir__(): "QuickstartResponse", "RawEventBatchResponseData", "RawEventResponseData", + "ReleaseCreditLeaseRequestBody", + "ReleaseCreditLeaseResponse", + "RetryCompanyMigrationResponse", "RetryCustomPlanBillingResponse", + "RetryMigrationResponse", "Rule", "RuleConditionDetailResponseData", "RuleConditionGroupDetailResponseData", @@ -2161,6 +2256,7 @@ def __dir__(): "WebhookStatus", "WebhookUrl", "WhoAmIResponseData", + "WorkOsIntegrationConfig", "ZeroOutGrantResponse", "__version__", "accesstokens", diff --git a/src/schematic/accounts/__init__.py b/src/schematic/accounts/__init__.py index d380c01..28b75c7 100644 --- a/src/schematic/accounts/__init__.py +++ b/src/schematic/accounts/__init__.py @@ -7,6 +7,8 @@ if typing.TYPE_CHECKING: from .types import ( + CountAccountMembersParams, + CountAccountMembersResponse, CountApiKeysParams, CountApiKeysResponse, CountAuditLogsParams, @@ -33,6 +35,8 @@ UpdateEnvironmentResponse, ) _dynamic_imports: typing.Dict[str, str] = { + "CountAccountMembersParams": ".types", + "CountAccountMembersResponse": ".types", "CountApiKeysParams": ".types", "CountApiKeysResponse": ".types", "CountAuditLogsParams": ".types", @@ -82,6 +86,8 @@ def __dir__(): __all__ = [ + "CountAccountMembersParams", + "CountAccountMembersResponse", "CountApiKeysParams", "CountApiKeysResponse", "CountAuditLogsParams", diff --git a/src/schematic/accounts/client.py b/src/schematic/accounts/client.py index 81deb27..c5b1b33 100644 --- a/src/schematic/accounts/client.py +++ b/src/schematic/accounts/client.py @@ -8,6 +8,7 @@ from ..types.actor_type import ActorType from ..types.environment_type import EnvironmentType from .raw_client import AsyncRawAccountsClient, RawAccountsClient +from .types.count_account_members_response import CountAccountMembersResponse from .types.count_api_keys_response import CountApiKeysResponse from .types.count_audit_logs_response import CountAuditLogsResponse from .types.create_api_key_response import CreateApiKeyResponse @@ -127,6 +128,56 @@ def get_account_member( _response = self._raw_client.get_account_member(account_member_id, request_options=request_options) return _response.data + def count_account_members( + self, + *, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + q: typing.Optional[str] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> CountAccountMembersResponse: + """ + Parameters + ---------- + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + q : typing.Optional[str] + Search filter + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + CountAccountMembersResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.accounts.count_account_members( + ids=["ids"], + q="q", + limit=1000000, + offset=1000000, + ) + """ + _response = self._raw_client.count_account_members( + ids=ids, q=q, limit=limit, offset=offset, request_options=request_options + ) + return _response.data + def list_api_keys( self, *, @@ -909,6 +960,64 @@ async def main() -> None: _response = await self._raw_client.get_account_member(account_member_id, request_options=request_options) return _response.data + async def count_account_members( + self, + *, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + q: typing.Optional[str] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> CountAccountMembersResponse: + """ + Parameters + ---------- + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + q : typing.Optional[str] + Search filter + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + CountAccountMembersResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.accounts.count_account_members( + ids=["ids"], + q="q", + limit=1000000, + offset=1000000, + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.count_account_members( + ids=ids, q=q, limit=limit, offset=offset, request_options=request_options + ) + return _response.data + async def list_api_keys( self, *, diff --git a/src/schematic/accounts/raw_client.py b/src/schematic/accounts/raw_client.py index c3e179a..8e3bf7d 100644 --- a/src/schematic/accounts/raw_client.py +++ b/src/schematic/accounts/raw_client.py @@ -20,6 +20,7 @@ from ..types.actor_type import ActorType from ..types.api_error import ApiError as types_api_error_ApiError from ..types.environment_type import EnvironmentType +from .types.count_account_members_response import CountAccountMembersResponse from .types.count_api_keys_response import CountApiKeysResponse from .types.count_audit_logs_response import CountAuditLogsResponse from .types.create_api_key_response import CreateApiKeyResponse @@ -257,6 +258,126 @@ def get_account_member( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def count_account_members( + self, + *, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + q: typing.Optional[str] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[CountAccountMembersResponse]: + """ + Parameters + ---------- + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + q : typing.Optional[str] + Search filter + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[CountAccountMembersResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "account-members/count", + method="GET", + params={ + "ids": ids, + "q": q, + "limit": limit, + "offset": offset, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + CountAccountMembersResponse, + parse_obj_as( + type_=CountAccountMembersResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def list_api_keys( self, *, @@ -2200,6 +2321,126 @@ async def get_account_member( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + async def count_account_members( + self, + *, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + q: typing.Optional[str] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[CountAccountMembersResponse]: + """ + Parameters + ---------- + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + q : typing.Optional[str] + Search filter + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[CountAccountMembersResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + "account-members/count", + method="GET", + params={ + "ids": ids, + "q": q, + "limit": limit, + "offset": offset, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + CountAccountMembersResponse, + parse_obj_as( + type_=CountAccountMembersResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + async def list_api_keys( self, *, diff --git a/src/schematic/accounts/types/__init__.py b/src/schematic/accounts/types/__init__.py index 37ba51a..69f8120 100644 --- a/src/schematic/accounts/types/__init__.py +++ b/src/schematic/accounts/types/__init__.py @@ -6,6 +6,8 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .count_account_members_params import CountAccountMembersParams + from .count_account_members_response import CountAccountMembersResponse from .count_api_keys_params import CountApiKeysParams from .count_api_keys_response import CountApiKeysResponse from .count_audit_logs_params import CountAuditLogsParams @@ -31,6 +33,8 @@ from .update_api_key_response import UpdateApiKeyResponse from .update_environment_response import UpdateEnvironmentResponse _dynamic_imports: typing.Dict[str, str] = { + "CountAccountMembersParams": ".count_account_members_params", + "CountAccountMembersResponse": ".count_account_members_response", "CountApiKeysParams": ".count_api_keys_params", "CountApiKeysResponse": ".count_api_keys_response", "CountAuditLogsParams": ".count_audit_logs_params", @@ -80,6 +84,8 @@ def __dir__(): __all__ = [ + "CountAccountMembersParams", + "CountAccountMembersResponse", "CountApiKeysParams", "CountApiKeysResponse", "CountAuditLogsParams", diff --git a/src/schematic/accounts/types/count_account_members_params.py b/src/schematic/accounts/types/count_account_members_params.py new file mode 100644 index 0000000..90d9e1a --- /dev/null +++ b/src/schematic/accounts/types/count_account_members_params.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CountAccountMembersParams(UniversalBaseModel): + """ + Input parameters + """ + + ids: typing.Optional[typing.List[str]] = None + limit: typing.Optional[int] = pydantic.Field(default=None) + """ + Page limit (default 100) + """ + + offset: typing.Optional[int] = pydantic.Field(default=None) + """ + Page offset (default 0) + """ + + q: typing.Optional[str] = pydantic.Field(default=None) + """ + Search filter + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/accounts/types/count_account_members_response.py b/src/schematic/accounts/types/count_account_members_response.py new file mode 100644 index 0000000..f480029 --- /dev/null +++ b/src/schematic/accounts/types/count_account_members_response.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.count_response import CountResponse +from .count_account_members_params import CountAccountMembersParams + + +class CountAccountMembersResponse(UniversalBaseModel): + data: CountResponse + params: CountAccountMembersParams = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/billing/__init__.py b/src/schematic/billing/__init__.py index 2d1e46a..e983952 100644 --- a/src/schematic/billing/__init__.py +++ b/src/schematic/billing/__init__.py @@ -12,6 +12,7 @@ CountCustomersParams, CountCustomersResponse, DeleteBillingProductResponse, + DeletePaymentMethodByExternalIdResponse, DeleteProductPriceResponse, ListBillingPricesParams, ListBillingPricesResponse, @@ -44,6 +45,7 @@ "CountCustomersParams": ".types", "CountCustomersResponse": ".types", "DeleteBillingProductResponse": ".types", + "DeletePaymentMethodByExternalIdResponse": ".types", "DeleteProductPriceResponse": ".types", "ListBillingPricesParams": ".types", "ListBillingPricesResponse": ".types", @@ -99,6 +101,7 @@ def __dir__(): "CountCustomersParams", "CountCustomersResponse", "DeleteBillingProductResponse", + "DeletePaymentMethodByExternalIdResponse", "DeleteProductPriceResponse", "ListBillingPricesParams", "ListBillingPricesResponse", diff --git a/src/schematic/billing/client.py b/src/schematic/billing/client.py index 62b9e19..eb242ec 100644 --- a/src/schematic/billing/client.py +++ b/src/schematic/billing/client.py @@ -18,6 +18,7 @@ from .types.count_billing_products_response import CountBillingProductsResponse from .types.count_customers_response import CountCustomersResponse from .types.delete_billing_product_response import DeleteBillingProductResponse +from .types.delete_payment_method_by_external_id_response import DeletePaymentMethodByExternalIdResponse from .types.delete_product_price_response import DeleteProductPriceResponse from .types.list_billing_prices_response import ListBillingPricesResponse from .types.list_billing_product_prices_response import ListBillingProductPricesResponse @@ -288,7 +289,7 @@ def list_customers_with_subscriptions( client.billing.list_customers_with_subscriptions( company_ids=["company_ids"], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -351,7 +352,7 @@ def count_customers( client.billing.count_customers( company_ids=["company_ids"], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -751,6 +752,37 @@ def upsert_payment_method( ) return _response.data + def delete_payment_method_by_external_id( + self, billing_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> DeletePaymentMethodByExternalIdResponse: + """ + Parameters + ---------- + billing_id : str + billing_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + DeletePaymentMethodByExternalIdResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.billing.delete_payment_method_by_external_id( + billing_id="billing_id", + ) + """ + _response = self._raw_client.delete_payment_method_by_external_id(billing_id, request_options=request_options) + return _response.data + def list_billing_prices( self, *, @@ -839,7 +871,7 @@ def list_billing_prices( price=1000000, product_id="product_id", product_ids=["product_ids"], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -1101,7 +1133,7 @@ def list_billing_product_prices( price=1000000, product_id="product_id", product_ids=["product_ids"], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -1290,7 +1322,7 @@ def list_billing_products( is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, @@ -1394,7 +1426,7 @@ def count_billing_products( is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, @@ -1847,7 +1879,7 @@ async def main() -> None: await client.billing.list_customers_with_subscriptions( company_ids=["company_ids"], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -1918,7 +1950,7 @@ async def main() -> None: await client.billing.count_customers( company_ids=["company_ids"], name="name", - provider_type="orb", + provider_type="metronome", q="q", limit=1000000, offset=1000000, @@ -2369,6 +2401,47 @@ async def main() -> None: ) return _response.data + async def delete_payment_method_by_external_id( + self, billing_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> DeletePaymentMethodByExternalIdResponse: + """ + Parameters + ---------- + billing_id : str + billing_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + DeletePaymentMethodByExternalIdResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.billing.delete_payment_method_by_external_id( + billing_id="billing_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.delete_payment_method_by_external_id( + billing_id, request_options=request_options + ) + return _response.data + async def list_billing_prices( self, *, @@ -2462,7 +2535,7 @@ async def main() -> None: price=1000000, product_id="product_id", product_ids=["product_ids"], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -2748,7 +2821,7 @@ async def main() -> None: price=1000000, product_id="product_id", product_ids=["product_ids"], - provider_type="orb", + provider_type="metronome", q="q", tiers_mode="graduated", usage_type="licensed", @@ -2961,7 +3034,7 @@ async def main() -> None: is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, @@ -3073,7 +3146,7 @@ async def main() -> None: is_active=True, name="name", price_usage_type="licensed", - provider_type="orb", + provider_type="metronome", q="q", recurring_charges_only=True, with_one_time_charges=True, diff --git a/src/schematic/billing/raw_client.py b/src/schematic/billing/raw_client.py index 03f0ae3..16f4a44 100644 --- a/src/schematic/billing/raw_client.py +++ b/src/schematic/billing/raw_client.py @@ -30,6 +30,7 @@ from .types.count_billing_products_response import CountBillingProductsResponse from .types.count_customers_response import CountCustomersResponse from .types.delete_billing_product_response import DeleteBillingProductResponse +from .types.delete_payment_method_by_external_id_response import DeletePaymentMethodByExternalIdResponse from .types.delete_product_price_response import DeleteProductPriceResponse from .types.list_billing_prices_response import ListBillingPricesResponse from .types.list_billing_product_prices_response import ListBillingProductPricesResponse @@ -1496,6 +1497,106 @@ def upsert_payment_method( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def delete_payment_method_by_external_id( + self, billing_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[DeletePaymentMethodByExternalIdResponse]: + """ + Parameters + ---------- + billing_id : str + billing_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[DeletePaymentMethodByExternalIdResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"billing/payment-methods/{jsonable_encoder(billing_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + DeletePaymentMethodByExternalIdResponse, + parse_obj_as( + type_=DeletePaymentMethodByExternalIdResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def list_billing_prices( self, *, @@ -4297,6 +4398,106 @@ async def upsert_payment_method( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + async def delete_payment_method_by_external_id( + self, billing_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[DeletePaymentMethodByExternalIdResponse]: + """ + Parameters + ---------- + billing_id : str + billing_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[DeletePaymentMethodByExternalIdResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"billing/payment-methods/{jsonable_encoder(billing_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + DeletePaymentMethodByExternalIdResponse, + parse_obj_as( + type_=DeletePaymentMethodByExternalIdResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + async def list_billing_prices( self, *, diff --git a/src/schematic/billing/types/__init__.py b/src/schematic/billing/types/__init__.py index 7bd5220..6752589 100644 --- a/src/schematic/billing/types/__init__.py +++ b/src/schematic/billing/types/__init__.py @@ -11,6 +11,7 @@ from .count_customers_params import CountCustomersParams from .count_customers_response import CountCustomersResponse from .delete_billing_product_response import DeleteBillingProductResponse + from .delete_payment_method_by_external_id_response import DeletePaymentMethodByExternalIdResponse from .delete_product_price_response import DeleteProductPriceResponse from .list_billing_prices_params import ListBillingPricesParams from .list_billing_prices_response import ListBillingPricesResponse @@ -42,6 +43,7 @@ "CountCustomersParams": ".count_customers_params", "CountCustomersResponse": ".count_customers_response", "DeleteBillingProductResponse": ".delete_billing_product_response", + "DeletePaymentMethodByExternalIdResponse": ".delete_payment_method_by_external_id_response", "DeleteProductPriceResponse": ".delete_product_price_response", "ListBillingPricesParams": ".list_billing_prices_params", "ListBillingPricesResponse": ".list_billing_prices_response", @@ -97,6 +99,7 @@ def __dir__(): "CountCustomersParams", "CountCustomersResponse", "DeleteBillingProductResponse", + "DeletePaymentMethodByExternalIdResponse", "DeleteProductPriceResponse", "ListBillingPricesParams", "ListBillingPricesResponse", diff --git a/src/schematic/billing/types/delete_payment_method_by_external_id_response.py b/src/schematic/billing/types/delete_payment_method_by_external_id_response.py new file mode 100644 index 0000000..0d7454b --- /dev/null +++ b/src/schematic/billing/types/delete_payment_method_by_external_id_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.delete_response import DeleteResponse + + +class DeletePaymentMethodByExternalIdResponse(UniversalBaseModel): + data: DeleteResponse + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/checkout/client.py b/src/schematic/checkout/client.py index 1fbed9e..9217485 100644 --- a/src/schematic/checkout/client.py +++ b/src/schematic/checkout/client.py @@ -5,6 +5,7 @@ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.request_options import RequestOptions +from ..types.checkout_field_value import CheckoutFieldValue from ..types.plan_selection import PlanSelection from ..types.update_add_on_request_body import UpdateAddOnRequestBody from ..types.update_auto_topup_override_request_body import UpdateAutoTopupOverrideRequestBody @@ -45,6 +46,7 @@ def internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -65,6 +67,8 @@ def internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -90,6 +94,7 @@ def internal( Examples -------- from schematic import ( + CheckoutFieldValue, Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, @@ -119,6 +124,12 @@ def internal( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -135,6 +146,7 @@ def internal( auto_topup_overrides=auto_topup_overrides, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, new_plan_id=new_plan_id, new_price_id=new_price_id, pay_in_advance=pay_in_advance, @@ -191,6 +203,7 @@ def preview_checkout_internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -211,6 +224,8 @@ def preview_checkout_internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -236,6 +251,7 @@ def preview_checkout_internal( Examples -------- from schematic import ( + CheckoutFieldValue, Schematic, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, @@ -265,6 +281,12 @@ def preview_checkout_internal( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -281,6 +303,7 @@ def preview_checkout_internal( auto_topup_overrides=auto_topup_overrides, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, new_plan_id=new_plan_id, new_price_id=new_price_id, pay_in_advance=pay_in_advance, @@ -298,6 +321,7 @@ def manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -319,6 +343,8 @@ def manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -352,6 +378,7 @@ def manage_plan( Examples -------- from schematic import ( + CheckoutFieldValue, PlanSelection, Schematic, UpdateCreditBundleRequestBody, @@ -374,6 +401,12 @@ def manage_plan( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -386,6 +419,7 @@ def manage_plan( add_on_selections=add_on_selections, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, pay_in_advance_entitlements=pay_in_advance_entitlements, base_plan_id=base_plan_id, base_plan_price_id=base_plan_price_id, @@ -406,6 +440,7 @@ def preview_manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -427,6 +462,8 @@ def preview_manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -460,6 +497,7 @@ def preview_manage_plan( Examples -------- from schematic import ( + CheckoutFieldValue, PlanSelection, Schematic, UpdateCreditBundleRequestBody, @@ -482,6 +520,12 @@ def preview_manage_plan( quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -494,6 +538,7 @@ def preview_manage_plan( add_on_selections=add_on_selections, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, pay_in_advance_entitlements=pay_in_advance_entitlements, base_plan_id=base_plan_id, base_plan_price_id=base_plan_price_id, @@ -616,6 +661,7 @@ async def internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -636,6 +682,8 @@ async def internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -664,6 +712,7 @@ async def internal( from schematic import ( AsyncSchematic, + CheckoutFieldValue, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, @@ -695,6 +744,12 @@ async def main() -> None: quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -714,6 +769,7 @@ async def main() -> None: auto_topup_overrides=auto_topup_overrides, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, new_plan_id=new_plan_id, new_price_id=new_price_id, pay_in_advance=pay_in_advance, @@ -778,6 +834,7 @@ async def preview_checkout_internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -798,6 +855,8 @@ async def preview_checkout_internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -826,6 +885,7 @@ async def preview_checkout_internal( from schematic import ( AsyncSchematic, + CheckoutFieldValue, UpdateAddOnRequestBody, UpdateAutoTopupOverrideRequestBody, UpdateCreditBundleRequestBody, @@ -857,6 +917,12 @@ async def main() -> None: quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], new_plan_id="new_plan_id", new_price_id="new_price_id", pay_in_advance=[ @@ -876,6 +942,7 @@ async def main() -> None: auto_topup_overrides=auto_topup_overrides, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, new_plan_id=new_plan_id, new_price_id=new_price_id, pay_in_advance=pay_in_advance, @@ -893,6 +960,7 @@ async def manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -914,6 +982,8 @@ async def manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -950,6 +1020,7 @@ async def manage_plan( from schematic import ( AsyncSchematic, + CheckoutFieldValue, PlanSelection, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody, @@ -974,6 +1045,12 @@ async def main() -> None: quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -989,6 +1066,7 @@ async def main() -> None: add_on_selections=add_on_selections, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, pay_in_advance_entitlements=pay_in_advance_entitlements, base_plan_id=base_plan_id, base_plan_price_id=base_plan_price_id, @@ -1009,6 +1087,7 @@ async def preview_manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -1030,6 +1109,8 @@ async def preview_manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -1066,6 +1147,7 @@ async def preview_manage_plan( from schematic import ( AsyncSchematic, + CheckoutFieldValue, PlanSelection, UpdateCreditBundleRequestBody, UpdatePayInAdvanceRequestBody, @@ -1090,6 +1172,12 @@ async def main() -> None: quantity=1000000, ) ], + custom_field_values=[ + CheckoutFieldValue( + id="id", + value="value", + ) + ], pay_in_advance_entitlements=[ UpdatePayInAdvanceRequestBody( price_id="price_id", @@ -1105,6 +1193,7 @@ async def main() -> None: add_on_selections=add_on_selections, company_id=company_id, credit_bundles=credit_bundles, + custom_field_values=custom_field_values, pay_in_advance_entitlements=pay_in_advance_entitlements, base_plan_id=base_plan_id, base_plan_price_id=base_plan_price_id, diff --git a/src/schematic/checkout/raw_client.py b/src/schematic/checkout/raw_client.py index 0134955..ed3556d 100644 --- a/src/schematic/checkout/raw_client.py +++ b/src/schematic/checkout/raw_client.py @@ -18,6 +18,7 @@ from ..errors.not_found_error import NotFoundError from ..errors.unauthorized_error import UnauthorizedError from ..types.api_error import ApiError as types_api_error_ApiError +from ..types.checkout_field_value import CheckoutFieldValue from ..types.plan_selection import PlanSelection from ..types.update_add_on_request_body import UpdateAddOnRequestBody from ..types.update_auto_topup_override_request_body import UpdateAutoTopupOverrideRequestBody @@ -47,6 +48,7 @@ def internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -67,6 +69,8 @@ def internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -106,6 +110,9 @@ def internal( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "new_plan_id": new_plan_id, "new_price_id": new_price_id, "pay_in_advance": convert_and_respect_annotation_metadata( @@ -319,6 +326,7 @@ def preview_checkout_internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -339,6 +347,8 @@ def preview_checkout_internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -378,6 +388,9 @@ def preview_checkout_internal( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "new_plan_id": new_plan_id, "new_price_id": new_price_id, "pay_in_advance": convert_and_respect_annotation_metadata( @@ -477,6 +490,7 @@ def manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -498,6 +512,8 @@ def manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -544,6 +560,9 @@ def manage_plan( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "pay_in_advance_entitlements": convert_and_respect_annotation_metadata( object_=pay_in_advance_entitlements, annotation=typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -644,6 +663,7 @@ def preview_manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -665,6 +685,8 @@ def preview_manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -711,6 +733,9 @@ def preview_manage_plan( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "pay_in_advance_entitlements": convert_and_respect_annotation_metadata( object_=pay_in_advance_entitlements, annotation=typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -1049,6 +1074,7 @@ async def internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -1069,6 +1095,8 @@ async def internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -1108,6 +1136,9 @@ async def internal( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "new_plan_id": new_plan_id, "new_price_id": new_price_id, "pay_in_advance": convert_and_respect_annotation_metadata( @@ -1321,6 +1352,7 @@ async def preview_checkout_internal( auto_topup_overrides: typing.Sequence[UpdateAutoTopupOverrideRequestBody], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], new_plan_id: str, new_price_id: str, pay_in_advance: typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -1341,6 +1373,8 @@ async def preview_checkout_internal( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + new_plan_id : str new_price_id : str @@ -1380,6 +1414,9 @@ async def preview_checkout_internal( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "new_plan_id": new_plan_id, "new_price_id": new_price_id, "pay_in_advance": convert_and_respect_annotation_metadata( @@ -1479,6 +1516,7 @@ async def manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -1500,6 +1538,8 @@ async def manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -1546,6 +1586,9 @@ async def manage_plan( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "pay_in_advance_entitlements": convert_and_respect_annotation_metadata( object_=pay_in_advance_entitlements, annotation=typing.Sequence[UpdatePayInAdvanceRequestBody], @@ -1646,6 +1689,7 @@ async def preview_manage_plan( add_on_selections: typing.Sequence[PlanSelection], company_id: str, credit_bundles: typing.Sequence[UpdateCreditBundleRequestBody], + custom_field_values: typing.Sequence[CheckoutFieldValue], pay_in_advance_entitlements: typing.Sequence[UpdatePayInAdvanceRequestBody], base_plan_id: typing.Optional[str] = OMIT, base_plan_price_id: typing.Optional[str] = OMIT, @@ -1667,6 +1711,8 @@ async def preview_manage_plan( credit_bundles : typing.Sequence[UpdateCreditBundleRequestBody] + custom_field_values : typing.Sequence[CheckoutFieldValue] + pay_in_advance_entitlements : typing.Sequence[UpdatePayInAdvanceRequestBody] base_plan_id : typing.Optional[str] @@ -1713,6 +1759,9 @@ async def preview_manage_plan( "credit_bundles": convert_and_respect_annotation_metadata( object_=credit_bundles, annotation=typing.Sequence[UpdateCreditBundleRequestBody], direction="write" ), + "custom_field_values": convert_and_respect_annotation_metadata( + object_=custom_field_values, annotation=typing.Sequence[CheckoutFieldValue], direction="write" + ), "pay_in_advance_entitlements": convert_and_respect_annotation_metadata( object_=pay_in_advance_entitlements, annotation=typing.Sequence[UpdatePayInAdvanceRequestBody], diff --git a/src/schematic/companies/client.py b/src/schematic/companies/client.py index f9ef3e7..81ca507 100644 --- a/src/schematic/companies/client.py +++ b/src/schematic/companies/client.py @@ -80,6 +80,7 @@ def list_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -120,6 +121,9 @@ def list_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -179,6 +183,7 @@ def list_companies( plan_id="plan_id", plan_ids=["plan_ids"], plan_version_id="plan_version_id", + plan_version_ids=["plan_version_ids"], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -201,6 +206,7 @@ def list_companies( plan_id=plan_id, plan_ids=plan_ids, plan_version_id=plan_version_id, + plan_version_ids=plan_version_ids, q=q, sort_order_column=sort_order_column, sort_order_direction=sort_order_direction, @@ -365,6 +371,7 @@ def count_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -405,6 +412,9 @@ def count_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -464,6 +474,7 @@ def count_companies( plan_id="plan_id", plan_ids=["plan_ids"], plan_version_id="plan_version_id", + plan_version_ids=["plan_version_ids"], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -486,6 +497,7 @@ def count_companies( plan_id=plan_id, plan_ids=plan_ids, plan_version_id=plan_version_id, + plan_version_ids=plan_version_ids, q=q, sort_order_column=sort_order_column, sort_order_direction=sort_order_direction, @@ -2068,6 +2080,7 @@ async def list_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -2108,6 +2121,9 @@ async def list_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -2172,6 +2188,7 @@ async def main() -> None: plan_id="plan_id", plan_ids=["plan_ids"], plan_version_id="plan_version_id", + plan_version_ids=["plan_version_ids"], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -2197,6 +2214,7 @@ async def main() -> None: plan_id=plan_id, plan_ids=plan_ids, plan_version_id=plan_version_id, + plan_version_ids=plan_version_ids, q=q, sort_order_column=sort_order_column, sort_order_direction=sort_order_direction, @@ -2385,6 +2403,7 @@ async def count_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -2425,6 +2444,9 @@ async def count_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -2489,6 +2511,7 @@ async def main() -> None: plan_id="plan_id", plan_ids=["plan_ids"], plan_version_id="plan_version_id", + plan_version_ids=["plan_version_ids"], q="q", sort_order_column="sort_order_column", sort_order_direction="asc", @@ -2514,6 +2537,7 @@ async def main() -> None: plan_id=plan_id, plan_ids=plan_ids, plan_version_id=plan_version_id, + plan_version_ids=plan_version_ids, q=q, sort_order_column=sort_order_column, sort_order_direction=sort_order_direction, diff --git a/src/schematic/companies/raw_client.py b/src/schematic/companies/raw_client.py index 4e14395..1da3685 100644 --- a/src/schematic/companies/raw_client.py +++ b/src/schematic/companies/raw_client.py @@ -82,6 +82,7 @@ def list_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -122,6 +123,9 @@ def list_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -177,6 +181,7 @@ def list_companies( "plan_id": plan_id, "plan_ids": plan_ids, "plan_version_id": plan_version_id, + "plan_version_ids": plan_version_ids, "q": q, "sort_order_column": sort_order_column, "sort_order_direction": sort_order_direction, @@ -618,6 +623,7 @@ def count_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -658,6 +664,9 @@ def count_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -713,6 +722,7 @@ def count_companies( "plan_id": plan_id, "plan_ids": plan_ids, "plan_version_id": plan_version_id, + "plan_version_ids": plan_version_ids, "q": q, "sort_order_column": sort_order_column, "sort_order_direction": sort_order_direction, @@ -4457,6 +4467,7 @@ async def list_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -4497,6 +4508,9 @@ async def list_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -4552,6 +4566,7 @@ async def list_companies( "plan_id": plan_id, "plan_ids": plan_ids, "plan_version_id": plan_version_id, + "plan_version_ids": plan_version_ids, "q": q, "sort_order_column": sort_order_column, "sort_order_direction": sort_order_direction, @@ -4993,6 +5008,7 @@ async def count_companies( plan_id: typing.Optional[str] = None, plan_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, plan_version_id: typing.Optional[str] = None, + plan_version_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, q: typing.Optional[str] = None, sort_order_column: typing.Optional[str] = None, sort_order_direction: typing.Optional[SortDirection] = None, @@ -5033,6 +5049,9 @@ async def count_companies( plan_version_id : typing.Optional[str] Filter companies by plan version ID (starts with plvr_) + plan_version_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + q : typing.Optional[str] Search for companies by name, keys or string traits @@ -5088,6 +5107,7 @@ async def count_companies( "plan_id": plan_id, "plan_ids": plan_ids, "plan_version_id": plan_version_id, + "plan_version_ids": plan_version_ids, "q": q, "sort_order_column": sort_order_column, "sort_order_direction": sort_order_direction, diff --git a/src/schematic/companies/types/count_companies_params.py b/src/schematic/companies/types/count_companies_params.py index 047ea93..8a38f08 100644 --- a/src/schematic/companies/types/count_companies_params.py +++ b/src/schematic/companies/types/count_companies_params.py @@ -59,6 +59,11 @@ class CountCompaniesParams(UniversalBaseModel): Filter companies by plan version ID (starts with plvr_) """ + plan_version_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + """ + q: typing.Optional[str] = pydantic.Field(default=None) """ Search for companies by name, keys or string traits diff --git a/src/schematic/companies/types/list_companies_params.py b/src/schematic/companies/types/list_companies_params.py index b244c97..3693cde 100644 --- a/src/schematic/companies/types/list_companies_params.py +++ b/src/schematic/companies/types/list_companies_params.py @@ -59,6 +59,11 @@ class ListCompaniesParams(UniversalBaseModel): Filter companies by plan version ID (starts with plvr_) """ + plan_version_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + Filter companies by one or more plan version IDs (each ID starts with plvr_). Takes precedence over plan_version_id when set. + """ + q: typing.Optional[str] = pydantic.Field(default=None) """ Search for companies by name, keys or string traits diff --git a/src/schematic/core/client_wrapper.py b/src/schematic/core/client_wrapper.py index a9df43a..25d1e4d 100644 --- a/src/schematic/core/client_wrapper.py +++ b/src/schematic/core/client_wrapper.py @@ -27,12 +27,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "schematichq/1.2.2", + "User-Agent": "schematichq/1.2.3", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "schematichq", - "X-Fern-SDK-Version": "1.2.2", + "X-Fern-SDK-Version": "1.2.3", **(self.get_custom_headers() or {}), } headers["X-Schematic-Api-Key"] = self.api_key diff --git a/src/schematic/credits/__init__.py b/src/schematic/credits/__init__.py index 67a9887..9661479 100644 --- a/src/schematic/credits/__init__.py +++ b/src/schematic/credits/__init__.py @@ -7,6 +7,7 @@ if typing.TYPE_CHECKING: from .types import ( + AcquireCreditLeaseResponse, CountBillingCreditsGrantsParams, CountBillingCreditsGrantsResponse, CountBillingCreditsParams, @@ -27,6 +28,7 @@ DeleteBillingPlanCreditGrantParams, DeleteBillingPlanCreditGrantResponse, DeleteCreditBundleResponse, + ExtendCreditLeaseResponse, GetCreditBundleResponse, GetEnrichedCreditLedgerParams, GetEnrichedCreditLedgerResponse, @@ -47,6 +49,7 @@ ListCreditEventLedgerResponse, ListGrantsForCreditParams, ListGrantsForCreditResponse, + ReleaseCreditLeaseResponse, SoftDeleteBillingCreditResponse, UpdateBillingCreditResponse, UpdateBillingPlanCreditGrantResponse, @@ -54,6 +57,7 @@ ZeroOutGrantResponse, ) _dynamic_imports: typing.Dict[str, str] = { + "AcquireCreditLeaseResponse": ".types", "CountBillingCreditsGrantsParams": ".types", "CountBillingCreditsGrantsResponse": ".types", "CountBillingCreditsParams": ".types", @@ -74,6 +78,7 @@ "DeleteBillingPlanCreditGrantParams": ".types", "DeleteBillingPlanCreditGrantResponse": ".types", "DeleteCreditBundleResponse": ".types", + "ExtendCreditLeaseResponse": ".types", "GetCreditBundleResponse": ".types", "GetEnrichedCreditLedgerParams": ".types", "GetEnrichedCreditLedgerResponse": ".types", @@ -94,6 +99,7 @@ "ListCreditEventLedgerResponse": ".types", "ListGrantsForCreditParams": ".types", "ListGrantsForCreditResponse": ".types", + "ReleaseCreditLeaseResponse": ".types", "SoftDeleteBillingCreditResponse": ".types", "UpdateBillingCreditResponse": ".types", "UpdateBillingPlanCreditGrantResponse": ".types", @@ -124,6 +130,7 @@ def __dir__(): __all__ = [ + "AcquireCreditLeaseResponse", "CountBillingCreditsGrantsParams", "CountBillingCreditsGrantsResponse", "CountBillingCreditsParams", @@ -144,6 +151,7 @@ def __dir__(): "DeleteBillingPlanCreditGrantParams", "DeleteBillingPlanCreditGrantResponse", "DeleteCreditBundleResponse", + "ExtendCreditLeaseResponse", "GetCreditBundleResponse", "GetEnrichedCreditLedgerParams", "GetEnrichedCreditLedgerResponse", @@ -164,6 +172,7 @@ def __dir__(): "ListCreditEventLedgerResponse", "ListGrantsForCreditParams", "ListGrantsForCreditResponse", + "ReleaseCreditLeaseResponse", "SoftDeleteBillingCreditResponse", "UpdateBillingCreditResponse", "UpdateBillingPlanCreditGrantResponse", diff --git a/src/schematic/credits/client.py b/src/schematic/credits/client.py index 8cc0234..641e3f2 100644 --- a/src/schematic/credits/client.py +++ b/src/schematic/credits/client.py @@ -22,8 +22,10 @@ from ..types.credit_event_type import CreditEventType from ..types.credit_grant_sort_order import CreditGrantSortOrder from ..types.credit_ledger_period import CreditLedgerPeriod +from ..types.release_credit_lease_request_body import ReleaseCreditLeaseRequestBody from ..types.sort_direction import SortDirection from .raw_client import AsyncRawCreditsClient, RawCreditsClient +from .types.acquire_credit_lease_response import AcquireCreditLeaseResponse from .types.count_billing_credits_grants_response import CountBillingCreditsGrantsResponse from .types.count_billing_credits_response import CountBillingCreditsResponse from .types.count_billing_plan_credit_grants_response import CountBillingPlanCreditGrantsResponse @@ -36,6 +38,7 @@ from .types.create_credit_bundle_response import CreateCreditBundleResponse from .types.delete_billing_plan_credit_grant_response import DeleteBillingPlanCreditGrantResponse from .types.delete_credit_bundle_response import DeleteCreditBundleResponse +from .types.extend_credit_lease_response import ExtendCreditLeaseResponse from .types.get_credit_bundle_response import GetCreditBundleResponse from .types.get_enriched_credit_ledger_response import GetEnrichedCreditLedgerResponse from .types.get_single_billing_credit_response import GetSingleBillingCreditResponse @@ -48,6 +51,7 @@ from .types.list_credit_bundles_response import ListCreditBundlesResponse from .types.list_credit_event_ledger_response import ListCreditEventLedgerResponse from .types.list_grants_for_credit_response import ListGrantsForCreditResponse +from .types.release_credit_lease_response import ReleaseCreditLeaseResponse from .types.soft_delete_billing_credit_response import SoftDeleteBillingCreditResponse from .types.update_billing_credit_response import UpdateBillingCreditResponse from .types.update_billing_plan_credit_grant_response import UpdateBillingPlanCreditGrantResponse @@ -1106,6 +1110,137 @@ def list_grants_for_credit( ) return _response.data + def acquire_credit_lease( + self, + *, + company_id: str, + credit_type_id: str, + requested_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AcquireCreditLeaseResponse: + """ + Parameters + ---------- + company_id : str + + credit_type_id : str + + requested_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AcquireCreditLeaseResponse + Created + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.credits.acquire_credit_lease( + company_id="company_id", + credit_type_id="credit_type_id", + requested_amount=1.1, + ) + """ + _response = self._raw_client.acquire_credit_lease( + company_id=company_id, + credit_type_id=credit_type_id, + requested_amount=requested_amount, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data + + def extend_credit_lease( + self, + lease_id: str, + *, + additional_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> ExtendCreditLeaseResponse: + """ + Parameters + ---------- + lease_id : str + lease_id + + additional_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + ExtendCreditLeaseResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.credits.extend_credit_lease( + lease_id="lease_id", + additional_amount=1.1, + ) + """ + _response = self._raw_client.extend_credit_lease( + lease_id, additional_amount=additional_amount, expires_at=expires_at, request_options=request_options + ) + return _response.data + + def release_credit_lease( + self, + lease_id: str, + *, + request: ReleaseCreditLeaseRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> ReleaseCreditLeaseResponse: + """ + Parameters + ---------- + lease_id : str + lease_id + + request : ReleaseCreditLeaseRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + ReleaseCreditLeaseResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.credits.release_credit_lease( + lease_id="lease_id", + request={"key": "value"}, + ) + """ + _response = self._raw_client.release_credit_lease(lease_id, request=request, request_options=request_options) + return _response.data + def get_enriched_credit_ledger( self, *, @@ -1348,6 +1483,7 @@ def create_billing_plan_credit_grant( expiry_unit_count: typing.Optional[int] = OMIT, plan_version_id: typing.Optional[str] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> CreateBillingPlanCreditGrantResponse: """ @@ -1393,6 +1529,9 @@ def create_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. Defaults to 0. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1437,6 +1576,7 @@ def create_billing_plan_credit_grant( expiry_unit_count=expiry_unit_count, plan_version_id=plan_version_id, reset_type=reset_type, + rollover_percentage=rollover_percentage, request_options=request_options, ) return _response.data @@ -1495,6 +1635,7 @@ def update_billing_plan_credit_grant( expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, expiry_unit_count: typing.Optional[int] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> UpdateBillingPlanCreditGrantResponse: """ @@ -1537,6 +1678,9 @@ def update_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1577,6 +1721,7 @@ def update_billing_plan_credit_grant( expiry_unit=expiry_unit, expiry_unit_count=expiry_unit_count, reset_type=reset_type, + rollover_percentage=rollover_percentage, request_options=request_options, ) return _response.data @@ -3041,6 +3186,163 @@ async def main() -> None: ) return _response.data + async def acquire_credit_lease( + self, + *, + company_id: str, + credit_type_id: str, + requested_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AcquireCreditLeaseResponse: + """ + Parameters + ---------- + company_id : str + + credit_type_id : str + + requested_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AcquireCreditLeaseResponse + Created + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.credits.acquire_credit_lease( + company_id="company_id", + credit_type_id="credit_type_id", + requested_amount=1.1, + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.acquire_credit_lease( + company_id=company_id, + credit_type_id=credit_type_id, + requested_amount=requested_amount, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data + + async def extend_credit_lease( + self, + lease_id: str, + *, + additional_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> ExtendCreditLeaseResponse: + """ + Parameters + ---------- + lease_id : str + lease_id + + additional_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + ExtendCreditLeaseResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.credits.extend_credit_lease( + lease_id="lease_id", + additional_amount=1.1, + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.extend_credit_lease( + lease_id, additional_amount=additional_amount, expires_at=expires_at, request_options=request_options + ) + return _response.data + + async def release_credit_lease( + self, + lease_id: str, + *, + request: ReleaseCreditLeaseRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> ReleaseCreditLeaseResponse: + """ + Parameters + ---------- + lease_id : str + lease_id + + request : ReleaseCreditLeaseRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + ReleaseCreditLeaseResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.credits.release_credit_lease( + lease_id="lease_id", + request={"key": "value"}, + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.release_credit_lease( + lease_id, request=request, request_options=request_options + ) + return _response.data + async def get_enriched_credit_ledger( self, *, @@ -3307,6 +3609,7 @@ async def create_billing_plan_credit_grant( expiry_unit_count: typing.Optional[int] = OMIT, plan_version_id: typing.Optional[str] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> CreateBillingPlanCreditGrantResponse: """ @@ -3352,6 +3655,9 @@ async def create_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. Defaults to 0. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -3404,6 +3710,7 @@ async def main() -> None: expiry_unit_count=expiry_unit_count, plan_version_id=plan_version_id, reset_type=reset_type, + rollover_percentage=rollover_percentage, request_options=request_options, ) return _response.data @@ -3470,6 +3777,7 @@ async def update_billing_plan_credit_grant( expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, expiry_unit_count: typing.Optional[int] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> UpdateBillingPlanCreditGrantResponse: """ @@ -3512,6 +3820,9 @@ async def update_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -3560,6 +3871,7 @@ async def main() -> None: expiry_unit=expiry_unit, expiry_unit_count=expiry_unit_count, reset_type=reset_type, + rollover_percentage=rollover_percentage, request_options=request_options, ) return _response.data diff --git a/src/schematic/credits/raw_client.py b/src/schematic/credits/raw_client.py index e745709..6814dab 100644 --- a/src/schematic/credits/raw_client.py +++ b/src/schematic/credits/raw_client.py @@ -35,7 +35,9 @@ from ..types.credit_event_type import CreditEventType from ..types.credit_grant_sort_order import CreditGrantSortOrder from ..types.credit_ledger_period import CreditLedgerPeriod +from ..types.release_credit_lease_request_body import ReleaseCreditLeaseRequestBody from ..types.sort_direction import SortDirection +from .types.acquire_credit_lease_response import AcquireCreditLeaseResponse from .types.count_billing_credits_grants_response import CountBillingCreditsGrantsResponse from .types.count_billing_credits_response import CountBillingCreditsResponse from .types.count_billing_plan_credit_grants_response import CountBillingPlanCreditGrantsResponse @@ -48,6 +50,7 @@ from .types.create_credit_bundle_response import CreateCreditBundleResponse from .types.delete_billing_plan_credit_grant_response import DeleteBillingPlanCreditGrantResponse from .types.delete_credit_bundle_response import DeleteCreditBundleResponse +from .types.extend_credit_lease_response import ExtendCreditLeaseResponse from .types.get_credit_bundle_response import GetCreditBundleResponse from .types.get_enriched_credit_ledger_response import GetEnrichedCreditLedgerResponse from .types.get_single_billing_credit_response import GetSingleBillingCreditResponse @@ -60,6 +63,7 @@ from .types.list_credit_bundles_response import ListCreditBundlesResponse from .types.list_credit_event_ledger_response import ListCreditEventLedgerResponse from .types.list_grants_for_credit_response import ListGrantsForCreditResponse +from .types.release_credit_lease_response import ReleaseCreditLeaseResponse from .types.soft_delete_billing_credit_response import SoftDeleteBillingCreditResponse from .types.update_billing_credit_response import UpdateBillingCreditResponse from .types.update_billing_plan_credit_grant_response import UpdateBillingPlanCreditGrantResponse @@ -2425,6 +2429,355 @@ def list_grants_for_credit( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def acquire_credit_lease( + self, + *, + company_id: str, + credit_type_id: str, + requested_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[AcquireCreditLeaseResponse]: + """ + Parameters + ---------- + company_id : str + + credit_type_id : str + + requested_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[AcquireCreditLeaseResponse] + Created + """ + _response = self._client_wrapper.httpx_client.request( + "billing/credits/lease", + method="POST", + json={ + "company_id": company_id, + "credit_type_id": credit_type_id, + "expires_at": expires_at, + "requested_amount": requested_amount, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + AcquireCreditLeaseResponse, + parse_obj_as( + type_=AcquireCreditLeaseResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def extend_credit_lease( + self, + lease_id: str, + *, + additional_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[ExtendCreditLeaseResponse]: + """ + Parameters + ---------- + lease_id : str + lease_id + + additional_amount : float + + expires_at : typing.Optional[dt.datetime] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[ExtendCreditLeaseResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"billing/credits/lease/{jsonable_encoder(lease_id)}/extend", + method="PUT", + json={ + "additional_amount": additional_amount, + "expires_at": expires_at, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + ExtendCreditLeaseResponse, + parse_obj_as( + type_=ExtendCreditLeaseResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def release_credit_lease( + self, + lease_id: str, + *, + request: ReleaseCreditLeaseRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[ReleaseCreditLeaseResponse]: + """ + Parameters + ---------- + lease_id : str + lease_id + + request : ReleaseCreditLeaseRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[ReleaseCreditLeaseResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"billing/credits/lease/{jsonable_encoder(lease_id)}/release", + method="PUT", + json=request, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + ReleaseCreditLeaseResponse, + parse_obj_as( + type_=ReleaseCreditLeaseResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def get_enriched_credit_ledger( self, *, @@ -2853,6 +3206,7 @@ def create_billing_plan_credit_grant( expiry_unit_count: typing.Optional[int] = OMIT, plan_version_id: typing.Optional[str] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[CreateBillingPlanCreditGrantResponse]: """ @@ -2898,6 +3252,9 @@ def create_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. Defaults to 0. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -2930,6 +3287,7 @@ def create_billing_plan_credit_grant( "reset_cadence": reset_cadence, "reset_start": reset_start, "reset_type": reset_type, + "rollover_percentage": rollover_percentage, }, headers={ "content-type": "application/json", @@ -3125,6 +3483,7 @@ def update_billing_plan_credit_grant( expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, expiry_unit_count: typing.Optional[int] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[UpdateBillingPlanCreditGrantResponse]: """ @@ -3167,6 +3526,9 @@ def update_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -3196,6 +3558,7 @@ def update_billing_plan_credit_grant( "reset_cadence": reset_cadence, "reset_start": reset_start, "reset_type": reset_type, + "rollover_percentage": rollover_percentage, }, headers={ "content-type": "application/json", @@ -3919,10 +4282,260 @@ async def list_billing_credits( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def create_billing_credit( + async def create_billing_credit( + self, + *, + currency: str, + description: str, + name: str, + burn_strategy: typing.Optional[BillingCreditBurnStrategy] = OMIT, + currency_prices: typing.Optional[typing.Sequence[CreditCurrencyPriceRequestBody]] = OMIT, + default_expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, + default_expiry_unit_count: typing.Optional[int] = OMIT, + default_rollover_policy: typing.Optional[BillingCreditRolloverPolicy] = OMIT, + icon: typing.Optional[str] = OMIT, + per_unit_price: typing.Optional[int] = OMIT, + per_unit_price_decimal: typing.Optional[str] = OMIT, + plural_name: typing.Optional[str] = OMIT, + singular_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[CreateBillingCreditResponse]: + """ + Parameters + ---------- + currency : str + + description : str + + name : str + + burn_strategy : typing.Optional[BillingCreditBurnStrategy] + + currency_prices : typing.Optional[typing.Sequence[CreditCurrencyPriceRequestBody]] + + default_expiry_unit : typing.Optional[BillingCreditExpiryUnit] + + default_expiry_unit_count : typing.Optional[int] + + default_rollover_policy : typing.Optional[BillingCreditRolloverPolicy] + + icon : typing.Optional[str] + + per_unit_price : typing.Optional[int] + + per_unit_price_decimal : typing.Optional[str] + + plural_name : typing.Optional[str] + + singular_name : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[CreateBillingCreditResponse] + Created + """ + _response = await self._client_wrapper.httpx_client.request( + "billing/credits", + method="POST", + json={ + "burn_strategy": burn_strategy, + "currency": currency, + "currency_prices": convert_and_respect_annotation_metadata( + object_=currency_prices, + annotation=typing.Sequence[CreditCurrencyPriceRequestBody], + direction="write", + ), + "default_expiry_unit": default_expiry_unit, + "default_expiry_unit_count": default_expiry_unit_count, + "default_rollover_policy": default_rollover_policy, + "description": description, + "icon": icon, + "name": name, + "per_unit_price": per_unit_price, + "per_unit_price_decimal": per_unit_price_decimal, + "plural_name": plural_name, + "singular_name": singular_name, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + CreateBillingCreditResponse, + parse_obj_as( + type_=CreateBillingCreditResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + async def get_single_billing_credit( + self, credit_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetSingleBillingCreditResponse]: + """ + Parameters + ---------- + credit_id : str + credit_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetSingleBillingCreditResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"billing/credits/{jsonable_encoder(credit_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetSingleBillingCreditResponse, + parse_obj_as( + type_=GetSingleBillingCreditResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + async def update_billing_credit( self, + credit_id: str, *, - currency: str, description: str, name: str, burn_strategy: typing.Optional[BillingCreditBurnStrategy] = OMIT, @@ -3936,11 +4549,12 @@ async def create_billing_credit( plural_name: typing.Optional[str] = OMIT, singular_name: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CreateBillingCreditResponse]: + ) -> AsyncHttpResponse[UpdateBillingCreditResponse]: """ Parameters ---------- - currency : str + credit_id : str + credit_id description : str @@ -3971,15 +4585,14 @@ async def create_billing_credit( Returns ------- - AsyncHttpResponse[CreateBillingCreditResponse] - Created + AsyncHttpResponse[UpdateBillingCreditResponse] + OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits", - method="POST", + f"billing/credits/{jsonable_encoder(credit_id)}", + method="PUT", json={ "burn_strategy": burn_strategy, - "currency": currency, "currency_prices": convert_and_respect_annotation_metadata( object_=currency_prices, annotation=typing.Sequence[CreditCurrencyPriceRequestBody], @@ -4005,9 +4618,9 @@ async def create_billing_credit( try: if 200 <= _response.status_code < 300: _data = typing.cast( - CreateBillingCreditResponse, + UpdateBillingCreditResponse, parse_obj_as( - type_=CreateBillingCreditResponse, # type: ignore + type_=UpdateBillingCreditResponse, # type: ignore object_=_response.json(), ), ) @@ -4080,9 +4693,9 @@ async def create_billing_credit( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def get_single_billing_credit( + async def soft_delete_billing_credit( self, credit_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[GetSingleBillingCreditResponse]: + ) -> AsyncHttpResponse[SoftDeleteBillingCreditResponse]: """ Parameters ---------- @@ -4094,24 +4707,137 @@ async def get_single_billing_credit( Returns ------- - AsyncHttpResponse[GetSingleBillingCreditResponse] + AsyncHttpResponse[SoftDeleteBillingCreditResponse] OK """ _response = await self._client_wrapper.httpx_client.request( f"billing/credits/{jsonable_encoder(credit_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SoftDeleteBillingCreditResponse, + parse_obj_as( + type_=SoftDeleteBillingCreditResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + async def list_company_credit_balances( + self, *, company_id: str, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[ListCompanyCreditBalancesResponse]: + """ + Parameters + ---------- + company_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[ListCompanyCreditBalancesResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + "billing/credits/balance", method="GET", + params={ + "company_id": company_id, + }, request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GetSingleBillingCreditResponse, + ListCompanyCreditBalancesResponse, parse_obj_as( - type_=GetSingleBillingCreditResponse, # type: ignore + type_=ListCompanyCreditBalancesResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -4169,95 +4895,61 @@ async def get_single_billing_credit( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def update_billing_credit( + async def list_credit_bundles( self, - credit_id: str, *, - description: str, - name: str, - burn_strategy: typing.Optional[BillingCreditBurnStrategy] = OMIT, - currency_prices: typing.Optional[typing.Sequence[CreditCurrencyPriceRequestBody]] = OMIT, - default_expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, - default_expiry_unit_count: typing.Optional[int] = OMIT, - default_rollover_policy: typing.Optional[BillingCreditRolloverPolicy] = OMIT, - icon: typing.Optional[str] = OMIT, - per_unit_price: typing.Optional[int] = OMIT, - per_unit_price_decimal: typing.Optional[str] = OMIT, - plural_name: typing.Optional[str] = OMIT, - singular_name: typing.Optional[str] = OMIT, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + credit_id: typing.Optional[str] = None, + status: typing.Optional[BillingCreditBundleStatus] = None, + bundle_type: typing.Optional[BillingCreditBundleType] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[UpdateBillingCreditResponse]: + ) -> AsyncHttpResponse[ListCreditBundlesResponse]: """ Parameters ---------- - credit_id : str - credit_id - - description : str - - name : str - - burn_strategy : typing.Optional[BillingCreditBurnStrategy] - - currency_prices : typing.Optional[typing.Sequence[CreditCurrencyPriceRequestBody]] - - default_expiry_unit : typing.Optional[BillingCreditExpiryUnit] - - default_expiry_unit_count : typing.Optional[int] - - default_rollover_policy : typing.Optional[BillingCreditRolloverPolicy] + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] - icon : typing.Optional[str] + credit_id : typing.Optional[str] - per_unit_price : typing.Optional[int] + status : typing.Optional[BillingCreditBundleStatus] - per_unit_price_decimal : typing.Optional[str] + bundle_type : typing.Optional[BillingCreditBundleType] - plural_name : typing.Optional[str] + limit : typing.Optional[int] + Page limit (default 100) - singular_name : typing.Optional[str] + offset : typing.Optional[int] + Page offset (default 0) request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[UpdateBillingCreditResponse] + AsyncHttpResponse[ListCreditBundlesResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/{jsonable_encoder(credit_id)}", - method="PUT", - json={ - "burn_strategy": burn_strategy, - "currency_prices": convert_and_respect_annotation_metadata( - object_=currency_prices, - annotation=typing.Sequence[CreditCurrencyPriceRequestBody], - direction="write", - ), - "default_expiry_unit": default_expiry_unit, - "default_expiry_unit_count": default_expiry_unit_count, - "default_rollover_policy": default_rollover_policy, - "description": description, - "icon": icon, - "name": name, - "per_unit_price": per_unit_price, - "per_unit_price_decimal": per_unit_price_decimal, - "plural_name": plural_name, - "singular_name": singular_name, - }, - headers={ - "content-type": "application/json", + "billing/credits/bundles", + method="GET", + params={ + "ids": ids, + "credit_id": credit_id, + "status": status, + "bundle_type": bundle_type, + "limit": limit, + "offset": offset, }, request_options=request_options, - omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - UpdateBillingCreditResponse, + ListCreditBundlesResponse, parse_obj_as( - type_=UpdateBillingCreditResponse, # type: ignore + type_=ListCreditBundlesResponse, # type: ignore object_=_response.json(), ), ) @@ -4330,34 +5022,91 @@ async def update_billing_credit( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def soft_delete_billing_credit( - self, credit_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[SoftDeleteBillingCreditResponse]: + async def create_credit_bundle( + self, + *, + bundle_name: str, + credit_id: str, + currency: str, + price_per_unit: int, + bundle_type: typing.Optional[BillingCreditBundleType] = OMIT, + currency_prices: typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] = OMIT, + expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, + expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, + expiry_unit_count: typing.Optional[int] = OMIT, + price_per_unit_decimal: typing.Optional[str] = OMIT, + quantity: typing.Optional[int] = OMIT, + status: typing.Optional[BillingCreditBundleStatus] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[CreateCreditBundleResponse]: """ Parameters ---------- + bundle_name : str + credit_id : str - credit_id + + currency : str + + price_per_unit : int + + bundle_type : typing.Optional[BillingCreditBundleType] + + currency_prices : typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] + + expiry_type : typing.Optional[BillingCreditExpiryType] + + expiry_unit : typing.Optional[BillingCreditExpiryUnit] + + expiry_unit_count : typing.Optional[int] + + price_per_unit_decimal : typing.Optional[str] + + quantity : typing.Optional[int] + + status : typing.Optional[BillingCreditBundleStatus] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[SoftDeleteBillingCreditResponse] - OK + AsyncHttpResponse[CreateCreditBundleResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/{jsonable_encoder(credit_id)}", - method="DELETE", + "billing/credits/bundles", + method="POST", + json={ + "bundle_name": bundle_name, + "bundle_type": bundle_type, + "credit_id": credit_id, + "currency": currency, + "currency_prices": convert_and_respect_annotation_metadata( + object_=currency_prices, + annotation=typing.Sequence[CreditBundleCurrencyPriceRequestBody], + direction="write", + ), + "expiry_type": expiry_type, + "expiry_unit": expiry_unit, + "expiry_unit_count": expiry_unit_count, + "price_per_unit": price_per_unit, + "price_per_unit_decimal": price_per_unit_decimal, + "quantity": quantity, + "status": status, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - SoftDeleteBillingCreditResponse, + CreateCreditBundleResponse, parse_obj_as( - type_=SoftDeleteBillingCreditResponse, # type: ignore + type_=CreateCreditBundleResponse, # type: ignore object_=_response.json(), ), ) @@ -4430,51 +5179,38 @@ async def soft_delete_billing_credit( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_company_credit_balances( - self, *, company_id: str, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[ListCompanyCreditBalancesResponse]: + async def get_credit_bundle( + self, bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetCreditBundleResponse]: """ Parameters ---------- - company_id : str + bundle_id : str + bundle_id request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListCompanyCreditBalancesResponse] + AsyncHttpResponse[GetCreditBundleResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/balance", + f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", method="GET", - params={ - "company_id": company_id, - }, request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListCompanyCreditBalancesResponse, + GetCreditBundleResponse, parse_obj_as( - type_=ListCompanyCreditBalancesResponse, # type: ignore + type_=GetCreditBundleResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -4532,61 +5268,83 @@ async def list_company_credit_balances( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_credit_bundles( + async def update_credit_bundle_details( self, + bundle_id: str, *, - ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - credit_id: typing.Optional[str] = None, - status: typing.Optional[BillingCreditBundleStatus] = None, - bundle_type: typing.Optional[BillingCreditBundleType] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + bundle_name: str, + price_per_unit: int, + currency_prices: typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] = OMIT, + expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, + expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, + expiry_unit_count: typing.Optional[int] = OMIT, + price_per_unit_decimal: typing.Optional[str] = OMIT, + quantity: typing.Optional[int] = OMIT, + status: typing.Optional[BillingCreditBundleStatus] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListCreditBundlesResponse]: + ) -> AsyncHttpResponse[UpdateCreditBundleDetailsResponse]: """ Parameters ---------- - ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + bundle_id : str + bundle_id - credit_id : typing.Optional[str] + bundle_name : str - status : typing.Optional[BillingCreditBundleStatus] + price_per_unit : int - bundle_type : typing.Optional[BillingCreditBundleType] + currency_prices : typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] - limit : typing.Optional[int] - Page limit (default 100) + expiry_type : typing.Optional[BillingCreditExpiryType] - offset : typing.Optional[int] - Page offset (default 0) + expiry_unit : typing.Optional[BillingCreditExpiryUnit] + + expiry_unit_count : typing.Optional[int] + + price_per_unit_decimal : typing.Optional[str] + + quantity : typing.Optional[int] + + status : typing.Optional[BillingCreditBundleStatus] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListCreditBundlesResponse] + AsyncHttpResponse[UpdateCreditBundleDetailsResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/bundles", - method="GET", - params={ - "ids": ids, - "credit_id": credit_id, + f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", + method="PUT", + json={ + "bundle_name": bundle_name, + "currency_prices": convert_and_respect_annotation_metadata( + object_=currency_prices, + annotation=typing.Sequence[CreditBundleCurrencyPriceRequestBody], + direction="write", + ), + "expiry_type": expiry_type, + "expiry_unit": expiry_unit, + "expiry_unit_count": expiry_unit_count, + "price_per_unit": price_per_unit, + "price_per_unit_decimal": price_per_unit_decimal, + "quantity": quantity, "status": status, - "bundle_type": bundle_type, - "limit": limit, - "offset": offset, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListCreditBundlesResponse, + UpdateCreditBundleDetailsResponse, parse_obj_as( - type_=ListCreditBundlesResponse, # type: ignore + type_=UpdateCreditBundleDetailsResponse, # type: ignore object_=_response.json(), ), ) @@ -4659,91 +5417,34 @@ async def list_credit_bundles( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def create_credit_bundle( - self, - *, - bundle_name: str, - credit_id: str, - currency: str, - price_per_unit: int, - bundle_type: typing.Optional[BillingCreditBundleType] = OMIT, - currency_prices: typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] = OMIT, - expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, - expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, - expiry_unit_count: typing.Optional[int] = OMIT, - price_per_unit_decimal: typing.Optional[str] = OMIT, - quantity: typing.Optional[int] = OMIT, - status: typing.Optional[BillingCreditBundleStatus] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CreateCreditBundleResponse]: + async def delete_credit_bundle( + self, bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[DeleteCreditBundleResponse]: """ Parameters ---------- - bundle_name : str - - credit_id : str - - currency : str - - price_per_unit : int - - bundle_type : typing.Optional[BillingCreditBundleType] - - currency_prices : typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] - - expiry_type : typing.Optional[BillingCreditExpiryType] - - expiry_unit : typing.Optional[BillingCreditExpiryUnit] - - expiry_unit_count : typing.Optional[int] - - price_per_unit_decimal : typing.Optional[str] - - quantity : typing.Optional[int] - - status : typing.Optional[BillingCreditBundleStatus] + bundle_id : str + bundle_id request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[CreateCreditBundleResponse] - Created + AsyncHttpResponse[DeleteCreditBundleResponse] + OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/bundles", - method="POST", - json={ - "bundle_name": bundle_name, - "bundle_type": bundle_type, - "credit_id": credit_id, - "currency": currency, - "currency_prices": convert_and_respect_annotation_metadata( - object_=currency_prices, - annotation=typing.Sequence[CreditBundleCurrencyPriceRequestBody], - direction="write", - ), - "expiry_type": expiry_type, - "expiry_unit": expiry_unit, - "expiry_unit_count": expiry_unit_count, - "price_per_unit": price_per_unit, - "price_per_unit_decimal": price_per_unit_decimal, - "quantity": quantity, - "status": status, - }, - headers={ - "content-type": "application/json", - }, + f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", + method="DELETE", request_options=request_options, - omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - CreateCreditBundleResponse, + DeleteCreditBundleResponse, parse_obj_as( - type_=CreateCreditBundleResponse, # type: ignore + type_=DeleteCreditBundleResponse, # type: ignore object_=_response.json(), ), ) @@ -4816,38 +5517,76 @@ async def create_credit_bundle( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def get_credit_bundle( - self, bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[GetCreditBundleResponse]: + async def count_credit_bundles( + self, + *, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + credit_id: typing.Optional[str] = None, + status: typing.Optional[BillingCreditBundleStatus] = None, + bundle_type: typing.Optional[BillingCreditBundleType] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[CountCreditBundlesResponse]: """ Parameters ---------- - bundle_id : str - bundle_id + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + credit_id : typing.Optional[str] + + status : typing.Optional[BillingCreditBundleStatus] + + bundle_type : typing.Optional[BillingCreditBundleType] + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[GetCreditBundleResponse] + AsyncHttpResponse[CountCreditBundlesResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", + "billing/credits/bundles/count", method="GET", + params={ + "ids": ids, + "credit_id": credit_id, + "status": status, + "bundle_type": bundle_type, + "limit": limit, + "offset": offset, + }, request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GetCreditBundleResponse, + CountCreditBundlesResponse, parse_obj_as( - type_=GetCreditBundleResponse, # type: ignore + type_=CountCreditBundlesResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -4905,83 +5644,53 @@ async def get_credit_bundle( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def update_credit_bundle_details( + async def count_billing_credits( self, - bundle_id: str, *, - bundle_name: str, - price_per_unit: int, - currency_prices: typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] = OMIT, - expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, - expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, - expiry_unit_count: typing.Optional[int] = OMIT, - price_per_unit_decimal: typing.Optional[str] = OMIT, - quantity: typing.Optional[int] = OMIT, - status: typing.Optional[BillingCreditBundleStatus] = OMIT, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + name: typing.Optional[str] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[UpdateCreditBundleDetailsResponse]: + ) -> AsyncHttpResponse[CountBillingCreditsResponse]: """ Parameters ---------- - bundle_id : str - bundle_id - - bundle_name : str - - price_per_unit : int - - currency_prices : typing.Optional[typing.Sequence[CreditBundleCurrencyPriceRequestBody]] - - expiry_type : typing.Optional[BillingCreditExpiryType] - - expiry_unit : typing.Optional[BillingCreditExpiryUnit] - - expiry_unit_count : typing.Optional[int] + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] - price_per_unit_decimal : typing.Optional[str] + name : typing.Optional[str] - quantity : typing.Optional[int] + limit : typing.Optional[int] + Page limit (default 100) - status : typing.Optional[BillingCreditBundleStatus] + offset : typing.Optional[int] + Page offset (default 0) request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[UpdateCreditBundleDetailsResponse] + AsyncHttpResponse[CountBillingCreditsResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", - method="PUT", - json={ - "bundle_name": bundle_name, - "currency_prices": convert_and_respect_annotation_metadata( - object_=currency_prices, - annotation=typing.Sequence[CreditBundleCurrencyPriceRequestBody], - direction="write", - ), - "expiry_type": expiry_type, - "expiry_unit": expiry_unit, - "expiry_unit_count": expiry_unit_count, - "price_per_unit": price_per_unit, - "price_per_unit_decimal": price_per_unit_decimal, - "quantity": quantity, - "status": status, - }, - headers={ - "content-type": "application/json", + "billing/credits/count", + method="GET", + params={ + "ids": ids, + "name": name, + "limit": limit, + "offset": offset, }, request_options=request_options, - omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - UpdateCreditBundleDetailsResponse, + CountBillingCreditsResponse, parse_obj_as( - type_=UpdateCreditBundleDetailsResponse, # type: ignore + type_=CountBillingCreditsResponse, # type: ignore object_=_response.json(), ), ) @@ -5054,34 +5763,47 @@ async def update_credit_bundle_details( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def delete_credit_bundle( - self, bundle_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[DeleteCreditBundleResponse]: + async def zero_out_grant( + self, + grant_id: str, + *, + reason: typing.Optional[BillingCreditGrantZeroedOutReason] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[ZeroOutGrantResponse]: """ Parameters ---------- - bundle_id : str - bundle_id + grant_id : str + grant_id + + reason : typing.Optional[BillingCreditGrantZeroedOutReason] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[DeleteCreditBundleResponse] + AsyncHttpResponse[ZeroOutGrantResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/bundles/{jsonable_encoder(bundle_id)}", - method="DELETE", + f"billing/credits/grants/{jsonable_encoder(grant_id)}/zero-out", + method="PUT", + json={ + "reason": reason, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - DeleteCreditBundleResponse, + ZeroOutGrantResponse, parse_obj_as( - type_=DeleteCreditBundleResponse, # type: ignore + type_=ZeroOutGrantResponse, # type: ignore object_=_response.json(), ), ) @@ -5154,61 +5876,87 @@ async def delete_credit_bundle( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def count_credit_bundles( + async def grant_billing_credits_to_company( self, *, - ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - credit_id: typing.Optional[str] = None, - status: typing.Optional[BillingCreditBundleStatus] = None, - bundle_type: typing.Optional[BillingCreditBundleType] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + company_id: str, + credit_id: str, + quantity: int, + reason: BillingCreditGrantReason, + billing_periods_count: typing.Optional[int] = OMIT, + currency: typing.Optional[str] = OMIT, + expires_at: typing.Optional[dt.datetime] = OMIT, + expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, + expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, + expiry_unit_count: typing.Optional[int] = OMIT, + renewal_enabled: typing.Optional[bool] = OMIT, + renewal_period: typing.Optional[BillingPlanCreditGrantResetStart] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CountCreditBundlesResponse]: + ) -> AsyncHttpResponse[GrantBillingCreditsToCompanyResponse]: """ Parameters ---------- - ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + company_id : str - credit_id : typing.Optional[str] + credit_id : str - status : typing.Optional[BillingCreditBundleStatus] + quantity : int - bundle_type : typing.Optional[BillingCreditBundleType] + reason : BillingCreditGrantReason - limit : typing.Optional[int] - Page limit (default 100) + billing_periods_count : typing.Optional[int] - offset : typing.Optional[int] - Page offset (default 0) + currency : typing.Optional[str] + + expires_at : typing.Optional[dt.datetime] + + expiry_type : typing.Optional[BillingCreditExpiryType] + + expiry_unit : typing.Optional[BillingCreditExpiryUnit] + + expiry_unit_count : typing.Optional[int] + + renewal_enabled : typing.Optional[bool] + + renewal_period : typing.Optional[BillingPlanCreditGrantResetStart] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[CountCreditBundlesResponse] - OK + AsyncHttpResponse[GrantBillingCreditsToCompanyResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/bundles/count", - method="GET", - params={ - "ids": ids, + "billing/credits/grants/company", + method="POST", + json={ + "billing_periods_count": billing_periods_count, + "company_id": company_id, "credit_id": credit_id, - "status": status, - "bundle_type": bundle_type, - "limit": limit, - "offset": offset, + "currency": currency, + "expires_at": expires_at, + "expiry_type": expiry_type, + "expiry_unit": expiry_unit, + "expiry_unit_count": expiry_unit_count, + "quantity": quantity, + "reason": reason, + "renewal_enabled": renewal_enabled, + "renewal_period": renewal_period, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountCreditBundlesResponse, + GrantBillingCreditsToCompanyResponse, parse_obj_as( - type_=CountCreditBundlesResponse, # type: ignore + type_=GrantBillingCreditsToCompanyResponse, # type: ignore object_=_response.json(), ), ) @@ -5281,21 +6029,24 @@ async def count_credit_bundles( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def count_billing_credits( + async def count_company_grants( self, *, - ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - name: typing.Optional[str] = None, + company_id: typing.Optional[str] = None, + order: typing.Optional[CreditGrantSortOrder] = None, + dir: typing.Optional[SortDirection] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CountBillingCreditsResponse]: + ) -> AsyncHttpResponse[CountCompanyGrantsResponse]: """ Parameters ---------- - ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + company_id : typing.Optional[str] - name : typing.Optional[str] + order : typing.Optional[CreditGrantSortOrder] + + dir : typing.Optional[SortDirection] limit : typing.Optional[int] Page limit (default 100) @@ -5308,15 +6059,16 @@ async def count_billing_credits( Returns ------- - AsyncHttpResponse[CountBillingCreditsResponse] + AsyncHttpResponse[CountCompanyGrantsResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/count", + "billing/credits/grants/company/count", method="GET", params={ - "ids": ids, - "name": name, + "company_id": company_id, + "order": order, + "dir": dir, "limit": limit, "offset": offset, }, @@ -5325,9 +6077,9 @@ async def count_billing_credits( try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountBillingCreditsResponse, + CountCompanyGrantsResponse, parse_obj_as( - type_=CountBillingCreditsResponse, # type: ignore + type_=CountCompanyGrantsResponse, # type: ignore object_=_response.json(), ), ) @@ -5400,47 +6152,57 @@ async def count_billing_credits( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def zero_out_grant( + async def list_company_grants( self, - grant_id: str, *, - reason: typing.Optional[BillingCreditGrantZeroedOutReason] = OMIT, + company_id: typing.Optional[str] = None, + order: typing.Optional[CreditGrantSortOrder] = None, + dir: typing.Optional[SortDirection] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ZeroOutGrantResponse]: + ) -> AsyncHttpResponse[ListCompanyGrantsResponse]: """ Parameters ---------- - grant_id : str - grant_id + company_id : typing.Optional[str] - reason : typing.Optional[BillingCreditGrantZeroedOutReason] + order : typing.Optional[CreditGrantSortOrder] + + dir : typing.Optional[SortDirection] + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ZeroOutGrantResponse] + AsyncHttpResponse[ListCompanyGrantsResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"billing/credits/grants/{jsonable_encoder(grant_id)}/zero-out", - method="PUT", - json={ - "reason": reason, - }, - headers={ - "content-type": "application/json", + "billing/credits/grants/company/list", + method="GET", + params={ + "company_id": company_id, + "order": order, + "dir": dir, + "limit": limit, + "offset": offset, }, request_options=request_options, - omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ZeroOutGrantResponse, + ListCompanyGrantsResponse, parse_obj_as( - type_=ZeroOutGrantResponse, # type: ignore + type_=ListCompanyGrantsResponse, # type: ignore object_=_response.json(), ), ) @@ -5513,87 +6275,53 @@ async def zero_out_grant( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def grant_billing_credits_to_company( + async def count_billing_credits_grants( self, *, - company_id: str, - credit_id: str, - quantity: int, - reason: BillingCreditGrantReason, - billing_periods_count: typing.Optional[int] = OMIT, - currency: typing.Optional[str] = OMIT, - expires_at: typing.Optional[dt.datetime] = OMIT, - expiry_type: typing.Optional[BillingCreditExpiryType] = OMIT, - expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, - expiry_unit_count: typing.Optional[int] = OMIT, - renewal_enabled: typing.Optional[bool] = OMIT, - renewal_period: typing.Optional[BillingPlanCreditGrantResetStart] = OMIT, + credit_id: typing.Optional[str] = None, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[GrantBillingCreditsToCompanyResponse]: + ) -> AsyncHttpResponse[CountBillingCreditsGrantsResponse]: """ Parameters ---------- - company_id : str - - credit_id : str - - quantity : int - - reason : BillingCreditGrantReason - - billing_periods_count : typing.Optional[int] - - currency : typing.Optional[str] - - expires_at : typing.Optional[dt.datetime] - - expiry_type : typing.Optional[BillingCreditExpiryType] - - expiry_unit : typing.Optional[BillingCreditExpiryUnit] + credit_id : typing.Optional[str] - expiry_unit_count : typing.Optional[int] + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] - renewal_enabled : typing.Optional[bool] + limit : typing.Optional[int] + Page limit (default 100) - renewal_period : typing.Optional[BillingPlanCreditGrantResetStart] + offset : typing.Optional[int] + Page offset (default 0) request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[GrantBillingCreditsToCompanyResponse] - Created + AsyncHttpResponse[CountBillingCreditsGrantsResponse] + OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/grants/company", - method="POST", - json={ - "billing_periods_count": billing_periods_count, - "company_id": company_id, + "billing/credits/grants/count", + method="GET", + params={ "credit_id": credit_id, - "currency": currency, - "expires_at": expires_at, - "expiry_type": expiry_type, - "expiry_unit": expiry_unit, - "expiry_unit_count": expiry_unit_count, - "quantity": quantity, - "reason": reason, - "renewal_enabled": renewal_enabled, - "renewal_period": renewal_period, - }, - headers={ - "content-type": "application/json", + "ids": ids, + "limit": limit, + "offset": offset, }, request_options=request_options, - omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GrantBillingCreditsToCompanyResponse, + CountBillingCreditsGrantsResponse, parse_obj_as( - type_=GrantBillingCreditsToCompanyResponse, # type: ignore + type_=CountBillingCreditsGrantsResponse, # type: ignore object_=_response.json(), ), ) @@ -5666,24 +6394,21 @@ async def grant_billing_credits_to_company( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def count_company_grants( + async def list_grants_for_credit( self, *, - company_id: typing.Optional[str] = None, - order: typing.Optional[CreditGrantSortOrder] = None, - dir: typing.Optional[SortDirection] = None, + credit_id: typing.Optional[str] = None, + ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CountCompanyGrantsResponse]: + ) -> AsyncHttpResponse[ListGrantsForCreditResponse]: """ Parameters ---------- - company_id : typing.Optional[str] - - order : typing.Optional[CreditGrantSortOrder] + credit_id : typing.Optional[str] - dir : typing.Optional[SortDirection] + ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] limit : typing.Optional[int] Page limit (default 100) @@ -5696,16 +6421,15 @@ async def count_company_grants( Returns ------- - AsyncHttpResponse[CountCompanyGrantsResponse] + AsyncHttpResponse[ListGrantsForCreditResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/grants/company/count", + "billing/credits/grants/list", method="GET", params={ - "company_id": company_id, - "order": order, - "dir": dir, + "credit_id": credit_id, + "ids": ids, "limit": limit, "offset": offset, }, @@ -5714,9 +6438,9 @@ async def count_company_grants( try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountCompanyGrantsResponse, + ListGrantsForCreditResponse, parse_obj_as( - type_=CountCompanyGrantsResponse, # type: ignore + type_=ListGrantsForCreditResponse, # type: ignore object_=_response.json(), ), ) @@ -5789,57 +6513,55 @@ async def count_company_grants( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_company_grants( + async def acquire_credit_lease( self, *, - company_id: typing.Optional[str] = None, - order: typing.Optional[CreditGrantSortOrder] = None, - dir: typing.Optional[SortDirection] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + company_id: str, + credit_type_id: str, + requested_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListCompanyGrantsResponse]: + ) -> AsyncHttpResponse[AcquireCreditLeaseResponse]: """ Parameters ---------- - company_id : typing.Optional[str] - - order : typing.Optional[CreditGrantSortOrder] + company_id : str - dir : typing.Optional[SortDirection] + credit_type_id : str - limit : typing.Optional[int] - Page limit (default 100) + requested_amount : float - offset : typing.Optional[int] - Page offset (default 0) + expires_at : typing.Optional[dt.datetime] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListCompanyGrantsResponse] - OK + AsyncHttpResponse[AcquireCreditLeaseResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/grants/company/list", - method="GET", - params={ + "billing/credits/lease", + method="POST", + json={ "company_id": company_id, - "order": order, - "dir": dir, - "limit": limit, - "offset": offset, + "credit_type_id": credit_type_id, + "expires_at": expires_at, + "requested_amount": requested_amount, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListCompanyGrantsResponse, + AcquireCreditLeaseResponse, parse_obj_as( - type_=ListCompanyGrantsResponse, # type: ignore + type_=AcquireCreditLeaseResponse, # type: ignore object_=_response.json(), ), ) @@ -5912,53 +6634,51 @@ async def list_company_grants( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def count_billing_credits_grants( + async def extend_credit_lease( self, + lease_id: str, *, - credit_id: typing.Optional[str] = None, - ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + additional_amount: float, + expires_at: typing.Optional[dt.datetime] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CountBillingCreditsGrantsResponse]: + ) -> AsyncHttpResponse[ExtendCreditLeaseResponse]: """ Parameters ---------- - credit_id : typing.Optional[str] - - ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + lease_id : str + lease_id - limit : typing.Optional[int] - Page limit (default 100) + additional_amount : float - offset : typing.Optional[int] - Page offset (default 0) + expires_at : typing.Optional[dt.datetime] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[CountBillingCreditsGrantsResponse] + AsyncHttpResponse[ExtendCreditLeaseResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/grants/count", - method="GET", - params={ - "credit_id": credit_id, - "ids": ids, - "limit": limit, - "offset": offset, + f"billing/credits/lease/{jsonable_encoder(lease_id)}/extend", + method="PUT", + json={ + "additional_amount": additional_amount, + "expires_at": expires_at, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountBillingCreditsGrantsResponse, + ExtendCreditLeaseResponse, parse_obj_as( - type_=CountBillingCreditsGrantsResponse, # type: ignore + type_=ExtendCreditLeaseResponse, # type: ignore object_=_response.json(), ), ) @@ -6031,53 +6751,45 @@ async def count_billing_credits_grants( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_grants_for_credit( + async def release_credit_lease( self, + lease_id: str, *, - credit_id: typing.Optional[str] = None, - ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + request: ReleaseCreditLeaseRequestBody, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListGrantsForCreditResponse]: + ) -> AsyncHttpResponse[ReleaseCreditLeaseResponse]: """ Parameters ---------- - credit_id : typing.Optional[str] - - ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] - - limit : typing.Optional[int] - Page limit (default 100) + lease_id : str + lease_id - offset : typing.Optional[int] - Page offset (default 0) + request : ReleaseCreditLeaseRequestBody request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListGrantsForCreditResponse] + AsyncHttpResponse[ReleaseCreditLeaseResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "billing/credits/grants/list", - method="GET", - params={ - "credit_id": credit_id, - "ids": ids, - "limit": limit, - "offset": offset, + f"billing/credits/lease/{jsonable_encoder(lease_id)}/release", + method="PUT", + json=request, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListGrantsForCreditResponse, + ReleaseCreditLeaseResponse, parse_obj_as( - type_=ListGrantsForCreditResponse, # type: ignore + type_=ReleaseCreditLeaseResponse, # type: ignore object_=_response.json(), ), ) @@ -6578,6 +7290,7 @@ async def create_billing_plan_credit_grant( expiry_unit_count: typing.Optional[int] = OMIT, plan_version_id: typing.Optional[str] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[CreateBillingPlanCreditGrantResponse]: """ @@ -6623,6 +7336,9 @@ async def create_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. Defaults to 0. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -6655,6 +7371,7 @@ async def create_billing_plan_credit_grant( "reset_cadence": reset_cadence, "reset_start": reset_start, "reset_type": reset_type, + "rollover_percentage": rollover_percentage, }, headers={ "content-type": "application/json", @@ -6850,6 +7567,7 @@ async def update_billing_plan_credit_grant( expiry_unit: typing.Optional[BillingCreditExpiryUnit] = OMIT, expiry_unit_count: typing.Optional[int] = OMIT, reset_type: typing.Optional[BillingPlanCreditGrantResetType] = OMIT, + rollover_percentage: typing.Optional[int] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[UpdateBillingPlanCreditGrantResponse]: """ @@ -6892,6 +7610,9 @@ async def update_billing_plan_credit_grant( reset_type : typing.Optional[BillingPlanCreditGrantResetType] + rollover_percentage : typing.Optional[int] + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -6921,6 +7642,7 @@ async def update_billing_plan_credit_grant( "reset_cadence": reset_cadence, "reset_start": reset_start, "reset_type": reset_type, + "rollover_percentage": rollover_percentage, }, headers={ "content-type": "application/json", diff --git a/src/schematic/credits/types/__init__.py b/src/schematic/credits/types/__init__.py index d06f5e9..8ede7ac 100644 --- a/src/schematic/credits/types/__init__.py +++ b/src/schematic/credits/types/__init__.py @@ -6,6 +6,7 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .acquire_credit_lease_response import AcquireCreditLeaseResponse from .count_billing_credits_grants_params import CountBillingCreditsGrantsParams from .count_billing_credits_grants_response import CountBillingCreditsGrantsResponse from .count_billing_credits_params import CountBillingCreditsParams @@ -26,6 +27,7 @@ from .delete_billing_plan_credit_grant_params import DeleteBillingPlanCreditGrantParams from .delete_billing_plan_credit_grant_response import DeleteBillingPlanCreditGrantResponse from .delete_credit_bundle_response import DeleteCreditBundleResponse + from .extend_credit_lease_response import ExtendCreditLeaseResponse from .get_credit_bundle_response import GetCreditBundleResponse from .get_enriched_credit_ledger_params import GetEnrichedCreditLedgerParams from .get_enriched_credit_ledger_response import GetEnrichedCreditLedgerResponse @@ -46,12 +48,14 @@ from .list_credit_event_ledger_response import ListCreditEventLedgerResponse from .list_grants_for_credit_params import ListGrantsForCreditParams from .list_grants_for_credit_response import ListGrantsForCreditResponse + from .release_credit_lease_response import ReleaseCreditLeaseResponse from .soft_delete_billing_credit_response import SoftDeleteBillingCreditResponse from .update_billing_credit_response import UpdateBillingCreditResponse from .update_billing_plan_credit_grant_response import UpdateBillingPlanCreditGrantResponse from .update_credit_bundle_details_response import UpdateCreditBundleDetailsResponse from .zero_out_grant_response import ZeroOutGrantResponse _dynamic_imports: typing.Dict[str, str] = { + "AcquireCreditLeaseResponse": ".acquire_credit_lease_response", "CountBillingCreditsGrantsParams": ".count_billing_credits_grants_params", "CountBillingCreditsGrantsResponse": ".count_billing_credits_grants_response", "CountBillingCreditsParams": ".count_billing_credits_params", @@ -72,6 +76,7 @@ "DeleteBillingPlanCreditGrantParams": ".delete_billing_plan_credit_grant_params", "DeleteBillingPlanCreditGrantResponse": ".delete_billing_plan_credit_grant_response", "DeleteCreditBundleResponse": ".delete_credit_bundle_response", + "ExtendCreditLeaseResponse": ".extend_credit_lease_response", "GetCreditBundleResponse": ".get_credit_bundle_response", "GetEnrichedCreditLedgerParams": ".get_enriched_credit_ledger_params", "GetEnrichedCreditLedgerResponse": ".get_enriched_credit_ledger_response", @@ -92,6 +97,7 @@ "ListCreditEventLedgerResponse": ".list_credit_event_ledger_response", "ListGrantsForCreditParams": ".list_grants_for_credit_params", "ListGrantsForCreditResponse": ".list_grants_for_credit_response", + "ReleaseCreditLeaseResponse": ".release_credit_lease_response", "SoftDeleteBillingCreditResponse": ".soft_delete_billing_credit_response", "UpdateBillingCreditResponse": ".update_billing_credit_response", "UpdateBillingPlanCreditGrantResponse": ".update_billing_plan_credit_grant_response", @@ -122,6 +128,7 @@ def __dir__(): __all__ = [ + "AcquireCreditLeaseResponse", "CountBillingCreditsGrantsParams", "CountBillingCreditsGrantsResponse", "CountBillingCreditsParams", @@ -142,6 +149,7 @@ def __dir__(): "DeleteBillingPlanCreditGrantParams", "DeleteBillingPlanCreditGrantResponse", "DeleteCreditBundleResponse", + "ExtendCreditLeaseResponse", "GetCreditBundleResponse", "GetEnrichedCreditLedgerParams", "GetEnrichedCreditLedgerResponse", @@ -162,6 +170,7 @@ def __dir__(): "ListCreditEventLedgerResponse", "ListGrantsForCreditParams", "ListGrantsForCreditResponse", + "ReleaseCreditLeaseResponse", "SoftDeleteBillingCreditResponse", "UpdateBillingCreditResponse", "UpdateBillingPlanCreditGrantResponse", diff --git a/src/schematic/credits/types/acquire_credit_lease_response.py b/src/schematic/credits/types/acquire_credit_lease_response.py new file mode 100644 index 0000000..b98085b --- /dev/null +++ b/src/schematic/credits/types/acquire_credit_lease_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.credit_lease_response_data import CreditLeaseResponseData + + +class AcquireCreditLeaseResponse(UniversalBaseModel): + data: CreditLeaseResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/credits/types/extend_credit_lease_response.py b/src/schematic/credits/types/extend_credit_lease_response.py new file mode 100644 index 0000000..1afbfb8 --- /dev/null +++ b/src/schematic/credits/types/extend_credit_lease_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.credit_lease_response_data import CreditLeaseResponseData + + +class ExtendCreditLeaseResponse(UniversalBaseModel): + data: CreditLeaseResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/credits/types/release_credit_lease_response.py b/src/schematic/credits/types/release_credit_lease_response.py new file mode 100644 index 0000000..70bdcb3 --- /dev/null +++ b/src/schematic/credits/types/release_credit_lease_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.credit_lease_response_data import CreditLeaseResponseData + + +class ReleaseCreditLeaseResponse(UniversalBaseModel): + data: CreditLeaseResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/entitlements/client.py b/src/schematic/entitlements/client.py index 9cd008a..6ebaac7 100644 --- a/src/schematic/entitlements/client.py +++ b/src/schematic/entitlements/client.py @@ -605,7 +605,7 @@ def list_feature_usage( company_id="company_id", feature_ids=["feature_ids"], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -746,7 +746,7 @@ def count_feature_usage( company_id="company_id", feature_ids=["feature_ids"], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -989,6 +989,7 @@ def create_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -1051,6 +1052,9 @@ def create_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -1113,6 +1117,7 @@ def create_plan_entitlement( quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, @@ -1181,6 +1186,7 @@ def update_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -1240,6 +1246,9 @@ def update_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -1299,6 +1308,7 @@ def update_plan_entitlement( quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, @@ -1371,6 +1381,7 @@ def upsert_plan_entitlement_for_billing_product( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -1437,6 +1448,9 @@ def upsert_plan_entitlement_for_billing_product( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -1469,7 +1483,7 @@ def upsert_plan_entitlement_for_billing_product( api_key="YOUR_API_KEY", ) client.entitlements.upsert_plan_entitlement_for_billing_product( - billing_provider="orb", + billing_provider="metronome", external_resource_id="external_resource_id", feature_id="feature_id", plan_id="plan_id", @@ -1503,6 +1517,7 @@ def upsert_plan_entitlement_for_billing_product( quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, @@ -2311,7 +2326,7 @@ async def main() -> None: company_id="company_id", feature_ids=["feature_ids"], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -2467,7 +2482,7 @@ async def main() -> None: company_id="company_id", feature_ids=["feature_ids"], include_usage_aggregation=True, - managed_by="orb", + managed_by="metronome", q="q", without_negative_entitlements=True, limit=1000000, @@ -2737,6 +2752,7 @@ async def create_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -2799,6 +2815,9 @@ async def create_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -2869,6 +2888,7 @@ async def main() -> None: quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, @@ -2945,6 +2965,7 @@ async def update_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -3004,6 +3025,9 @@ async def update_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -3071,6 +3095,7 @@ async def main() -> None: quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, @@ -3151,6 +3176,7 @@ async def upsert_plan_entitlement_for_billing_product( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -3217,6 +3243,9 @@ async def upsert_plan_entitlement_for_billing_product( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -3254,7 +3283,7 @@ async def upsert_plan_entitlement_for_billing_product( async def main() -> None: await client.entitlements.upsert_plan_entitlement_for_billing_product( - billing_provider="orb", + billing_provider="metronome", external_resource_id="external_resource_id", feature_id="feature_id", plan_id="plan_id", @@ -3291,6 +3320,7 @@ async def main() -> None: quarterly_unit_price_decimal=quarterly_unit_price_decimal, soft_limit=soft_limit, tier_mode=tier_mode, + usage_quantity=usage_quantity, value_bool=value_bool, value_credit_id=value_credit_id, value_numeric=value_numeric, diff --git a/src/schematic/entitlements/raw_client.py b/src/schematic/entitlements/raw_client.py index 292235f..4c3fe11 100644 --- a/src/schematic/entitlements/raw_client.py +++ b/src/schematic/entitlements/raw_client.py @@ -1894,6 +1894,7 @@ def create_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -1956,6 +1957,9 @@ def create_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -2019,6 +2023,7 @@ def create_plan_entitlement( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, @@ -2231,6 +2236,7 @@ def update_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -2290,6 +2296,9 @@ def update_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -2350,6 +2359,7 @@ def update_plan_entitlement( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, @@ -2577,6 +2587,7 @@ def upsert_plan_entitlement_for_billing_product( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -2643,6 +2654,9 @@ def upsert_plan_entitlement_for_billing_product( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -2708,6 +2722,7 @@ def upsert_plan_entitlement_for_billing_product( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, @@ -5002,6 +5017,7 @@ async def create_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -5064,6 +5080,9 @@ async def create_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -5127,6 +5146,7 @@ async def create_plan_entitlement( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, @@ -5339,6 +5359,7 @@ async def update_plan_entitlement( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -5398,6 +5419,9 @@ async def update_plan_entitlement( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -5458,6 +5482,7 @@ async def update_plan_entitlement( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, @@ -5685,6 +5710,7 @@ async def upsert_plan_entitlement_for_billing_product( quarterly_unit_price_decimal: typing.Optional[str] = OMIT, soft_limit: typing.Optional[int] = OMIT, tier_mode: typing.Optional[BillingTiersMode] = OMIT, + usage_quantity: typing.Optional[int] = OMIT, value_bool: typing.Optional[bool] = OMIT, value_credit_id: typing.Optional[str] = OMIT, value_numeric: typing.Optional[int] = OMIT, @@ -5751,6 +5777,9 @@ async def upsert_plan_entitlement_for_billing_product( tier_mode : typing.Optional[BillingTiersMode] + usage_quantity : typing.Optional[int] + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + value_bool : typing.Optional[bool] value_credit_id : typing.Optional[str] @@ -5816,6 +5845,7 @@ async def upsert_plan_entitlement_for_billing_product( "quarterly_unit_price_decimal": quarterly_unit_price_decimal, "soft_limit": soft_limit, "tier_mode": tier_mode, + "usage_quantity": usage_quantity, "value_bool": value_bool, "value_credit_id": value_credit_id, "value_numeric": value_numeric, diff --git a/src/schematic/features/client.py b/src/schematic/features/client.py index 8f8cffc..047f365 100644 --- a/src/schematic/features/client.py +++ b/src/schematic/features/client.py @@ -114,7 +114,7 @@ def list_features( boolean_require_event=True, feature_type=["boolean"], ids=["ids"], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", @@ -422,7 +422,7 @@ def upsert_feature_for_billing_product( api_key="YOUR_API_KEY", ) client.features.upsert_feature_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", feature_type="boolean", @@ -513,7 +513,7 @@ def count_features( boolean_require_event=True, feature_type=["boolean"], ids=["ids"], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", @@ -1090,7 +1090,7 @@ async def main() -> None: boolean_require_event=True, feature_type=["boolean"], ids=["ids"], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", @@ -1438,7 +1438,7 @@ async def upsert_feature_for_billing_product( async def main() -> None: await client.features.upsert_feature_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", feature_type="boolean", @@ -1537,7 +1537,7 @@ async def main() -> None: boolean_require_event=True, feature_type=["boolean"], ids=["ids"], - managed_by="orb", + managed_by="metronome", plan_version_id="plan_version_id", q="q", without_company_override_for="without_company_override_for", diff --git a/src/schematic/integrationsapi/__init__.py b/src/schematic/integrationsapi/__init__.py index c6490c5..13f91ac 100644 --- a/src/schematic/integrationsapi/__init__.py +++ b/src/schematic/integrationsapi/__init__.py @@ -7,19 +7,25 @@ if typing.TYPE_CHECKING: from .types import ( + AssumeStripeInstalledResponse, GetIntegrationWebhookUrlResponse, + InstallIntegrationResponse, + InstallStripeResponse, ListIntegrationsParams, ListIntegrationsResponse, - LoadSampleDataSetV2Response, + LoadSampleDataSetResponse, RunIntegrationResponse, StartDataImportResponse, UninstallIntegrationResponse, ) _dynamic_imports: typing.Dict[str, str] = { + "AssumeStripeInstalledResponse": ".types", "GetIntegrationWebhookUrlResponse": ".types", + "InstallIntegrationResponse": ".types", + "InstallStripeResponse": ".types", "ListIntegrationsParams": ".types", "ListIntegrationsResponse": ".types", - "LoadSampleDataSetV2Response": ".types", + "LoadSampleDataSetResponse": ".types", "RunIntegrationResponse": ".types", "StartDataImportResponse": ".types", "UninstallIntegrationResponse": ".types", @@ -48,10 +54,13 @@ def __dir__(): __all__ = [ + "AssumeStripeInstalledResponse", "GetIntegrationWebhookUrlResponse", + "InstallIntegrationResponse", + "InstallStripeResponse", "ListIntegrationsParams", "ListIntegrationsResponse", - "LoadSampleDataSetV2Response", + "LoadSampleDataSetResponse", "RunIntegrationResponse", "StartDataImportResponse", "UninstallIntegrationResponse", diff --git a/src/schematic/integrationsapi/client.py b/src/schematic/integrationsapi/client.py index b64bbd8..872baa6 100644 --- a/src/schematic/integrationsapi/client.py +++ b/src/schematic/integrationsapi/client.py @@ -8,9 +8,12 @@ from ..types.integration_state import IntegrationState from ..types.integration_type import IntegrationType from .raw_client import AsyncRawIntegrationsapiClient, RawIntegrationsapiClient +from .types.assume_stripe_installed_response import AssumeStripeInstalledResponse from .types.get_integration_webhook_url_response import GetIntegrationWebhookUrlResponse +from .types.install_integration_response import InstallIntegrationResponse +from .types.install_stripe_response import InstallStripeResponse from .types.list_integrations_response import ListIntegrationsResponse -from .types.load_sample_data_set_v_2_response import LoadSampleDataSetV2Response +from .types.load_sample_data_set_response import LoadSampleDataSetResponse from .types.run_integration_response import RunIntegrationResponse from .types.start_data_import_response import StartDataImportResponse from .types.uninstall_integration_response import UninstallIntegrationResponse @@ -164,6 +167,62 @@ def get_integration_webhook_url( _response = self._raw_client.get_integration_webhook_url(type, request_options=request_options) return _response.data + def install_integration( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> InstallIntegrationResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + InstallIntegrationResponse + Created + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.integrationsapi.install_integration( + type="clerk", + ) + """ + _response = self._raw_client.install_integration( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) + return _response.data + def start_data_import( self, *, @@ -208,9 +267,9 @@ def start_data_import( ) return _response.data - def load_sample_data_set_v_2( + def load_sample_data_set( self, *, request_options: typing.Optional[RequestOptions] = None - ) -> LoadSampleDataSetV2Response: + ) -> LoadSampleDataSetResponse: """ Parameters ---------- @@ -219,7 +278,7 @@ def load_sample_data_set_v_2( Returns ------- - LoadSampleDataSetV2Response + LoadSampleDataSetResponse OK Examples @@ -229,9 +288,121 @@ def load_sample_data_set_v_2( client = Schematic( api_key="YOUR_API_KEY", ) - client.integrationsapi.load_sample_data_set_v_2() + client.integrationsapi.load_sample_data_set() + """ + _response = self._raw_client.load_sample_data_set(request_options=request_options) + return _response.data + + def assume_stripe_installed( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AssumeStripeInstalledResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AssumeStripeInstalledResponse + Created + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.integrationsapi.assume_stripe_installed( + type="clerk", + ) + """ + _response = self._raw_client.assume_stripe_installed( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) + return _response.data + + def install_stripe( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> InstallStripeResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + InstallStripeResponse + Created + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.integrationsapi.install_stripe( + type="clerk", + ) """ - _response = self._raw_client.load_sample_data_set_v_2(request_options=request_options) + _response = self._raw_client.install_stripe( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) return _response.data def uninstall_integration( @@ -435,6 +606,70 @@ async def main() -> None: _response = await self._raw_client.get_integration_webhook_url(type, request_options=request_options) return _response.data + async def install_integration( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> InstallIntegrationResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + InstallIntegrationResponse + Created + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.integrationsapi.install_integration( + type="clerk", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.install_integration( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) + return _response.data + async def start_data_import( self, *, @@ -487,9 +722,9 @@ async def main() -> None: ) return _response.data - async def load_sample_data_set_v_2( + async def load_sample_data_set( self, *, request_options: typing.Optional[RequestOptions] = None - ) -> LoadSampleDataSetV2Response: + ) -> LoadSampleDataSetResponse: """ Parameters ---------- @@ -498,7 +733,7 @@ async def load_sample_data_set_v_2( Returns ------- - LoadSampleDataSetV2Response + LoadSampleDataSetResponse OK Examples @@ -513,12 +748,140 @@ async def load_sample_data_set_v_2( async def main() -> None: - await client.integrationsapi.load_sample_data_set_v_2() + await client.integrationsapi.load_sample_data_set() + + + asyncio.run(main()) + """ + _response = await self._raw_client.load_sample_data_set(request_options=request_options) + return _response.data + + async def assume_stripe_installed( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AssumeStripeInstalledResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AssumeStripeInstalledResponse + Created + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.integrationsapi.assume_stripe_installed( + type="clerk", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.assume_stripe_installed( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) + return _response.data + + async def install_stripe( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> InstallStripeResponse: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + InstallStripeResponse + Created + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.integrationsapi.install_stripe( + type="clerk", + ) asyncio.run(main()) """ - _response = await self._raw_client.load_sample_data_set_v_2(request_options=request_options) + _response = await self._raw_client.install_stripe( + type=type, + company_matching_criteria=company_matching_criteria, + company_matching_field=company_matching_field, + config=config, + is_sandbox=is_sandbox, + live_mode=live_mode, + request_options=request_options, + ) return _response.data async def uninstall_integration( diff --git a/src/schematic/integrationsapi/raw_client.py b/src/schematic/integrationsapi/raw_client.py index 4889c44..9d84438 100644 --- a/src/schematic/integrationsapi/raw_client.py +++ b/src/schematic/integrationsapi/raw_client.py @@ -19,9 +19,12 @@ from ..types.company_matching_criteria import CompanyMatchingCriteria from ..types.integration_state import IntegrationState from ..types.integration_type import IntegrationType +from .types.assume_stripe_installed_response import AssumeStripeInstalledResponse from .types.get_integration_webhook_url_response import GetIntegrationWebhookUrlResponse +from .types.install_integration_response import InstallIntegrationResponse +from .types.install_stripe_response import InstallStripeResponse from .types.list_integrations_response import ListIntegrationsResponse -from .types.load_sample_data_set_v_2_response import LoadSampleDataSetV2Response +from .types.load_sample_data_set_response import LoadSampleDataSetResponse from .types.run_integration_response import RunIntegrationResponse from .types.start_data_import_response import StartDataImportResponse from .types.uninstall_integration_response import UninstallIntegrationResponse @@ -344,6 +347,135 @@ def get_integration_webhook_url( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def install_integration( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[InstallIntegrationResponse]: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[InstallIntegrationResponse] + Created + """ + _response = self._client_wrapper.httpx_client.request( + "integrations/install", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + InstallIntegrationResponse, + parse_obj_as( + type_=InstallIntegrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def start_data_import( self, *, @@ -461,35 +593,618 @@ def start_data_import( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def load_sample_data_set_v_2( + def load_sample_data_set( self, *, request_options: typing.Optional[RequestOptions] = None - ) -> HttpResponse[LoadSampleDataSetV2Response]: + ) -> HttpResponse[LoadSampleDataSetResponse]: + """ + Parameters + ---------- + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[LoadSampleDataSetResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "integrations/stripe/dataset-sample-v2", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + LoadSampleDataSetResponse, + parse_obj_as( + type_=LoadSampleDataSetResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def assume_stripe_installed( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[AssumeStripeInstalledResponse]: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[AssumeStripeInstalledResponse] + Created + """ + _response = self._client_wrapper.httpx_client.request( + "integrations/stripe/v2/assume-installed", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + AssumeStripeInstalledResponse, + parse_obj_as( + type_=AssumeStripeInstalledResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def install_stripe( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[InstallStripeResponse]: + """ + Parameters + ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[InstallStripeResponse] + Created + """ + _response = self._client_wrapper.httpx_client.request( + "integrations/stripe/v2/install", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + InstallStripeResponse, + parse_obj_as( + type_=InstallStripeResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def uninstall_integration( + self, integration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[UninstallIntegrationResponse]: + """ + Parameters + ---------- + integration_id : str + integration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[UninstallIntegrationResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"integrations/uninstall/{jsonable_encoder(integration_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + UninstallIntegrationResponse, + parse_obj_as( + type_=UninstallIntegrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + +class AsyncRawIntegrationsapiClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def run_integration( + self, integration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[RunIntegrationResponse]: + """ + Parameters + ---------- + integration_id : str + integration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[RunIntegrationResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"integration/start/{jsonable_encoder(integration_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + RunIntegrationResponse, + parse_obj_as( + type_=RunIntegrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + async def list_integrations( + self, + *, + billing_only: typing.Optional[bool] = None, + exclude_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + id: typing.Optional[str] = None, + state: typing.Optional[IntegrationState] = None, + type: typing.Optional[IntegrationType] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[ListIntegrationsResponse]: """ Parameters ---------- + billing_only : typing.Optional[bool] + + exclude_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + + id : typing.Optional[str] + + state : typing.Optional[IntegrationState] + + type : typing.Optional[IntegrationType] + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - HttpResponse[LoadSampleDataSetV2Response] + AsyncHttpResponse[ListIntegrationsResponse] OK """ - _response = self._client_wrapper.httpx_client.request( - "integrations/stripe/dataset-sample-v2", + _response = await self._client_wrapper.httpx_client.request( + "integrations", method="GET", + params={ + "billing_only": billing_only, + "exclude_ids": exclude_ids, + "id": id, + "state": state, + "type": type, + "limit": limit, + "offset": offset, + }, request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - LoadSampleDataSetV2Response, + ListIntegrationsResponse, parse_obj_as( - type_=LoadSampleDataSetV2Response, # type: ignore + type_=ListIntegrationsResponse, # type: ignore object_=_response.json(), ), ) - return HttpResponse(response=_response, data=_data) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -547,49 +1262,38 @@ def load_sample_data_set_v_2( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def uninstall_integration( - self, integration_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> HttpResponse[UninstallIntegrationResponse]: + async def get_integration_webhook_url( + self, type: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetIntegrationWebhookUrlResponse]: """ Parameters ---------- - integration_id : str - integration_id + type : str + type request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - HttpResponse[UninstallIntegrationResponse] + AsyncHttpResponse[GetIntegrationWebhookUrlResponse] OK """ - _response = self._client_wrapper.httpx_client.request( - f"integrations/uninstall/{jsonable_encoder(integration_id)}", - method="DELETE", + _response = await self._client_wrapper.httpx_client.request( + f"integrations/{jsonable_encoder(type)}/webhook-url", + method="GET", request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - UninstallIntegrationResponse, + GetIntegrationWebhookUrlResponse, parse_obj_as( - type_=UninstallIntegrationResponse, # type: ignore + type_=GetIntegrationWebhookUrlResponse, # type: ignore object_=_response.json(), ), ) - return HttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) + return AsyncHttpResponse(response=_response, data=_data) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -647,43 +1351,78 @@ def uninstall_integration( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - -class AsyncRawIntegrationsapiClient: - def __init__(self, *, client_wrapper: AsyncClientWrapper): - self._client_wrapper = client_wrapper - - async def run_integration( - self, integration_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[RunIntegrationResponse]: + async def install_integration( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[InstallIntegrationResponse]: """ Parameters ---------- - integration_id : str - integration_id + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[RunIntegrationResponse] - OK + AsyncHttpResponse[InstallIntegrationResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - f"integration/start/{jsonable_encoder(integration_id)}", - method="GET", + "integrations/install", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - RunIntegrationResponse, + InstallIntegrationResponse, parse_obj_as( - type_=RunIntegrationResponse, # type: ignore + type_=InstallIntegrationResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -741,65 +1480,51 @@ async def run_integration( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_integrations( + async def start_data_import( self, *, - billing_only: typing.Optional[bool] = None, - exclude_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, - id: typing.Optional[str] = None, - state: typing.Optional[IntegrationState] = None, - type: typing.Optional[IntegrationType] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + integration_id: str, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListIntegrationsResponse]: + ) -> AsyncHttpResponse[StartDataImportResponse]: """ Parameters ---------- - billing_only : typing.Optional[bool] - - exclude_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] - - id : typing.Optional[str] - - state : typing.Optional[IntegrationState] - - type : typing.Optional[IntegrationType] + integration_id : str - limit : typing.Optional[int] - Page limit (default 100) + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] - offset : typing.Optional[int] - Page offset (default 0) + company_matching_field : typing.Optional[str] request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListIntegrationsResponse] - OK + AsyncHttpResponse[StartDataImportResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - "integrations", - method="GET", - params={ - "billing_only": billing_only, - "exclude_ids": exclude_ids, - "id": id, - "state": state, - "type": type, - "limit": limit, - "offset": offset, + "integrations/start-data-import", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "integration_id": integration_id, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListIntegrationsResponse, + StartDataImportResponse, parse_obj_as( - type_=ListIntegrationsResponse, # type: ignore + type_=StartDataImportResponse, # type: ignore object_=_response.json(), ), ) @@ -872,34 +1597,31 @@ async def list_integrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def get_integration_webhook_url( - self, type: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[GetIntegrationWebhookUrlResponse]: + async def load_sample_data_set( + self, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[LoadSampleDataSetResponse]: """ Parameters ---------- - type : str - type - request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[GetIntegrationWebhookUrlResponse] + AsyncHttpResponse[LoadSampleDataSetResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"integrations/{jsonable_encoder(type)}/webhook-url", + "integrations/stripe/dataset-sample-v2", method="GET", request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GetIntegrationWebhookUrlResponse, + LoadSampleDataSetResponse, parse_obj_as( - type_=GetIntegrationWebhookUrlResponse, # type: ignore + type_=LoadSampleDataSetResponse, # type: ignore object_=_response.json(), ), ) @@ -961,38 +1683,50 @@ async def get_integration_webhook_url( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def start_data_import( + async def assume_stripe_installed( self, *, - integration_id: str, + type: IntegrationType, company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[StartDataImportResponse]: + ) -> AsyncHttpResponse[AssumeStripeInstalledResponse]: """ Parameters ---------- - integration_id : str + type : IntegrationType company_matching_criteria : typing.Optional[CompanyMatchingCriteria] company_matching_field : typing.Optional[str] + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[StartDataImportResponse] + AsyncHttpResponse[AssumeStripeInstalledResponse] Created """ _response = await self._client_wrapper.httpx_client.request( - "integrations/start-data-import", + "integrations/stripe/v2/assume-installed", method="POST", json={ "company_matching_criteria": company_matching_criteria, "company_matching_field": company_matching_field, - "integration_id": integration_id, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, }, headers={ "content-type": "application/json", @@ -1003,9 +1737,9 @@ async def start_data_import( try: if 200 <= _response.status_code < 300: _data = typing.cast( - StartDataImportResponse, + AssumeStripeInstalledResponse, parse_obj_as( - type_=StartDataImportResponse, # type: ignore + type_=AssumeStripeInstalledResponse, # type: ignore object_=_response.json(), ), ) @@ -1078,35 +1812,78 @@ async def start_data_import( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def load_sample_data_set_v_2( - self, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[LoadSampleDataSetV2Response]: + async def install_stripe( + self, + *, + type: IntegrationType, + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = OMIT, + company_matching_field: typing.Optional[str] = OMIT, + config: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, + is_sandbox: typing.Optional[bool] = OMIT, + live_mode: typing.Optional[bool] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[InstallStripeResponse]: """ Parameters ---------- + type : IntegrationType + + company_matching_criteria : typing.Optional[CompanyMatchingCriteria] + + company_matching_field : typing.Optional[str] + + config : typing.Optional[typing.Dict[str, typing.Any]] + + is_sandbox : typing.Optional[bool] + + live_mode : typing.Optional[bool] + request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[LoadSampleDataSetV2Response] - OK + AsyncHttpResponse[InstallStripeResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - "integrations/stripe/dataset-sample-v2", - method="GET", + "integrations/stripe/v2/install", + method="POST", + json={ + "company_matching_criteria": company_matching_criteria, + "company_matching_field": company_matching_field, + "config": config, + "is_sandbox": is_sandbox, + "live_mode": live_mode, + "type": type, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - LoadSampleDataSetV2Response, + InstallStripeResponse, parse_obj_as( - type_=LoadSampleDataSetV2Response, # type: ignore + type_=InstallStripeResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), diff --git a/src/schematic/integrationsapi/types/__init__.py b/src/schematic/integrationsapi/types/__init__.py index df68e27..6719438 100644 --- a/src/schematic/integrationsapi/types/__init__.py +++ b/src/schematic/integrationsapi/types/__init__.py @@ -6,18 +6,24 @@ from importlib import import_module if typing.TYPE_CHECKING: + from .assume_stripe_installed_response import AssumeStripeInstalledResponse from .get_integration_webhook_url_response import GetIntegrationWebhookUrlResponse + from .install_integration_response import InstallIntegrationResponse + from .install_stripe_response import InstallStripeResponse from .list_integrations_params import ListIntegrationsParams from .list_integrations_response import ListIntegrationsResponse - from .load_sample_data_set_v_2_response import LoadSampleDataSetV2Response + from .load_sample_data_set_response import LoadSampleDataSetResponse from .run_integration_response import RunIntegrationResponse from .start_data_import_response import StartDataImportResponse from .uninstall_integration_response import UninstallIntegrationResponse _dynamic_imports: typing.Dict[str, str] = { + "AssumeStripeInstalledResponse": ".assume_stripe_installed_response", "GetIntegrationWebhookUrlResponse": ".get_integration_webhook_url_response", + "InstallIntegrationResponse": ".install_integration_response", + "InstallStripeResponse": ".install_stripe_response", "ListIntegrationsParams": ".list_integrations_params", "ListIntegrationsResponse": ".list_integrations_response", - "LoadSampleDataSetV2Response": ".load_sample_data_set_v_2_response", + "LoadSampleDataSetResponse": ".load_sample_data_set_response", "RunIntegrationResponse": ".run_integration_response", "StartDataImportResponse": ".start_data_import_response", "UninstallIntegrationResponse": ".uninstall_integration_response", @@ -46,10 +52,13 @@ def __dir__(): __all__ = [ + "AssumeStripeInstalledResponse", "GetIntegrationWebhookUrlResponse", + "InstallIntegrationResponse", + "InstallStripeResponse", "ListIntegrationsParams", "ListIntegrationsResponse", - "LoadSampleDataSetV2Response", + "LoadSampleDataSetResponse", "RunIntegrationResponse", "StartDataImportResponse", "UninstallIntegrationResponse", diff --git a/src/schematic/integrationsapi/types/assume_stripe_installed_response.py b/src/schematic/integrationsapi/types/assume_stripe_installed_response.py new file mode 100644 index 0000000..7fc5f86 --- /dev/null +++ b/src/schematic/integrationsapi/types/assume_stripe_installed_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.integration_install_response_data import IntegrationInstallResponseData + + +class AssumeStripeInstalledResponse(UniversalBaseModel): + data: IntegrationInstallResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/integrationsapi/types/install_integration_response.py b/src/schematic/integrationsapi/types/install_integration_response.py new file mode 100644 index 0000000..16cfcdf --- /dev/null +++ b/src/schematic/integrationsapi/types/install_integration_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.integration_install_response_data import IntegrationInstallResponseData + + +class InstallIntegrationResponse(UniversalBaseModel): + data: IntegrationInstallResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/integrationsapi/types/install_stripe_response.py b/src/schematic/integrationsapi/types/install_stripe_response.py new file mode 100644 index 0000000..3619b4e --- /dev/null +++ b/src/schematic/integrationsapi/types/install_stripe_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.integration_install_response_data import IntegrationInstallResponseData + + +class InstallStripeResponse(UniversalBaseModel): + data: IntegrationInstallResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/integrationsapi/types/load_sample_data_set_v_2_response.py b/src/schematic/integrationsapi/types/load_sample_data_set_response.py similarity index 92% rename from src/schematic/integrationsapi/types/load_sample_data_set_v_2_response.py rename to src/schematic/integrationsapi/types/load_sample_data_set_response.py index 28bdbe8..9fb274e 100644 --- a/src/schematic/integrationsapi/types/load_sample_data_set_v_2_response.py +++ b/src/schematic/integrationsapi/types/load_sample_data_set_response.py @@ -7,7 +7,7 @@ from ...types.integrations_data_set_response_data import IntegrationsDataSetResponseData -class LoadSampleDataSetV2Response(UniversalBaseModel): +class LoadSampleDataSetResponse(UniversalBaseModel): data: IntegrationsDataSetResponseData params: typing.Dict[str, typing.Any] = pydantic.Field() """ diff --git a/src/schematic/plangroups/client.py b/src/schematic/plangroups/client.py index 2c916b4..33e5350 100644 --- a/src/schematic/plangroups/client.py +++ b/src/schematic/plangroups/client.py @@ -4,6 +4,7 @@ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.request_options import RequestOptions +from ..types.checkout_field_input import CheckoutFieldInput from ..types.compatible_plans import CompatiblePlans from ..types.custom_plan_config import CustomPlanConfig from ..types.ordered_plans_in_group import OrderedPlansInGroup @@ -91,6 +92,7 @@ def create_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -148,6 +150,8 @@ def create_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -242,6 +246,7 @@ def create_plan_group( show_zero_price_as_free=show_zero_price_as_free, sync_customer_billing_details=sync_customer_billing_details, add_on_compatibilities=add_on_compatibilities, + custom_checkout_fields=custom_checkout_fields, custom_plan_config=custom_plan_config, custom_plan_id=custom_plan_id, fallback_plan_id=fallback_plan_id, @@ -282,6 +287,7 @@ def update_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -342,6 +348,8 @@ def update_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -438,6 +446,7 @@ def update_plan_group( show_zero_price_as_free=show_zero_price_as_free, sync_customer_billing_details=sync_customer_billing_details, add_on_compatibilities=add_on_compatibilities, + custom_checkout_fields=custom_checkout_fields, custom_plan_config=custom_plan_config, custom_plan_id=custom_plan_id, fallback_plan_id=fallback_plan_id, @@ -536,6 +545,7 @@ async def create_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -593,6 +603,8 @@ async def create_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -695,6 +707,7 @@ async def main() -> None: show_zero_price_as_free=show_zero_price_as_free, sync_customer_billing_details=sync_customer_billing_details, add_on_compatibilities=add_on_compatibilities, + custom_checkout_fields=custom_checkout_fields, custom_plan_config=custom_plan_config, custom_plan_id=custom_plan_id, fallback_plan_id=fallback_plan_id, @@ -735,6 +748,7 @@ async def update_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -795,6 +809,8 @@ async def update_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -899,6 +915,7 @@ async def main() -> None: show_zero_price_as_free=show_zero_price_as_free, sync_customer_billing_details=sync_customer_billing_details, add_on_compatibilities=add_on_compatibilities, + custom_checkout_fields=custom_checkout_fields, custom_plan_config=custom_plan_config, custom_plan_id=custom_plan_id, fallback_plan_id=fallback_plan_id, diff --git a/src/schematic/plangroups/raw_client.py b/src/schematic/plangroups/raw_client.py index bbb2221..ecc5f77 100644 --- a/src/schematic/plangroups/raw_client.py +++ b/src/schematic/plangroups/raw_client.py @@ -17,6 +17,7 @@ from ..errors.not_found_error import NotFoundError from ..errors.unauthorized_error import UnauthorizedError from ..types.api_error import ApiError as types_api_error_ApiError +from ..types.checkout_field_input import CheckoutFieldInput from ..types.compatible_plans import CompatiblePlans from ..types.custom_plan_config import CustomPlanConfig from ..types.ordered_plans_in_group import OrderedPlansInGroup @@ -152,6 +153,7 @@ def create_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -209,6 +211,8 @@ def create_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -254,6 +258,9 @@ def create_plan_group( "checkout_collect_address": checkout_collect_address, "checkout_collect_email": checkout_collect_email, "checkout_collect_phone": checkout_collect_phone, + "custom_checkout_fields": convert_and_respect_annotation_metadata( + object_=custom_checkout_fields, annotation=typing.Sequence[CheckoutFieldInput], direction="write" + ), "custom_plan_config": convert_and_respect_annotation_metadata( object_=custom_plan_config, annotation=CustomPlanConfig, direction="write" ), @@ -397,6 +404,7 @@ def update_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -457,6 +465,8 @@ def update_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -502,6 +512,9 @@ def update_plan_group( "checkout_collect_address": checkout_collect_address, "checkout_collect_email": checkout_collect_email, "checkout_collect_phone": checkout_collect_phone, + "custom_checkout_fields": convert_and_respect_annotation_metadata( + object_=custom_checkout_fields, annotation=typing.Sequence[CheckoutFieldInput], direction="write" + ), "custom_plan_config": convert_and_respect_annotation_metadata( object_=custom_plan_config, annotation=CustomPlanConfig, direction="write" ), @@ -743,6 +756,7 @@ async def create_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -800,6 +814,8 @@ async def create_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -845,6 +861,9 @@ async def create_plan_group( "checkout_collect_address": checkout_collect_address, "checkout_collect_email": checkout_collect_email, "checkout_collect_phone": checkout_collect_phone, + "custom_checkout_fields": convert_and_respect_annotation_metadata( + object_=custom_checkout_fields, annotation=typing.Sequence[CheckoutFieldInput], direction="write" + ), "custom_plan_config": convert_and_respect_annotation_metadata( object_=custom_plan_config, annotation=CustomPlanConfig, direction="write" ), @@ -988,6 +1007,7 @@ async def update_plan_group( show_zero_price_as_free: bool, sync_customer_billing_details: bool, add_on_compatibilities: typing.Optional[typing.Sequence[CompatiblePlans]] = OMIT, + custom_checkout_fields: typing.Optional[typing.Sequence[CheckoutFieldInput]] = OMIT, custom_plan_config: typing.Optional[CustomPlanConfig] = OMIT, custom_plan_id: typing.Optional[str] = OMIT, fallback_plan_id: typing.Optional[str] = OMIT, @@ -1048,6 +1068,8 @@ async def update_plan_group( add_on_compatibilities : typing.Optional[typing.Sequence[CompatiblePlans]] + custom_checkout_fields : typing.Optional[typing.Sequence[CheckoutFieldInput]] + custom_plan_config : typing.Optional[CustomPlanConfig] custom_plan_id : typing.Optional[str] @@ -1093,6 +1115,9 @@ async def update_plan_group( "checkout_collect_address": checkout_collect_address, "checkout_collect_email": checkout_collect_email, "checkout_collect_phone": checkout_collect_phone, + "custom_checkout_fields": convert_and_respect_annotation_metadata( + object_=custom_checkout_fields, annotation=typing.Sequence[CheckoutFieldInput], direction="write" + ), "custom_plan_config": convert_and_respect_annotation_metadata( object_=custom_plan_config, annotation=CustomPlanConfig, direction="write" ), diff --git a/src/schematic/planmigrations/__init__.py b/src/schematic/planmigrations/__init__.py index d4a051c..5958786 100644 --- a/src/schematic/planmigrations/__init__.py +++ b/src/schematic/planmigrations/__init__.py @@ -11,22 +11,28 @@ CountCompanyMigrationsResponse, CountMigrationsParams, CountMigrationsResponse, + CreateMigrationResponse, GetMigrationResponse, ListCompanyMigrationsParams, ListCompanyMigrationsResponse, ListMigrationsParams, ListMigrationsResponse, + RetryCompanyMigrationResponse, + RetryMigrationResponse, ) _dynamic_imports: typing.Dict[str, str] = { "CountCompanyMigrationsParams": ".types", "CountCompanyMigrationsResponse": ".types", "CountMigrationsParams": ".types", "CountMigrationsResponse": ".types", + "CreateMigrationResponse": ".types", "GetMigrationResponse": ".types", "ListCompanyMigrationsParams": ".types", "ListCompanyMigrationsResponse": ".types", "ListMigrationsParams": ".types", "ListMigrationsResponse": ".types", + "RetryCompanyMigrationResponse": ".types", + "RetryMigrationResponse": ".types", } @@ -56,9 +62,12 @@ def __dir__(): "CountCompanyMigrationsResponse", "CountMigrationsParams", "CountMigrationsResponse", + "CreateMigrationResponse", "GetMigrationResponse", "ListCompanyMigrationsParams", "ListCompanyMigrationsResponse", "ListMigrationsParams", "ListMigrationsResponse", + "RetryCompanyMigrationResponse", + "RetryMigrationResponse", ] diff --git a/src/schematic/planmigrations/client.py b/src/schematic/planmigrations/client.py index 6b35a8c..1d34cb8 100644 --- a/src/schematic/planmigrations/client.py +++ b/src/schematic/planmigrations/client.py @@ -4,14 +4,23 @@ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.request_options import RequestOptions +from ..types.migration_error_code import MigrationErrorCode +from ..types.plan_type import PlanType from ..types.plan_version_company_migration_status import PlanVersionCompanyMigrationStatus from ..types.plan_version_migration_status import PlanVersionMigrationStatus +from ..types.plan_version_migration_strategy import PlanVersionMigrationStrategy from .raw_client import AsyncRawPlanmigrationsClient, RawPlanmigrationsClient from .types.count_company_migrations_response import CountCompanyMigrationsResponse from .types.count_migrations_response import CountMigrationsResponse +from .types.create_migration_response import CreateMigrationResponse from .types.get_migration_response import GetMigrationResponse from .types.list_company_migrations_response import ListCompanyMigrationsResponse from .types.list_migrations_response import ListMigrationsResponse +from .types.retry_company_migration_response import RetryCompanyMigrationResponse +from .types.retry_migration_response import RetryMigrationResponse + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) class PlanmigrationsClient: @@ -82,6 +91,39 @@ def list_company_migrations( ) return _response.data + def retry_company_migration( + self, plan_version_company_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> RetryCompanyMigrationResponse: + """ + Parameters + ---------- + plan_version_company_migration_id : str + plan_version_company_migration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + RetryCompanyMigrationResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.planmigrations.retry_company_migration( + plan_version_company_migration_id="plan_version_company_migration_id", + ) + """ + _response = self._raw_client.retry_company_migration( + plan_version_company_migration_id, request_options=request_options + ) + return _response.data + def count_company_migrations( self, *, @@ -184,6 +226,72 @@ def list_migrations( ) return _response.data + def create_migration( + self, + *, + company_ids: typing.Sequence[str], + excluded_company_ids: typing.Sequence[str], + plan_id: str, + plan_version_id_to: str, + plan_version_ids_from: typing.Sequence[str], + strategy: PlanVersionMigrationStrategy, + target_plan_type: PlanType, + request_options: typing.Optional[RequestOptions] = None, + ) -> CreateMigrationResponse: + """ + Parameters + ---------- + company_ids : typing.Sequence[str] + + excluded_company_ids : typing.Sequence[str] + + plan_id : str + + plan_version_id_to : str + + plan_version_ids_from : typing.Sequence[str] + + strategy : PlanVersionMigrationStrategy + + target_plan_type : PlanType + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + CreateMigrationResponse + Created + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.planmigrations.create_migration( + company_ids=["company_ids"], + excluded_company_ids=["excluded_company_ids"], + plan_id="plan_id", + plan_version_id_to="plan_version_id_to", + plan_version_ids_from=["plan_version_ids_from"], + strategy="immediate", + target_plan_type="plan", + ) + """ + _response = self._raw_client.create_migration( + company_ids=company_ids, + excluded_company_ids=excluded_company_ids, + plan_id=plan_id, + plan_version_id_to=plan_version_id_to, + plan_version_ids_from=plan_version_ids_from, + strategy=strategy, + target_plan_type=target_plan_type, + request_options=request_options, + ) + return _response.data + def get_migration( self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> GetMigrationResponse: @@ -215,6 +323,46 @@ def get_migration( _response = self._raw_client.get_migration(plan_version_migration_id, request_options=request_options) return _response.data + def retry_migration( + self, + plan_version_migration_id: str, + *, + error_codes: typing.Sequence[MigrationErrorCode], + request_options: typing.Optional[RequestOptions] = None, + ) -> RetryMigrationResponse: + """ + Parameters + ---------- + plan_version_migration_id : str + plan_version_migration_id + + error_codes : typing.Sequence[MigrationErrorCode] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + RetryMigrationResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.planmigrations.retry_migration( + plan_version_migration_id="plan_version_migration_id", + error_codes=["ambiguous_subscription_item"], + ) + """ + _response = self._raw_client.retry_migration( + plan_version_migration_id, error_codes=error_codes, request_options=request_options + ) + return _response.data + def count_migrations( self, *, @@ -341,6 +489,47 @@ async def main() -> None: ) return _response.data + async def retry_company_migration( + self, plan_version_company_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> RetryCompanyMigrationResponse: + """ + Parameters + ---------- + plan_version_company_migration_id : str + plan_version_company_migration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + RetryCompanyMigrationResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.planmigrations.retry_company_migration( + plan_version_company_migration_id="plan_version_company_migration_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.retry_company_migration( + plan_version_company_migration_id, request_options=request_options + ) + return _response.data + async def count_company_migrations( self, *, @@ -459,6 +648,80 @@ async def main() -> None: ) return _response.data + async def create_migration( + self, + *, + company_ids: typing.Sequence[str], + excluded_company_ids: typing.Sequence[str], + plan_id: str, + plan_version_id_to: str, + plan_version_ids_from: typing.Sequence[str], + strategy: PlanVersionMigrationStrategy, + target_plan_type: PlanType, + request_options: typing.Optional[RequestOptions] = None, + ) -> CreateMigrationResponse: + """ + Parameters + ---------- + company_ids : typing.Sequence[str] + + excluded_company_ids : typing.Sequence[str] + + plan_id : str + + plan_version_id_to : str + + plan_version_ids_from : typing.Sequence[str] + + strategy : PlanVersionMigrationStrategy + + target_plan_type : PlanType + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + CreateMigrationResponse + Created + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.planmigrations.create_migration( + company_ids=["company_ids"], + excluded_company_ids=["excluded_company_ids"], + plan_id="plan_id", + plan_version_id_to="plan_version_id_to", + plan_version_ids_from=["plan_version_ids_from"], + strategy="immediate", + target_plan_type="plan", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.create_migration( + company_ids=company_ids, + excluded_company_ids=excluded_company_ids, + plan_id=plan_id, + plan_version_id_to=plan_version_id_to, + plan_version_ids_from=plan_version_ids_from, + strategy=strategy, + target_plan_type=target_plan_type, + request_options=request_options, + ) + return _response.data + async def get_migration( self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> GetMigrationResponse: @@ -498,6 +761,54 @@ async def main() -> None: _response = await self._raw_client.get_migration(plan_version_migration_id, request_options=request_options) return _response.data + async def retry_migration( + self, + plan_version_migration_id: str, + *, + error_codes: typing.Sequence[MigrationErrorCode], + request_options: typing.Optional[RequestOptions] = None, + ) -> RetryMigrationResponse: + """ + Parameters + ---------- + plan_version_migration_id : str + plan_version_migration_id + + error_codes : typing.Sequence[MigrationErrorCode] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + RetryMigrationResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.planmigrations.retry_migration( + plan_version_migration_id="plan_version_migration_id", + error_codes=["ambiguous_subscription_item"], + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.retry_migration( + plan_version_migration_id, error_codes=error_codes, request_options=request_options + ) + return _response.data + async def count_migrations( self, *, diff --git a/src/schematic/planmigrations/raw_client.py b/src/schematic/planmigrations/raw_client.py index 519cfa1..2b7c380 100644 --- a/src/schematic/planmigrations/raw_client.py +++ b/src/schematic/planmigrations/raw_client.py @@ -16,15 +16,24 @@ from ..errors.not_found_error import NotFoundError from ..errors.unauthorized_error import UnauthorizedError from ..types.api_error import ApiError as types_api_error_ApiError +from ..types.migration_error_code import MigrationErrorCode +from ..types.plan_type import PlanType from ..types.plan_version_company_migration_status import PlanVersionCompanyMigrationStatus from ..types.plan_version_migration_status import PlanVersionMigrationStatus +from ..types.plan_version_migration_strategy import PlanVersionMigrationStrategy from .types.count_company_migrations_response import CountCompanyMigrationsResponse from .types.count_migrations_response import CountMigrationsResponse +from .types.create_migration_response import CreateMigrationResponse from .types.get_migration_response import GetMigrationResponse from .types.list_company_migrations_response import ListCompanyMigrationsResponse from .types.list_migrations_response import ListMigrationsResponse +from .types.retry_company_migration_response import RetryCompanyMigrationResponse +from .types.retry_migration_response import RetryMigrationResponse from pydantic import ValidationError +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + class RawPlanmigrationsClient: def __init__(self, *, client_wrapper: SyncClientWrapper): @@ -78,9 +87,686 @@ def list_company_migrations( try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListCompanyMigrationsResponse, + ListCompanyMigrationsResponse, + parse_obj_as( + type_=ListCompanyMigrationsResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def retry_company_migration( + self, plan_version_company_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[RetryCompanyMigrationResponse]: + """ + Parameters + ---------- + plan_version_company_migration_id : str + plan_version_company_migration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[RetryCompanyMigrationResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"plan-version-company-migrations/{jsonable_encoder(plan_version_company_migration_id)}/retry", + method="POST", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + RetryCompanyMigrationResponse, + parse_obj_as( + type_=RetryCompanyMigrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def count_company_migrations( + self, + *, + migration_id: typing.Optional[str] = None, + q: typing.Optional[str] = None, + status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[CountCompanyMigrationsResponse]: + """ + Parameters + ---------- + migration_id : typing.Optional[str] + + q : typing.Optional[str] + + status : typing.Optional[PlanVersionCompanyMigrationStatus] + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[CountCompanyMigrationsResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "plan-version-company-migrations/count", + method="GET", + params={ + "migration_id": migration_id, + "q": q, + "status": status, + "limit": limit, + "offset": offset, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + CountCompanyMigrationsResponse, + parse_obj_as( + type_=CountCompanyMigrationsResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def list_migrations( + self, + *, + plan_version_id: typing.Optional[str] = None, + status: typing.Optional[PlanVersionMigrationStatus] = None, + limit: typing.Optional[int] = None, + offset: typing.Optional[int] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[ListMigrationsResponse]: + """ + Parameters + ---------- + plan_version_id : typing.Optional[str] + + status : typing.Optional[PlanVersionMigrationStatus] + + limit : typing.Optional[int] + Page limit (default 100) + + offset : typing.Optional[int] + Page offset (default 0) + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[ListMigrationsResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "plan-version-migrations", + method="GET", + params={ + "plan_version_id": plan_version_id, + "status": status, + "limit": limit, + "offset": offset, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + ListMigrationsResponse, + parse_obj_as( + type_=ListMigrationsResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def create_migration( + self, + *, + company_ids: typing.Sequence[str], + excluded_company_ids: typing.Sequence[str], + plan_id: str, + plan_version_id_to: str, + plan_version_ids_from: typing.Sequence[str], + strategy: PlanVersionMigrationStrategy, + target_plan_type: PlanType, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[CreateMigrationResponse]: + """ + Parameters + ---------- + company_ids : typing.Sequence[str] + + excluded_company_ids : typing.Sequence[str] + + plan_id : str + + plan_version_id_to : str + + plan_version_ids_from : typing.Sequence[str] + + strategy : PlanVersionMigrationStrategy + + target_plan_type : PlanType + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[CreateMigrationResponse] + Created + """ + _response = self._client_wrapper.httpx_client.request( + "plan-version-migrations", + method="POST", + json={ + "company_ids": company_ids, + "excluded_company_ids": excluded_company_ids, + "plan_id": plan_id, + "plan_version_id_to": plan_version_id_to, + "plan_version_ids_from": plan_version_ids_from, + "strategy": strategy, + "target_plan_type": target_plan_type, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + CreateMigrationResponse, + parse_obj_as( + type_=CreateMigrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def get_migration( + self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetMigrationResponse]: + """ + Parameters + ---------- + plan_version_migration_id : str + plan_version_migration_id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetMigrationResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetMigrationResponse, + parse_obj_as( + type_=GetMigrationResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + + def retry_migration( + self, + plan_version_migration_id: str, + *, + error_codes: typing.Sequence[MigrationErrorCode], + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[RetryMigrationResponse]: + """ + Parameters + ---------- + plan_version_migration_id : str + plan_version_migration_id + + error_codes : typing.Sequence[MigrationErrorCode] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[RetryMigrationResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}/retry", + method="POST", + json={ + "error_codes": error_codes, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + RetryMigrationResponse, parse_obj_as( - type_=ListCompanyMigrationsResponse, # type: ignore + type_=RetryMigrationResponse, # type: ignore object_=_response.json(), ), ) @@ -153,24 +839,21 @@ def list_company_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def count_company_migrations( + def count_migrations( self, *, - migration_id: typing.Optional[str] = None, - q: typing.Optional[str] = None, - status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, + plan_version_id: typing.Optional[str] = None, + status: typing.Optional[PlanVersionMigrationStatus] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[CountCompanyMigrationsResponse]: + ) -> HttpResponse[CountMigrationsResponse]: """ Parameters ---------- - migration_id : typing.Optional[str] - - q : typing.Optional[str] + plan_version_id : typing.Optional[str] - status : typing.Optional[PlanVersionCompanyMigrationStatus] + status : typing.Optional[PlanVersionMigrationStatus] limit : typing.Optional[int] Page limit (default 100) @@ -183,15 +866,14 @@ def count_company_migrations( Returns ------- - HttpResponse[CountCompanyMigrationsResponse] + HttpResponse[CountMigrationsResponse] OK """ _response = self._client_wrapper.httpx_client.request( - "plan-version-company-migrations/count", + "plan-version-migrations/count", method="GET", params={ - "migration_id": migration_id, - "q": q, + "plan_version_id": plan_version_id, "status": status, "limit": limit, "offset": offset, @@ -201,9 +883,9 @@ def count_company_migrations( try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountCompanyMigrationsResponse, + CountMigrationsResponse, parse_obj_as( - type_=CountCompanyMigrationsResponse, # type: ignore + type_=CountMigrationsResponse, # type: ignore object_=_response.json(), ), ) @@ -276,21 +958,29 @@ def count_company_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def list_migrations( + +class AsyncRawPlanmigrationsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def list_company_migrations( self, *, - plan_version_id: typing.Optional[str] = None, - status: typing.Optional[PlanVersionMigrationStatus] = None, + migration_id: typing.Optional[str] = None, + q: typing.Optional[str] = None, + status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[ListMigrationsResponse]: + ) -> AsyncHttpResponse[ListCompanyMigrationsResponse]: """ Parameters ---------- - plan_version_id : typing.Optional[str] + migration_id : typing.Optional[str] - status : typing.Optional[PlanVersionMigrationStatus] + q : typing.Optional[str] + + status : typing.Optional[PlanVersionCompanyMigrationStatus] limit : typing.Optional[int] Page limit (default 100) @@ -303,14 +993,15 @@ def list_migrations( Returns ------- - HttpResponse[ListMigrationsResponse] + AsyncHttpResponse[ListCompanyMigrationsResponse] OK """ - _response = self._client_wrapper.httpx_client.request( - "plan-version-migrations", + _response = await self._client_wrapper.httpx_client.request( + "plan-version-company-migrations", method="GET", params={ - "plan_version_id": plan_version_id, + "migration_id": migration_id, + "q": q, "status": status, "limit": limit, "offset": offset, @@ -320,13 +1011,13 @@ def list_migrations( try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListMigrationsResponse, + ListCompanyMigrationsResponse, parse_obj_as( - type_=ListMigrationsResponse, # type: ignore + type_=ListCompanyMigrationsResponse, # type: ignore object_=_response.json(), ), ) - return HttpResponse(response=_response, data=_data) + return AsyncHttpResponse(response=_response, data=_data) if _response.status_code == 400: raise BadRequestError( headers=dict(_response.headers), @@ -395,38 +1086,49 @@ def list_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def get_migration( - self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> HttpResponse[GetMigrationResponse]: + async def retry_company_migration( + self, plan_version_company_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[RetryCompanyMigrationResponse]: """ Parameters ---------- - plan_version_migration_id : str - plan_version_migration_id + plan_version_company_migration_id : str + plan_version_company_migration_id request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - HttpResponse[GetMigrationResponse] + AsyncHttpResponse[RetryCompanyMigrationResponse] OK """ - _response = self._client_wrapper.httpx_client.request( - f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}", - method="GET", + _response = await self._client_wrapper.httpx_client.request( + f"plan-version-company-migrations/{jsonable_encoder(plan_version_company_migration_id)}/retry", + method="POST", request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GetMigrationResponse, + RetryCompanyMigrationResponse, parse_obj_as( - type_=GetMigrationResponse, # type: ignore + type_=RetryCompanyMigrationResponse, # type: ignore object_=_response.json(), ), ) - return HttpResponse(response=_response, data=_data) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -484,21 +1186,24 @@ def get_migration( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - def count_migrations( + async def count_company_migrations( self, *, - plan_version_id: typing.Optional[str] = None, - status: typing.Optional[PlanVersionMigrationStatus] = None, + migration_id: typing.Optional[str] = None, + q: typing.Optional[str] = None, + status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[CountMigrationsResponse]: + ) -> AsyncHttpResponse[CountCompanyMigrationsResponse]: """ Parameters ---------- - plan_version_id : typing.Optional[str] + migration_id : typing.Optional[str] - status : typing.Optional[PlanVersionMigrationStatus] + q : typing.Optional[str] + + status : typing.Optional[PlanVersionCompanyMigrationStatus] limit : typing.Optional[int] Page limit (default 100) @@ -511,14 +1216,15 @@ def count_migrations( Returns ------- - HttpResponse[CountMigrationsResponse] + AsyncHttpResponse[CountCompanyMigrationsResponse] OK """ - _response = self._client_wrapper.httpx_client.request( - "plan-version-migrations/count", + _response = await self._client_wrapper.httpx_client.request( + "plan-version-company-migrations/count", method="GET", params={ - "plan_version_id": plan_version_id, + "migration_id": migration_id, + "q": q, "status": status, "limit": limit, "offset": offset, @@ -528,13 +1234,13 @@ def count_migrations( try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountMigrationsResponse, + CountCompanyMigrationsResponse, parse_obj_as( - type_=CountMigrationsResponse, # type: ignore + type_=CountCompanyMigrationsResponse, # type: ignore object_=_response.json(), ), ) - return HttpResponse(response=_response, data=_data) + return AsyncHttpResponse(response=_response, data=_data) if _response.status_code == 400: raise BadRequestError( headers=dict(_response.headers), @@ -603,29 +1309,21 @@ def count_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - -class AsyncRawPlanmigrationsClient: - def __init__(self, *, client_wrapper: AsyncClientWrapper): - self._client_wrapper = client_wrapper - - async def list_company_migrations( + async def list_migrations( self, *, - migration_id: typing.Optional[str] = None, - q: typing.Optional[str] = None, - status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, + plan_version_id: typing.Optional[str] = None, + status: typing.Optional[PlanVersionMigrationStatus] = None, limit: typing.Optional[int] = None, offset: typing.Optional[int] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListCompanyMigrationsResponse]: + ) -> AsyncHttpResponse[ListMigrationsResponse]: """ Parameters ---------- - migration_id : typing.Optional[str] - - q : typing.Optional[str] + plan_version_id : typing.Optional[str] - status : typing.Optional[PlanVersionCompanyMigrationStatus] + status : typing.Optional[PlanVersionMigrationStatus] limit : typing.Optional[int] Page limit (default 100) @@ -638,15 +1336,14 @@ async def list_company_migrations( Returns ------- - AsyncHttpResponse[ListCompanyMigrationsResponse] + AsyncHttpResponse[ListMigrationsResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "plan-version-company-migrations", + "plan-version-migrations", method="GET", params={ - "migration_id": migration_id, - "q": q, + "plan_version_id": plan_version_id, "status": status, "limit": limit, "offset": offset, @@ -656,9 +1353,9 @@ async def list_company_migrations( try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListCompanyMigrationsResponse, + ListMigrationsResponse, parse_obj_as( - type_=ListCompanyMigrationsResponse, # type: ignore + type_=ListMigrationsResponse, # type: ignore object_=_response.json(), ), ) @@ -731,57 +1428,67 @@ async def list_company_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def count_company_migrations( + async def create_migration( self, *, - migration_id: typing.Optional[str] = None, - q: typing.Optional[str] = None, - status: typing.Optional[PlanVersionCompanyMigrationStatus] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, + company_ids: typing.Sequence[str], + excluded_company_ids: typing.Sequence[str], + plan_id: str, + plan_version_id_to: str, + plan_version_ids_from: typing.Sequence[str], + strategy: PlanVersionMigrationStrategy, + target_plan_type: PlanType, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[CountCompanyMigrationsResponse]: + ) -> AsyncHttpResponse[CreateMigrationResponse]: """ Parameters ---------- - migration_id : typing.Optional[str] + company_ids : typing.Sequence[str] - q : typing.Optional[str] + excluded_company_ids : typing.Sequence[str] - status : typing.Optional[PlanVersionCompanyMigrationStatus] + plan_id : str - limit : typing.Optional[int] - Page limit (default 100) + plan_version_id_to : str - offset : typing.Optional[int] - Page offset (default 0) + plan_version_ids_from : typing.Sequence[str] + + strategy : PlanVersionMigrationStrategy + + target_plan_type : PlanType request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[CountCompanyMigrationsResponse] - OK + AsyncHttpResponse[CreateMigrationResponse] + Created """ _response = await self._client_wrapper.httpx_client.request( - "plan-version-company-migrations/count", - method="GET", - params={ - "migration_id": migration_id, - "q": q, - "status": status, - "limit": limit, - "offset": offset, + "plan-version-migrations", + method="POST", + json={ + "company_ids": company_ids, + "excluded_company_ids": excluded_company_ids, + "plan_id": plan_id, + "plan_version_id_to": plan_version_id_to, + "plan_version_ids_from": plan_version_ids_from, + "strategy": strategy, + "target_plan_type": target_plan_type, + }, + headers={ + "content-type": "application/json", }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - CountCompanyMigrationsResponse, + CreateMigrationResponse, parse_obj_as( - type_=CountCompanyMigrationsResponse, # type: ignore + type_=CreateMigrationResponse, # type: ignore object_=_response.json(), ), ) @@ -854,68 +1561,38 @@ async def count_company_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def list_migrations( - self, - *, - plan_version_id: typing.Optional[str] = None, - status: typing.Optional[PlanVersionMigrationStatus] = None, - limit: typing.Optional[int] = None, - offset: typing.Optional[int] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[ListMigrationsResponse]: + async def get_migration( + self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetMigrationResponse]: """ Parameters ---------- - plan_version_id : typing.Optional[str] - - status : typing.Optional[PlanVersionMigrationStatus] - - limit : typing.Optional[int] - Page limit (default 100) - - offset : typing.Optional[int] - Page offset (default 0) + plan_version_migration_id : str + plan_version_migration_id request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[ListMigrationsResponse] + AsyncHttpResponse[GetMigrationResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - "plan-version-migrations", + f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}", method="GET", - params={ - "plan_version_id": plan_version_id, - "status": status, - "limit": limit, - "offset": offset, - }, request_options=request_options, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - ListMigrationsResponse, + GetMigrationResponse, parse_obj_as( - type_=ListMigrationsResponse, # type: ignore + type_=GetMigrationResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), @@ -973,38 +1650,62 @@ async def list_migrations( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) - async def get_migration( - self, plan_version_migration_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[GetMigrationResponse]: + async def retry_migration( + self, + plan_version_migration_id: str, + *, + error_codes: typing.Sequence[MigrationErrorCode], + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[RetryMigrationResponse]: """ Parameters ---------- plan_version_migration_id : str plan_version_migration_id + error_codes : typing.Sequence[MigrationErrorCode] + request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[GetMigrationResponse] + AsyncHttpResponse[RetryMigrationResponse] OK """ _response = await self._client_wrapper.httpx_client.request( - f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}", - method="GET", + f"plan-version-migrations/{jsonable_encoder(plan_version_migration_id)}/retry", + method="POST", + json={ + "error_codes": error_codes, + }, + headers={ + "content-type": "application/json", + }, request_options=request_options, + omit=OMIT, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - GetMigrationResponse, + RetryMigrationResponse, parse_obj_as( - type_=GetMigrationResponse, # type: ignore + type_=RetryMigrationResponse, # type: ignore object_=_response.json(), ), ) return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) if _response.status_code == 401: raise UnauthorizedError( headers=dict(_response.headers), diff --git a/src/schematic/planmigrations/types/__init__.py b/src/schematic/planmigrations/types/__init__.py index 75332fc..196e330 100644 --- a/src/schematic/planmigrations/types/__init__.py +++ b/src/schematic/planmigrations/types/__init__.py @@ -10,21 +10,27 @@ from .count_company_migrations_response import CountCompanyMigrationsResponse from .count_migrations_params import CountMigrationsParams from .count_migrations_response import CountMigrationsResponse + from .create_migration_response import CreateMigrationResponse from .get_migration_response import GetMigrationResponse from .list_company_migrations_params import ListCompanyMigrationsParams from .list_company_migrations_response import ListCompanyMigrationsResponse from .list_migrations_params import ListMigrationsParams from .list_migrations_response import ListMigrationsResponse + from .retry_company_migration_response import RetryCompanyMigrationResponse + from .retry_migration_response import RetryMigrationResponse _dynamic_imports: typing.Dict[str, str] = { "CountCompanyMigrationsParams": ".count_company_migrations_params", "CountCompanyMigrationsResponse": ".count_company_migrations_response", "CountMigrationsParams": ".count_migrations_params", "CountMigrationsResponse": ".count_migrations_response", + "CreateMigrationResponse": ".create_migration_response", "GetMigrationResponse": ".get_migration_response", "ListCompanyMigrationsParams": ".list_company_migrations_params", "ListCompanyMigrationsResponse": ".list_company_migrations_response", "ListMigrationsParams": ".list_migrations_params", "ListMigrationsResponse": ".list_migrations_response", + "RetryCompanyMigrationResponse": ".retry_company_migration_response", + "RetryMigrationResponse": ".retry_migration_response", } @@ -54,9 +60,12 @@ def __dir__(): "CountCompanyMigrationsResponse", "CountMigrationsParams", "CountMigrationsResponse", + "CreateMigrationResponse", "GetMigrationResponse", "ListCompanyMigrationsParams", "ListCompanyMigrationsResponse", "ListMigrationsParams", "ListMigrationsResponse", + "RetryCompanyMigrationResponse", + "RetryMigrationResponse", ] diff --git a/src/schematic/planmigrations/types/create_migration_response.py b/src/schematic/planmigrations/types/create_migration_response.py new file mode 100644 index 0000000..d21a8c6 --- /dev/null +++ b/src/schematic/planmigrations/types/create_migration_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.plan_version_migration_response_data import PlanVersionMigrationResponseData + + +class CreateMigrationResponse(UniversalBaseModel): + data: PlanVersionMigrationResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/planmigrations/types/retry_company_migration_response.py b/src/schematic/planmigrations/types/retry_company_migration_response.py new file mode 100644 index 0000000..56e27fc --- /dev/null +++ b/src/schematic/planmigrations/types/retry_company_migration_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.plan_version_company_migration_response_data import PlanVersionCompanyMigrationResponseData + + +class RetryCompanyMigrationResponse(UniversalBaseModel): + data: PlanVersionCompanyMigrationResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/planmigrations/types/retry_migration_response.py b/src/schematic/planmigrations/types/retry_migration_response.py new file mode 100644 index 0000000..2c07ebe --- /dev/null +++ b/src/schematic/planmigrations/types/retry_migration_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.plan_version_migration_response_data import PlanVersionMigrationResponseData + + +class RetryMigrationResponse(UniversalBaseModel): + data: PlanVersionMigrationResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/plans/__init__.py b/src/schematic/plans/__init__.py index ef40e49..65c3442 100644 --- a/src/schematic/plans/__init__.py +++ b/src/schematic/plans/__init__.py @@ -26,6 +26,7 @@ ListPlanIssuesResponse, ListPlansParams, ListPlansResponse, + MarkCustomPlanBillingPaidResponse, PublishPlanVersionResponse, RetryCustomPlanBillingResponse, UpdateCompanyPlansResponse, @@ -53,6 +54,7 @@ "ListPlanIssuesResponse": ".types", "ListPlansParams": ".types", "ListPlansResponse": ".types", + "MarkCustomPlanBillingPaidResponse": ".types", "PublishPlanVersionResponse": ".types", "RetryCustomPlanBillingResponse": ".types", "UpdateCompanyPlansResponse": ".types", @@ -103,6 +105,7 @@ def __dir__(): "ListPlanIssuesResponse", "ListPlansParams", "ListPlansResponse", + "MarkCustomPlanBillingPaidResponse", "PublishPlanVersionResponse", "RetryCustomPlanBillingResponse", "UpdateCompanyPlansResponse", diff --git a/src/schematic/plans/client.py b/src/schematic/plans/client.py index 16ba1f2..94061e8 100644 --- a/src/schematic/plans/client.py +++ b/src/schematic/plans/client.py @@ -5,9 +5,11 @@ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.request_options import RequestOptions from ..types.billing_provider_type import BillingProviderType +from ..types.billing_strategy import BillingStrategy from ..types.charge_type import ChargeType from ..types.custom_plan_activation_strategy import CustomPlanActivationStrategy from ..types.custom_plan_billing_status import CustomPlanBillingStatus +from ..types.mark_custom_plan_billing_paid_request_body import MarkCustomPlanBillingPaidRequestBody from ..types.plan_currency_price_request_body import PlanCurrencyPriceRequestBody from ..types.plan_icon import PlanIcon from ..types.plan_type import PlanType @@ -25,6 +27,7 @@ from .types.list_custom_plan_billings_response import ListCustomPlanBillingsResponse from .types.list_plan_issues_response import ListPlanIssuesResponse from .types.list_plans_response import ListPlansResponse +from .types.mark_custom_plan_billing_paid_response import MarkCustomPlanBillingPaidResponse from .types.publish_plan_version_response import PublishPlanVersionResponse from .types.retry_custom_plan_billing_response import RetryCustomPlanBillingResponse from .types.update_company_plans_response import UpdateCompanyPlansResponse @@ -163,6 +166,46 @@ def list_custom_plan_billings( ) return _response.data + def mark_custom_plan_billing_paid( + self, + custom_plan_billing_id: str, + *, + request: MarkCustomPlanBillingPaidRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> MarkCustomPlanBillingPaidResponse: + """ + Parameters + ---------- + custom_plan_billing_id : str + custom_plan_billing_id + + request : MarkCustomPlanBillingPaidRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + MarkCustomPlanBillingPaidResponse + OK + + Examples + -------- + from schematic import Schematic + + client = Schematic( + api_key="YOUR_API_KEY", + ) + client.plans.mark_custom_plan_billing_paid( + custom_plan_billing_id="custom_plan_billing_id", + request={"key": "value"}, + ) + """ + _response = self._raw_client.mark_custom_plan_billing_paid( + custom_plan_billing_id, request=request, request_options=request_options + ) + return _response.data + def retry_custom_plan_billing( self, custom_plan_billing_id: str, @@ -292,6 +335,7 @@ def list_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -334,6 +378,9 @@ def list_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -374,6 +421,7 @@ def list_plans( plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -393,6 +441,7 @@ def list_plans( plan_type=plan_type, q=q, scoped_to_company_id=scoped_to_company_id, + with_entitlements=with_entitlements, without_entitlement_for=without_entitlement_for, without_paid_product_id=without_paid_product_id, limit=limit, @@ -570,6 +619,7 @@ def upsert_billing_product_plan( charge_type: ChargeType, is_trialable: bool, billing_product_id: typing.Optional[str] = OMIT, + billing_strategy: typing.Optional[BillingStrategy] = OMIT, currency: typing.Optional[str] = OMIT, currency_prices: typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] = OMIT, monthly_price: typing.Optional[int] = OMIT, @@ -595,6 +645,8 @@ def upsert_billing_product_plan( billing_product_id : typing.Optional[str] + billing_strategy : typing.Optional[BillingStrategy] + currency : typing.Optional[str] currency_prices : typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] @@ -643,6 +695,7 @@ def upsert_billing_product_plan( charge_type=charge_type, is_trialable=is_trialable, billing_product_id=billing_product_id, + billing_strategy=billing_strategy, currency=currency, currency_prices=currency_prices, monthly_price=monthly_price, @@ -703,7 +756,7 @@ def upsert_plan_for_billing_product( api_key="YOUR_API_KEY", ) client.plans.upsert_plan_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", name="name", @@ -839,6 +892,7 @@ def count_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -881,6 +935,9 @@ def count_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -921,6 +978,7 @@ def count_plans( plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -940,6 +998,7 @@ def count_plans( plan_type=plan_type, q=q, scoped_to_company_id=scoped_to_company_id, + with_entitlements=with_entitlements, without_entitlement_for=without_entitlement_for, without_paid_product_id=without_paid_product_id, limit=limit, @@ -1240,6 +1299,54 @@ async def main() -> None: ) return _response.data + async def mark_custom_plan_billing_paid( + self, + custom_plan_billing_id: str, + *, + request: MarkCustomPlanBillingPaidRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> MarkCustomPlanBillingPaidResponse: + """ + Parameters + ---------- + custom_plan_billing_id : str + custom_plan_billing_id + + request : MarkCustomPlanBillingPaidRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + MarkCustomPlanBillingPaidResponse + OK + + Examples + -------- + import asyncio + + from schematic import AsyncSchematic + + client = AsyncSchematic( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.plans.mark_custom_plan_billing_paid( + custom_plan_billing_id="custom_plan_billing_id", + request={"key": "value"}, + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.mark_custom_plan_billing_paid( + custom_plan_billing_id, request=request, request_options=request_options + ) + return _response.data + async def retry_custom_plan_billing( self, custom_plan_billing_id: str, @@ -1385,6 +1492,7 @@ async def list_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -1427,6 +1535,9 @@ async def list_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -1472,6 +1583,7 @@ async def main() -> None: plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -1494,6 +1606,7 @@ async def main() -> None: plan_type=plan_type, q=q, scoped_to_company_id=scoped_to_company_id, + with_entitlements=with_entitlements, without_entitlement_for=without_entitlement_for, without_paid_product_id=without_paid_product_id, limit=limit, @@ -1705,6 +1818,7 @@ async def upsert_billing_product_plan( charge_type: ChargeType, is_trialable: bool, billing_product_id: typing.Optional[str] = OMIT, + billing_strategy: typing.Optional[BillingStrategy] = OMIT, currency: typing.Optional[str] = OMIT, currency_prices: typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] = OMIT, monthly_price: typing.Optional[int] = OMIT, @@ -1730,6 +1844,8 @@ async def upsert_billing_product_plan( billing_product_id : typing.Optional[str] + billing_strategy : typing.Optional[BillingStrategy] + currency : typing.Optional[str] currency_prices : typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] @@ -1786,6 +1902,7 @@ async def main() -> None: charge_type=charge_type, is_trialable=is_trialable, billing_product_id=billing_product_id, + billing_strategy=billing_strategy, currency=currency, currency_prices=currency_prices, monthly_price=monthly_price, @@ -1851,7 +1968,7 @@ async def upsert_plan_for_billing_product( async def main() -> None: await client.plans.upsert_plan_for_billing_product( - billing_provider="orb", + billing_provider="metronome", description="description", external_resource_id="external_resource_id", name="name", @@ -2006,6 +2123,7 @@ async def count_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -2048,6 +2166,9 @@ async def count_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -2093,6 +2214,7 @@ async def main() -> None: plan_type="plan", q="q", scoped_to_company_id="scoped_to_company_id", + with_entitlements=True, without_entitlement_for="without_entitlement_for", without_paid_product_id=True, limit=1000000, @@ -2115,6 +2237,7 @@ async def main() -> None: plan_type=plan_type, q=q, scoped_to_company_id=scoped_to_company_id, + with_entitlements=with_entitlements, without_entitlement_for=without_entitlement_for, without_paid_product_id=without_paid_product_id, limit=limit, diff --git a/src/schematic/plans/raw_client.py b/src/schematic/plans/raw_client.py index 9c7def3..90bbe06 100644 --- a/src/schematic/plans/raw_client.py +++ b/src/schematic/plans/raw_client.py @@ -18,9 +18,11 @@ from ..errors.unauthorized_error import UnauthorizedError from ..types.api_error import ApiError as types_api_error_ApiError from ..types.billing_provider_type import BillingProviderType +from ..types.billing_strategy import BillingStrategy from ..types.charge_type import ChargeType from ..types.custom_plan_activation_strategy import CustomPlanActivationStrategy from ..types.custom_plan_billing_status import CustomPlanBillingStatus +from ..types.mark_custom_plan_billing_paid_request_body import MarkCustomPlanBillingPaidRequestBody from ..types.plan_currency_price_request_body import PlanCurrencyPriceRequestBody from ..types.plan_icon import PlanIcon from ..types.plan_type import PlanType @@ -37,6 +39,7 @@ from .types.list_custom_plan_billings_response import ListCustomPlanBillingsResponse from .types.list_plan_issues_response import ListPlanIssuesResponse from .types.list_plans_response import ListPlansResponse +from .types.mark_custom_plan_billing_paid_response import MarkCustomPlanBillingPaidResponse from .types.publish_plan_version_response import PublishPlanVersionResponse from .types.retry_custom_plan_billing_response import RetryCustomPlanBillingResponse from .types.update_company_plans_response import UpdateCompanyPlansResponse @@ -303,6 +306,117 @@ def list_custom_plan_billings( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def mark_custom_plan_billing_paid( + self, + custom_plan_billing_id: str, + *, + request: MarkCustomPlanBillingPaidRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[MarkCustomPlanBillingPaidResponse]: + """ + Parameters + ---------- + custom_plan_billing_id : str + custom_plan_billing_id + + request : MarkCustomPlanBillingPaidRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[MarkCustomPlanBillingPaidResponse] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"custom-plan-billings/{jsonable_encoder(custom_plan_billing_id)}/mark-paid", + method="PUT", + json=request, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + MarkCustomPlanBillingPaidResponse, + parse_obj_as( + type_=MarkCustomPlanBillingPaidResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def retry_custom_plan_billing( self, custom_plan_billing_id: str, @@ -570,6 +684,7 @@ def list_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -612,6 +727,9 @@ def list_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -648,6 +766,7 @@ def list_plans( "plan_type": plan_type, "q": q, "scoped_to_company_id": scoped_to_company_id, + "with_entitlements": with_entitlements, "without_entitlement_for": without_entitlement_for, "without_paid_product_id": without_paid_product_id, "limit": limit, @@ -1181,6 +1300,7 @@ def upsert_billing_product_plan( charge_type: ChargeType, is_trialable: bool, billing_product_id: typing.Optional[str] = OMIT, + billing_strategy: typing.Optional[BillingStrategy] = OMIT, currency: typing.Optional[str] = OMIT, currency_prices: typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] = OMIT, monthly_price: typing.Optional[int] = OMIT, @@ -1206,6 +1326,8 @@ def upsert_billing_product_plan( billing_product_id : typing.Optional[str] + billing_strategy : typing.Optional[BillingStrategy] + currency : typing.Optional[str] currency_prices : typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] @@ -1241,6 +1363,7 @@ def upsert_billing_product_plan( method="PUT", json={ "billing_product_id": billing_product_id, + "billing_strategy": billing_strategy, "charge_type": charge_type, "currency": currency, "currency_prices": convert_and_respect_annotation_metadata( @@ -1731,6 +1854,7 @@ def count_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -1773,6 +1897,9 @@ def count_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -1809,6 +1936,7 @@ def count_plans( "plan_type": plan_type, "q": q, "scoped_to_company_id": scoped_to_company_id, + "with_entitlements": with_entitlements, "without_entitlement_for": without_entitlement_for, "without_paid_product_id": without_paid_product_id, "limit": limit, @@ -2502,6 +2630,117 @@ async def list_custom_plan_billings( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + async def mark_custom_plan_billing_paid( + self, + custom_plan_billing_id: str, + *, + request: MarkCustomPlanBillingPaidRequestBody, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[MarkCustomPlanBillingPaidResponse]: + """ + Parameters + ---------- + custom_plan_billing_id : str + custom_plan_billing_id + + request : MarkCustomPlanBillingPaidRequestBody + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[MarkCustomPlanBillingPaidResponse] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"custom-plan-billings/{jsonable_encoder(custom_plan_billing_id)}/mark-paid", + method="PUT", + json=request, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + MarkCustomPlanBillingPaidResponse, + parse_obj_as( + type_=MarkCustomPlanBillingPaidResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 500: + raise InternalServerError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + async def retry_custom_plan_billing( self, custom_plan_billing_id: str, @@ -2769,6 +3008,7 @@ async def list_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -2811,6 +3051,9 @@ async def list_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -2847,6 +3090,7 @@ async def list_plans( "plan_type": plan_type, "q": q, "scoped_to_company_id": scoped_to_company_id, + "with_entitlements": with_entitlements, "without_entitlement_for": without_entitlement_for, "without_paid_product_id": without_paid_product_id, "limit": limit, @@ -3380,6 +3624,7 @@ async def upsert_billing_product_plan( charge_type: ChargeType, is_trialable: bool, billing_product_id: typing.Optional[str] = OMIT, + billing_strategy: typing.Optional[BillingStrategy] = OMIT, currency: typing.Optional[str] = OMIT, currency_prices: typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] = OMIT, monthly_price: typing.Optional[int] = OMIT, @@ -3405,6 +3650,8 @@ async def upsert_billing_product_plan( billing_product_id : typing.Optional[str] + billing_strategy : typing.Optional[BillingStrategy] + currency : typing.Optional[str] currency_prices : typing.Optional[typing.Sequence[PlanCurrencyPriceRequestBody]] @@ -3440,6 +3687,7 @@ async def upsert_billing_product_plan( method="PUT", json={ "billing_product_id": billing_product_id, + "billing_strategy": billing_strategy, "charge_type": charge_type, "currency": currency, "currency_prices": convert_and_respect_annotation_metadata( @@ -3930,6 +4178,7 @@ async def count_plans( plan_type: typing.Optional[PlanType] = None, q: typing.Optional[str] = None, scoped_to_company_id: typing.Optional[str] = None, + with_entitlements: typing.Optional[bool] = None, without_entitlement_for: typing.Optional[str] = None, without_paid_product_id: typing.Optional[bool] = None, limit: typing.Optional[int] = None, @@ -3972,6 +4221,9 @@ async def count_plans( scoped_to_company_id : typing.Optional[str] Filter plans scoped to a specific company (custom plans) + with_entitlements : typing.Optional[bool] + Include each plan's entitlements in the response + without_entitlement_for : typing.Optional[str] Filter out plans that already have a plan entitlement for the specified feature ID @@ -4008,6 +4260,7 @@ async def count_plans( "plan_type": plan_type, "q": q, "scoped_to_company_id": scoped_to_company_id, + "with_entitlements": with_entitlements, "without_entitlement_for": without_entitlement_for, "without_paid_product_id": without_paid_product_id, "limit": limit, diff --git a/src/schematic/plans/types/__init__.py b/src/schematic/plans/types/__init__.py index 0d4ae7c..c14c286 100644 --- a/src/schematic/plans/types/__init__.py +++ b/src/schematic/plans/types/__init__.py @@ -25,6 +25,7 @@ from .list_plan_issues_response import ListPlanIssuesResponse from .list_plans_params import ListPlansParams from .list_plans_response import ListPlansResponse + from .mark_custom_plan_billing_paid_response import MarkCustomPlanBillingPaidResponse from .publish_plan_version_response import PublishPlanVersionResponse from .retry_custom_plan_billing_response import RetryCustomPlanBillingResponse from .update_company_plans_response import UpdateCompanyPlansResponse @@ -51,6 +52,7 @@ "ListPlanIssuesResponse": ".list_plan_issues_response", "ListPlansParams": ".list_plans_params", "ListPlansResponse": ".list_plans_response", + "MarkCustomPlanBillingPaidResponse": ".mark_custom_plan_billing_paid_response", "PublishPlanVersionResponse": ".publish_plan_version_response", "RetryCustomPlanBillingResponse": ".retry_custom_plan_billing_response", "UpdateCompanyPlansResponse": ".update_company_plans_response", @@ -101,6 +103,7 @@ def __dir__(): "ListPlanIssuesResponse", "ListPlansParams", "ListPlansResponse", + "MarkCustomPlanBillingPaidResponse", "PublishPlanVersionResponse", "RetryCustomPlanBillingResponse", "UpdateCompanyPlansResponse", diff --git a/src/schematic/plans/types/count_plans_params.py b/src/schematic/plans/types/count_plans_params.py index 0ab901f..325b5f6 100644 --- a/src/schematic/plans/types/count_plans_params.py +++ b/src/schematic/plans/types/count_plans_params.py @@ -70,6 +70,11 @@ class CountPlansParams(UniversalBaseModel): Filter plans scoped to a specific company (custom plans) """ + with_entitlements: typing.Optional[bool] = pydantic.Field(default=None) + """ + Include each plan's entitlements in the response + """ + without_entitlement_for: typing.Optional[str] = pydantic.Field(default=None) """ Filter out plans that already have a plan entitlement for the specified feature ID diff --git a/src/schematic/plans/types/list_plans_params.py b/src/schematic/plans/types/list_plans_params.py index f43ae92..ec1a4fa 100644 --- a/src/schematic/plans/types/list_plans_params.py +++ b/src/schematic/plans/types/list_plans_params.py @@ -70,6 +70,11 @@ class ListPlansParams(UniversalBaseModel): Filter plans scoped to a specific company (custom plans) """ + with_entitlements: typing.Optional[bool] = pydantic.Field(default=None) + """ + Include each plan's entitlements in the response + """ + without_entitlement_for: typing.Optional[str] = pydantic.Field(default=None) """ Filter out plans that already have a plan entitlement for the specified feature ID diff --git a/src/schematic/plans/types/mark_custom_plan_billing_paid_response.py b/src/schematic/plans/types/mark_custom_plan_billing_paid_response.py new file mode 100644 index 0000000..a6c9e98 --- /dev/null +++ b/src/schematic/plans/types/mark_custom_plan_billing_paid_response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ...types.custom_plan_billing_response_data import CustomPlanBillingResponseData + + +class MarkCustomPlanBillingPaidResponse(UniversalBaseModel): + data: CustomPlanBillingResponseData + params: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Input parameters + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/__init__.py b/src/schematic/types/__init__.py index 0daaed6..7c5287f 100644 --- a/src/schematic/types/__init__.py +++ b/src/schematic/types/__init__.py @@ -30,6 +30,7 @@ from .billing_credit_grant_reason import BillingCreditGrantReason from .billing_credit_grant_response_data import BillingCreditGrantResponseData from .billing_credit_grant_zeroed_out_reason import BillingCreditGrantZeroedOutReason + from .billing_credit_ledger_authority import BillingCreditLedgerAuthority from .billing_credit_ledger_response_data import BillingCreditLedgerResponseData from .billing_credit_response_data import BillingCreditResponseData from .billing_credit_rollover_policy import BillingCreditRolloverPolicy @@ -56,6 +57,7 @@ from .billing_product_pricing import BillingProductPricing from .billing_product_response_data import BillingProductResponseData from .billing_provider_type import BillingProviderType + from .billing_strategy import BillingStrategy from .billing_subscription_discount import BillingSubscriptionDiscount from .billing_subscription_discount_view import BillingSubscriptionDiscountView from .billing_subscription_response_data import BillingSubscriptionResponseData @@ -72,6 +74,10 @@ from .check_flags_bulk_response_data import CheckFlagsBulkResponseData from .check_flags_response_data import CheckFlagsResponseData from .checkout_data_response_data import CheckoutDataResponseData + from .checkout_field_input import CheckoutFieldInput + from .checkout_field_response_data import CheckoutFieldResponseData + from .checkout_field_value import CheckoutFieldValue + from .checkout_field_with_value import CheckoutFieldWithValue from .checkout_settings_response_data import CheckoutSettingsResponseData from .checkout_subscription import CheckoutSubscription from .clerk_integration_config import ClerkIntegrationConfig @@ -138,6 +144,7 @@ from .credit_grant_detail import CreditGrantDetail from .credit_grant_expiry_request_body import CreditGrantExpiryRequestBody from .credit_grant_sort_order import CreditGrantSortOrder + from .credit_lease_response_data import CreditLeaseResponseData from .credit_ledger_enriched_entry_response_data import CreditLedgerEnrichedEntryResponseData from .credit_ledger_period import CreditLedgerPeriod from .credit_transfer_response_data import CreditTransferResponseData @@ -145,6 +152,7 @@ from .credit_trigger_config import CreditTriggerConfig from .credit_usage import CreditUsage from .credit_usage_aggregation import CreditUsageAggregation + from .credit_usage_reason import CreditUsageReason from .credits_auto_topup_company_summary import CreditsAutoTopupCompanySummary from .credits_auto_topup_credit_summary import CreditsAutoTopupCreditSummary from .credits_auto_topup_hard_failure import CreditsAutoTopupHardFailure @@ -215,13 +223,18 @@ from .flag_view import FlagView from .generic_preview_object import GenericPreviewObject from .insights_summary_response_data import InsightsSummaryResponseData + from .install_integration_request_body import InstallIntegrationRequestBody from .integration_capabilities import IntegrationCapabilities from .integration_config import ( IntegrationConfig, IntegrationConfig_Clerk, + IntegrationConfig_Metronome, IntegrationConfig_Orb, IntegrationConfig_Stripe, + IntegrationConfig_Workos, ) + from .integration_install_config import IntegrationInstallConfig + from .integration_install_response_data import IntegrationInstallResponseData from .integration_response_data import IntegrationResponseData from .integration_state import IntegrationState from .integration_type import IntegrationType @@ -238,9 +251,12 @@ from .manage_plan_preview_response_response_data import ManagePlanPreviewResponseResponseData from .manage_plan_request import ManagePlanRequest from .manage_plan_response_response_data import ManagePlanResponseResponseData + from .mark_custom_plan_billing_paid_request_body import MarkCustomPlanBillingPaidRequestBody from .meter_request_body import MeterRequestBody from .metric_period import MetricPeriod from .metric_period_month_reset import MetricPeriodMonthReset + from .metronome_integration_config import MetronomeIntegrationConfig + from .migration_error_code import MigrationErrorCode from .mrr_response_data import MrrResponseData from .orb_integration_config import OrbIntegrationConfig from .ordered_plans_in_group import OrderedPlansInGroup @@ -269,6 +285,7 @@ from .plan_growth_response_data import PlanGrowthResponseData from .plan_icon import PlanIcon from .plan_issue_response_data import PlanIssueResponseData + from .plan_price_cadence import PlanPriceCadence from .plan_response_data import PlanResponseData from .plan_selection import PlanSelection from .plan_snapshot_view import PlanSnapshotView @@ -293,6 +310,7 @@ from .quickstart_resp import QuickstartResp from .raw_event_batch_response_data import RawEventBatchResponseData from .raw_event_response_data import RawEventResponseData + from .release_credit_lease_request_body import ReleaseCreditLeaseRequestBody from .rule import Rule from .rule_condition_detail_response_data import RuleConditionDetailResponseData from .rule_condition_group_detail_response_data import RuleConditionGroupDetailResponseData @@ -374,6 +392,7 @@ from .webhook_status import WebhookStatus from .webhook_url import WebhookUrl from .who_am_i_response_data import WhoAmIResponseData + from .work_os_integration_config import WorkOsIntegrationConfig _dynamic_imports: typing.Dict[str, str] = { "AccountMemberPermission": ".account_member_permission", "AccountMemberResponseData": ".account_member_response_data", @@ -399,6 +418,7 @@ "BillingCreditGrantReason": ".billing_credit_grant_reason", "BillingCreditGrantResponseData": ".billing_credit_grant_response_data", "BillingCreditGrantZeroedOutReason": ".billing_credit_grant_zeroed_out_reason", + "BillingCreditLedgerAuthority": ".billing_credit_ledger_authority", "BillingCreditLedgerResponseData": ".billing_credit_ledger_response_data", "BillingCreditResponseData": ".billing_credit_response_data", "BillingCreditRolloverPolicy": ".billing_credit_rollover_policy", @@ -425,6 +445,7 @@ "BillingProductPricing": ".billing_product_pricing", "BillingProductResponseData": ".billing_product_response_data", "BillingProviderType": ".billing_provider_type", + "BillingStrategy": ".billing_strategy", "BillingSubscriptionDiscount": ".billing_subscription_discount", "BillingSubscriptionDiscountView": ".billing_subscription_discount_view", "BillingSubscriptionResponseData": ".billing_subscription_response_data", @@ -441,6 +462,10 @@ "CheckFlagsBulkResponseData": ".check_flags_bulk_response_data", "CheckFlagsResponseData": ".check_flags_response_data", "CheckoutDataResponseData": ".checkout_data_response_data", + "CheckoutFieldInput": ".checkout_field_input", + "CheckoutFieldResponseData": ".checkout_field_response_data", + "CheckoutFieldValue": ".checkout_field_value", + "CheckoutFieldWithValue": ".checkout_field_with_value", "CheckoutSettingsResponseData": ".checkout_settings_response_data", "CheckoutSubscription": ".checkout_subscription", "ClerkIntegrationConfig": ".clerk_integration_config", @@ -507,6 +532,7 @@ "CreditGrantDetail": ".credit_grant_detail", "CreditGrantExpiryRequestBody": ".credit_grant_expiry_request_body", "CreditGrantSortOrder": ".credit_grant_sort_order", + "CreditLeaseResponseData": ".credit_lease_response_data", "CreditLedgerEnrichedEntryResponseData": ".credit_ledger_enriched_entry_response_data", "CreditLedgerPeriod": ".credit_ledger_period", "CreditTransferResponseData": ".credit_transfer_response_data", @@ -514,6 +540,7 @@ "CreditTriggerConfig": ".credit_trigger_config", "CreditUsage": ".credit_usage", "CreditUsageAggregation": ".credit_usage_aggregation", + "CreditUsageReason": ".credit_usage_reason", "CreditsAutoTopupCompanySummary": ".credits_auto_topup_company_summary", "CreditsAutoTopupCreditSummary": ".credits_auto_topup_credit_summary", "CreditsAutoTopupHardFailure": ".credits_auto_topup_hard_failure", @@ -584,11 +611,16 @@ "FlagView": ".flag_view", "GenericPreviewObject": ".generic_preview_object", "InsightsSummaryResponseData": ".insights_summary_response_data", + "InstallIntegrationRequestBody": ".install_integration_request_body", "IntegrationCapabilities": ".integration_capabilities", "IntegrationConfig": ".integration_config", "IntegrationConfig_Clerk": ".integration_config", + "IntegrationConfig_Metronome": ".integration_config", "IntegrationConfig_Orb": ".integration_config", "IntegrationConfig_Stripe": ".integration_config", + "IntegrationConfig_Workos": ".integration_config", + "IntegrationInstallConfig": ".integration_install_config", + "IntegrationInstallResponseData": ".integration_install_response_data", "IntegrationResponseData": ".integration_response_data", "IntegrationState": ".integration_state", "IntegrationType": ".integration_type", @@ -605,9 +637,12 @@ "ManagePlanPreviewResponseResponseData": ".manage_plan_preview_response_response_data", "ManagePlanRequest": ".manage_plan_request", "ManagePlanResponseResponseData": ".manage_plan_response_response_data", + "MarkCustomPlanBillingPaidRequestBody": ".mark_custom_plan_billing_paid_request_body", "MeterRequestBody": ".meter_request_body", "MetricPeriod": ".metric_period", "MetricPeriodMonthReset": ".metric_period_month_reset", + "MetronomeIntegrationConfig": ".metronome_integration_config", + "MigrationErrorCode": ".migration_error_code", "MrrResponseData": ".mrr_response_data", "OrbIntegrationConfig": ".orb_integration_config", "OrderedPlansInGroup": ".ordered_plans_in_group", @@ -636,6 +671,7 @@ "PlanGrowthResponseData": ".plan_growth_response_data", "PlanIcon": ".plan_icon", "PlanIssueResponseData": ".plan_issue_response_data", + "PlanPriceCadence": ".plan_price_cadence", "PlanResponseData": ".plan_response_data", "PlanSelection": ".plan_selection", "PlanSnapshotView": ".plan_snapshot_view", @@ -660,6 +696,7 @@ "QuickstartResp": ".quickstart_resp", "RawEventBatchResponseData": ".raw_event_batch_response_data", "RawEventResponseData": ".raw_event_response_data", + "ReleaseCreditLeaseRequestBody": ".release_credit_lease_request_body", "Rule": ".rule", "RuleConditionDetailResponseData": ".rule_condition_detail_response_data", "RuleConditionGroupDetailResponseData": ".rule_condition_group_detail_response_data", @@ -741,6 +778,7 @@ "WebhookStatus": ".webhook_status", "WebhookUrl": ".webhook_url", "WhoAmIResponseData": ".who_am_i_response_data", + "WorkOsIntegrationConfig": ".work_os_integration_config", } @@ -790,6 +828,7 @@ def __dir__(): "BillingCreditGrantReason", "BillingCreditGrantResponseData", "BillingCreditGrantZeroedOutReason", + "BillingCreditLedgerAuthority", "BillingCreditLedgerResponseData", "BillingCreditResponseData", "BillingCreditRolloverPolicy", @@ -816,6 +855,7 @@ def __dir__(): "BillingProductPricing", "BillingProductResponseData", "BillingProviderType", + "BillingStrategy", "BillingSubscriptionDiscount", "BillingSubscriptionDiscountView", "BillingSubscriptionResponseData", @@ -832,6 +872,10 @@ def __dir__(): "CheckFlagsBulkResponseData", "CheckFlagsResponseData", "CheckoutDataResponseData", + "CheckoutFieldInput", + "CheckoutFieldResponseData", + "CheckoutFieldValue", + "CheckoutFieldWithValue", "CheckoutSettingsResponseData", "CheckoutSubscription", "ClerkIntegrationConfig", @@ -898,6 +942,7 @@ def __dir__(): "CreditGrantDetail", "CreditGrantExpiryRequestBody", "CreditGrantSortOrder", + "CreditLeaseResponseData", "CreditLedgerEnrichedEntryResponseData", "CreditLedgerPeriod", "CreditTransferResponseData", @@ -905,6 +950,7 @@ def __dir__(): "CreditTriggerConfig", "CreditUsage", "CreditUsageAggregation", + "CreditUsageReason", "CreditsAutoTopupCompanySummary", "CreditsAutoTopupCreditSummary", "CreditsAutoTopupHardFailure", @@ -975,11 +1021,16 @@ def __dir__(): "FlagView", "GenericPreviewObject", "InsightsSummaryResponseData", + "InstallIntegrationRequestBody", "IntegrationCapabilities", "IntegrationConfig", "IntegrationConfig_Clerk", + "IntegrationConfig_Metronome", "IntegrationConfig_Orb", "IntegrationConfig_Stripe", + "IntegrationConfig_Workos", + "IntegrationInstallConfig", + "IntegrationInstallResponseData", "IntegrationResponseData", "IntegrationState", "IntegrationType", @@ -996,9 +1047,12 @@ def __dir__(): "ManagePlanPreviewResponseResponseData", "ManagePlanRequest", "ManagePlanResponseResponseData", + "MarkCustomPlanBillingPaidRequestBody", "MeterRequestBody", "MetricPeriod", "MetricPeriodMonthReset", + "MetronomeIntegrationConfig", + "MigrationErrorCode", "MrrResponseData", "OrbIntegrationConfig", "OrderedPlansInGroup", @@ -1027,6 +1081,7 @@ def __dir__(): "PlanGrowthResponseData", "PlanIcon", "PlanIssueResponseData", + "PlanPriceCadence", "PlanResponseData", "PlanSelection", "PlanSnapshotView", @@ -1051,6 +1106,7 @@ def __dir__(): "QuickstartResp", "RawEventBatchResponseData", "RawEventResponseData", + "ReleaseCreditLeaseRequestBody", "Rule", "RuleConditionDetailResponseData", "RuleConditionGroupDetailResponseData", @@ -1132,4 +1188,5 @@ def __dir__(): "WebhookStatus", "WebhookUrl", "WhoAmIResponseData", + "WorkOsIntegrationConfig", ] diff --git a/src/schematic/types/account_member_response_data.py b/src/schematic/types/account_member_response_data.py index e4e8921..87cf637 100644 --- a/src/schematic/types/account_member_response_data.py +++ b/src/schematic/types/account_member_response_data.py @@ -12,8 +12,10 @@ class AccountMemberResponseData(UniversalBaseModel): created_at: dt.datetime email: typing.Optional[str] = None + first_name: typing.Optional[str] = None id: str image_url: typing.Optional[str] = None + last_name: typing.Optional[str] = None name: typing.Optional[str] = None permissions: typing.Dict[str, typing.List[AccountMemberPermission]] role: typing.Optional[AccountMemberRole] = None diff --git a/src/schematic/types/billing_credit_grant_reason.py b/src/schematic/types/billing_credit_grant_reason.py index 7da59d5..4da4bd7 100644 --- a/src/schematic/types/billing_credit_grant_reason.py +++ b/src/schematic/types/billing_credit_grant_reason.py @@ -3,5 +3,5 @@ import typing BillingCreditGrantReason = typing.Union[ - typing.Literal["adjustment", "billing_credit_auto_topup", "free", "plan", "purchased"], typing.Any + typing.Literal["adjustment", "billing_credit_auto_topup", "free", "plan", "purchased", "rollover"], typing.Any ] diff --git a/src/schematic/types/billing_credit_grant_response_data.py b/src/schematic/types/billing_credit_grant_response_data.py index f4763b7..504db3a 100644 --- a/src/schematic/types/billing_credit_grant_response_data.py +++ b/src/schematic/types/billing_credit_grant_response_data.py @@ -31,6 +31,13 @@ class BillingCreditGrantResponseData(UniversalBaseModel): quantity_used: float renewal_enabled: bool renewal_period: typing.Optional[BillingPlanCreditGrantResetCadence] = None + reserved: typing.Optional[float] = None + settled: typing.Optional[float] = None + source_grant_id: typing.Optional[str] = pydantic.Field(default=None) + """ + For rollover grants, the ID of the source grant that this grant rolled from. + """ + source_label: str transfers: typing.Optional[typing.List[CreditTransferResponseData]] = None updated_at: dt.datetime diff --git a/src/schematic/types/billing_credit_ledger_authority.py b/src/schematic/types/billing_credit_ledger_authority.py new file mode 100644 index 0000000..f5730c6 --- /dev/null +++ b/src/schematic/types/billing_credit_ledger_authority.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +BillingCreditLedgerAuthority = typing.Union[ + typing.Literal["schematic_authoritative", "external_mirror", "external_rated"], typing.Any +] diff --git a/src/schematic/types/billing_credit_view.py b/src/schematic/types/billing_credit_view.py index b4dca66..75cadc1 100644 --- a/src/schematic/types/billing_credit_view.py +++ b/src/schematic/types/billing_credit_view.py @@ -7,6 +7,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_credit_burn_strategy import BillingCreditBurnStrategy from .billing_credit_expiry_unit import BillingCreditExpiryUnit +from .billing_credit_ledger_authority import BillingCreditLedgerAuthority from .billing_credit_rollover_policy import BillingCreditRolloverPolicy from .billing_price_view import BillingPriceView from .billing_product_response_data import BillingProductResponseData @@ -26,6 +27,7 @@ class BillingCreditView(UniversalBaseModel): environment_id: str icon: typing.Optional[str] = None id: str + ledger_authority: BillingCreditLedgerAuthority name: str plural_name: typing.Optional[str] = None price: typing.Optional[BillingPriceView] = None diff --git a/src/schematic/types/billing_plan_credit_grant_response_data.py b/src/schematic/types/billing_plan_credit_grant_response_data.py index d026dda..22daee9 100644 --- a/src/schematic/types/billing_plan_credit_grant_response_data.py +++ b/src/schematic/types/billing_plan_credit_grant_response_data.py @@ -58,6 +58,11 @@ class BillingPlanCreditGrantResponseData(UniversalBaseModel): reset_cadence: typing.Optional[BillingPlanCreditGrantResetCadence] = None reset_start: typing.Optional[BillingPlanCreditGrantResetStart] = None reset_type: typing.Optional[BillingPlanCreditGrantResetType] = None + rollover_percentage: int = pydantic.Field() + """ + Percentage of unused credits that carry over when this grant resets. Only meaningful when reset_type is plan_period. + """ + updated_at: dt.datetime if IS_PYDANTIC_V2: diff --git a/src/schematic/types/billing_product_plan_response_data.py b/src/schematic/types/billing_product_plan_response_data.py index ce5dddd..0ab4e49 100644 --- a/src/schematic/types/billing_product_plan_response_data.py +++ b/src/schematic/types/billing_product_plan_response_data.py @@ -5,12 +5,14 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_provider_type import BillingProviderType +from .billing_strategy import BillingStrategy from .charge_type import ChargeType class BillingProductPlanResponseData(UniversalBaseModel): account_id: str billing_product_id: str + billing_strategy: BillingStrategy charge_type: ChargeType controlled_by: BillingProviderType environment_id: str diff --git a/src/schematic/types/billing_provider_type.py b/src/schematic/types/billing_provider_type.py index 889b1f1..748972f 100644 --- a/src/schematic/types/billing_provider_type.py +++ b/src/schematic/types/billing_provider_type.py @@ -2,4 +2,4 @@ import typing -BillingProviderType = typing.Union[typing.Literal["orb", "schematic", "stripe"], typing.Any] +BillingProviderType = typing.Union[typing.Literal["metronome", "orb", "schematic", "stripe"], typing.Any] diff --git a/src/schematic/types/billing_strategy.py b/src/schematic/types/billing_strategy.py new file mode 100644 index 0000000..00eb3ec --- /dev/null +++ b/src/schematic/types/billing_strategy.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +BillingStrategy = typing.Union[typing.Literal["schematic_managed", "provider_managed", "no_billing"], typing.Any] diff --git a/src/schematic/types/change_subscription_internal_request_body.py b/src/schematic/types/change_subscription_internal_request_body.py index 37d09f0..18d7f2b 100644 --- a/src/schematic/types/change_subscription_internal_request_body.py +++ b/src/schematic/types/change_subscription_internal_request_body.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .checkout_field_value import CheckoutFieldValue from .update_add_on_request_body import UpdateAddOnRequestBody from .update_auto_topup_override_request_body import UpdateAutoTopupOverrideRequestBody from .update_credit_bundle_request_body import UpdateCreditBundleRequestBody @@ -16,6 +17,7 @@ class ChangeSubscriptionInternalRequestBody(UniversalBaseModel): company_id: str coupon_external_id: typing.Optional[str] = None credit_bundles: typing.List[UpdateCreditBundleRequestBody] + custom_field_values: typing.List[CheckoutFieldValue] new_plan_id: str new_price_id: str pay_in_advance: typing.List[UpdatePayInAdvanceRequestBody] diff --git a/src/schematic/types/change_subscription_request_body.py b/src/schematic/types/change_subscription_request_body.py index 50079f0..16fdd42 100644 --- a/src/schematic/types/change_subscription_request_body.py +++ b/src/schematic/types/change_subscription_request_body.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .checkout_field_value import CheckoutFieldValue from .update_add_on_request_body import UpdateAddOnRequestBody from .update_auto_topup_override_request_body import UpdateAutoTopupOverrideRequestBody from .update_credit_bundle_request_body import UpdateCreditBundleRequestBody @@ -15,6 +16,7 @@ class ChangeSubscriptionRequestBody(UniversalBaseModel): auto_topup_overrides: typing.List[UpdateAutoTopupOverrideRequestBody] coupon_external_id: typing.Optional[str] = None credit_bundles: typing.List[UpdateCreditBundleRequestBody] + custom_field_values: typing.List[CheckoutFieldValue] new_plan_id: str new_price_id: str pay_in_advance: typing.List[UpdatePayInAdvanceRequestBody] diff --git a/src/schematic/types/charge_type.py b/src/schematic/types/charge_type.py index 03d40e9..35d2099 100644 --- a/src/schematic/types/charge_type.py +++ b/src/schematic/types/charge_type.py @@ -2,4 +2,4 @@ import typing -ChargeType = typing.Union[typing.Literal["free", "one_time", "recurring"], typing.Any] +ChargeType = typing.Union[typing.Literal["free", "none", "one_time", "recurring"], typing.Any] diff --git a/src/schematic/types/checkout_data_response_data.py b/src/schematic/types/checkout_data_response_data.py index 0cb0ab0..67d2f46 100644 --- a/src/schematic/types/checkout_data_response_data.py +++ b/src/schematic/types/checkout_data_response_data.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_credit_bundle_response_data import BillingCreditBundleResponseData +from .checkout_field_with_value import CheckoutFieldWithValue from .company_detail_response_data import CompanyDetailResponseData from .company_subscription_response_data import CompanySubscriptionResponseData from .credit_bundle_purchase_response_data import CreditBundlePurchaseResponseData @@ -19,6 +20,7 @@ class CheckoutDataResponseData(UniversalBaseModel): active_usage_based_entitlements: typing.List[UsageBasedEntitlementResponseData] available_credit_bundles: typing.List[BillingCreditBundleResponseData] company: typing.Optional[CompanyDetailResponseData] = None + custom_checkout_fields: typing.List[CheckoutFieldWithValue] feature_usage: typing.Optional[FeatureUsageDetailResponseData] = None selected_credit_bundles: typing.List[CreditBundlePurchaseResponseData] selected_plan: typing.Optional[PlanDetailResponseData] = None diff --git a/src/schematic/types/checkout_field_input.py b/src/schematic/types/checkout_field_input.py new file mode 100644 index 0000000..eb34c57 --- /dev/null +++ b/src/schematic/types/checkout_field_input.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CheckoutFieldInput(UniversalBaseModel): + definition_id: typing.Optional[str] = None + helper_text: typing.Optional[str] = None + id: typing.Optional[str] = None + name: str + required: bool + stripe_metadata_key: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/checkout_field_response_data.py b/src/schematic/types/checkout_field_response_data.py new file mode 100644 index 0000000..cdb164f --- /dev/null +++ b/src/schematic/types/checkout_field_response_data.py @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import datetime as dt +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CheckoutFieldResponseData(UniversalBaseModel): + created_at: dt.datetime + definition_id: str + helper_text: typing.Optional[str] = None + id: str + name: str + position: int + required: bool + stripe_metadata_key: str + trait_hierarchy: typing.List[str] + updated_at: dt.datetime + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/checkout_field_value.py b/src/schematic/types/checkout_field_value.py new file mode 100644 index 0000000..260dcb9 --- /dev/null +++ b/src/schematic/types/checkout_field_value.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CheckoutFieldValue(UniversalBaseModel): + id: str + value: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/checkout_field_with_value.py b/src/schematic/types/checkout_field_with_value.py new file mode 100644 index 0000000..ad8b216 --- /dev/null +++ b/src/schematic/types/checkout_field_with_value.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CheckoutFieldWithValue(UniversalBaseModel): + definition_id: str + helper_text: typing.Optional[str] = None + id: str + name: str + required: bool + stripe_metadata_key: str + value: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/checkout_subscription.py b/src/schematic/types/checkout_subscription.py index 94930e9..97e5f44 100644 --- a/src/schematic/types/checkout_subscription.py +++ b/src/schematic/types/checkout_subscription.py @@ -23,6 +23,7 @@ class CheckoutSubscription(UniversalBaseModel): expired_at: typing.Optional[dt.datetime] = None id: str interval: str + invoice_id: typing.Optional[str] = None invoice_url: typing.Optional[str] = None metadata: typing.Optional[typing.Dict[str, typing.Any]] = None period_end: int diff --git a/src/schematic/types/company_credit_balance_response_data.py b/src/schematic/types/company_credit_balance_response_data.py index 0abf080..a503374 100644 --- a/src/schematic/types/company_credit_balance_response_data.py +++ b/src/schematic/types/company_credit_balance_response_data.py @@ -10,6 +10,8 @@ class CompanyCreditBalanceResponseData(UniversalBaseModel): credit_id: str remaining: float + reserved: float + settled: float source: BillingProviderType total: typing.Optional[float] = None diff --git a/src/schematic/types/company_plan_credit_grant_view.py b/src/schematic/types/company_plan_credit_grant_view.py index 4ca5df2..b757a6c 100644 --- a/src/schematic/types/company_plan_credit_grant_view.py +++ b/src/schematic/types/company_plan_credit_grant_view.py @@ -61,6 +61,7 @@ class CompanyPlanCreditGrantView(UniversalBaseModel): reset_cadence: typing.Optional[BillingPlanCreditGrantResetCadence] = None reset_start: typing.Optional[BillingPlanCreditGrantResetStart] = None reset_type: BillingPlanCreditGrantResetType + rollover_percentage: int singular_name: typing.Optional[str] = pydantic.Field(default=None) """ Deprecated field, will be removed in the future. Use Credit.SingularName instead. diff --git a/src/schematic/types/company_plan_detail_response_data.py b/src/schematic/types/company_plan_detail_response_data.py index 639f78b..f3b83d4 100644 --- a/src/schematic/types/company_plan_detail_response_data.py +++ b/src/schematic/types/company_plan_detail_response_data.py @@ -9,6 +9,7 @@ from .billing_price_response_data import BillingPriceResponseData from .billing_product_detail_response_data import BillingProductDetailResponseData from .billing_provider_type import BillingProviderType +from .billing_strategy import BillingStrategy from .charge_type import ChargeType from .company_plan_invalid_reason import CompanyPlanInvalidReason from .custom_plan_config import CustomPlanConfig @@ -18,6 +19,7 @@ from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData from .plan_entitlement_response_data import PlanEntitlementResponseData from .plan_icon import PlanIcon +from .plan_price_cadence import PlanPriceCadence from .plan_type import PlanType from .plan_version_response_data import PlanVersionResponseData @@ -25,8 +27,10 @@ class CompanyPlanDetailResponseData(UniversalBaseModel): active_version: typing.Optional[PlanVersionResponseData] = None audience_type: typing.Optional[str] = None + available_periods: typing.List[PlanPriceCadence] billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None billing_product: typing.Optional[BillingProductDetailResponseData] = None + billing_strategy: BillingStrategy charge_type: ChargeType company_can_trial: bool company_count: int @@ -42,7 +46,7 @@ class CompanyPlanDetailResponseData(UniversalBaseModel): custom_plan_config: typing.Optional[CustomPlanConfig] = None description: str draft_version: typing.Optional[PlanVersionResponseData] = None - entitlements: typing.List[PlanEntitlementResponseData] + entitlements: typing.Optional[typing.List[PlanEntitlementResponseData]] = None features: typing.List[FeatureInPlanResponseData] icon: PlanIcon id: str @@ -50,7 +54,11 @@ class CompanyPlanDetailResponseData(UniversalBaseModel): invalid_reason: typing.Optional[CompanyPlanInvalidReason] = None is_custom: bool is_default: bool - is_free: bool + is_free: bool = pydantic.Field() + """ + Deprecated: Use BillingStrategy instead + """ + is_trialable: bool monthly_price: typing.Optional[BillingPriceResponseData] = None name: str diff --git a/src/schematic/types/component_hydrate_response_data.py b/src/schematic/types/component_hydrate_response_data.py index 3c679f0..4fa5e3b 100644 --- a/src/schematic/types/component_hydrate_response_data.py +++ b/src/schematic/types/component_hydrate_response_data.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_credit_bundle_view import BillingCreditBundleView +from .checkout_field_with_value import CheckoutFieldWithValue from .company_detail_response_data import CompanyDetailResponseData from .company_plan_detail_response_data import CompanyPlanDetailResponseData from .company_subscription_response_data import CompanySubscriptionResponseData @@ -33,6 +34,7 @@ class ComponentHydrateResponseData(UniversalBaseModel): component: typing.Optional[ComponentResponseData] = None credit_bundles: typing.List[BillingCreditBundleView] credit_grants: typing.List[CreditCompanyGrantView] + custom_checkout_fields: typing.List[CheckoutFieldWithValue] default_plan: typing.Optional[PlanDetailResponseData] = None display_settings: ComponentDisplaySettings feature_usage: typing.Optional[FeatureUsageDetailResponseData] = None diff --git a/src/schematic/types/component_preview_response_data.py b/src/schematic/types/component_preview_response_data.py index f81e3be..6f6138f 100644 --- a/src/schematic/types/component_preview_response_data.py +++ b/src/schematic/types/component_preview_response_data.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_credit_bundle_view import BillingCreditBundleView +from .checkout_field_with_value import CheckoutFieldWithValue from .company_detail_response_data import CompanyDetailResponseData from .company_plan_detail_response_data import CompanyPlanDetailResponseData from .company_subscription_response_data import CompanySubscriptionResponseData @@ -33,6 +34,7 @@ class ComponentPreviewResponseData(UniversalBaseModel): component: typing.Optional[ComponentResponseData] = None credit_bundles: typing.List[BillingCreditBundleView] credit_grants: typing.List[CreditCompanyGrantView] + custom_checkout_fields: typing.List[CheckoutFieldWithValue] default_plan: typing.Optional[PlanDetailResponseData] = None display_settings: ComponentDisplaySettings feature_usage: typing.Optional[FeatureUsageDetailResponseData] = None diff --git a/src/schematic/types/create_billing_plan_credit_grant_request_body.py b/src/schematic/types/create_billing_plan_credit_grant_request_body.py index 400cd48..b826af5 100644 --- a/src/schematic/types/create_billing_plan_credit_grant_request_body.py +++ b/src/schematic/types/create_billing_plan_credit_grant_request_body.py @@ -33,6 +33,10 @@ class CreateBillingPlanCreditGrantRequestBody(UniversalBaseModel): reset_cadence: BillingPlanCreditGrantResetCadence reset_start: BillingPlanCreditGrantResetStart reset_type: typing.Optional[BillingPlanCreditGrantResetType] = None + rollover_percentage: typing.Optional[int] = pydantic.Field(default=None) + """ + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. Defaults to 0. + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/schematic/types/create_entitlement_in_bundle_request_body.py b/src/schematic/types/create_entitlement_in_bundle_request_body.py index 7422449..db48304 100644 --- a/src/schematic/types/create_entitlement_in_bundle_request_body.py +++ b/src/schematic/types/create_entitlement_in_bundle_request_body.py @@ -41,6 +41,11 @@ class CreateEntitlementInBundleRequestBody(UniversalBaseModel): quarterly_unit_price_decimal: typing.Optional[str] = None soft_limit: typing.Optional[int] = None tier_mode: typing.Optional[BillingTiersMode] = None + usage_quantity: typing.Optional[int] = pydantic.Field(default=None) + """ + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + """ + value_bool: typing.Optional[bool] = None value_credit_id: typing.Optional[str] = None value_numeric: typing.Optional[int] = None diff --git a/src/schematic/types/credit_company_grant_view.py b/src/schematic/types/credit_company_grant_view.py index 03a43e2..d038a95 100644 --- a/src/schematic/types/credit_company_grant_view.py +++ b/src/schematic/types/credit_company_grant_view.py @@ -40,7 +40,10 @@ class CreditCompanyGrantView(UniversalBaseModel): quantity_used: float renewal_enabled: bool renewal_period: typing.Optional[BillingPlanCreditGrantResetCadence] = None + reserved: typing.Optional[float] = None + settled: typing.Optional[float] = None singular_name: typing.Optional[str] = None + source_grant_id: typing.Optional[str] = None source_label: str transfers: typing.Optional[typing.List[CreditTransferView]] = None updated_at: dt.datetime diff --git a/src/schematic/types/credit_event_ledger_response_data.py b/src/schematic/types/credit_event_ledger_response_data.py index 3e86d6e..4bff320 100644 --- a/src/schematic/types/credit_event_ledger_response_data.py +++ b/src/schematic/types/credit_event_ledger_response_data.py @@ -12,6 +12,7 @@ from .billing_credit_ledger_response_data import BillingCreditLedgerResponseData from .company_ledger_response_data import CompanyLedgerResponseData from .credit_event_type import CreditEventType +from .credit_usage_reason import CreditUsageReason from .feature_ledger_response_data import FeatureLedgerResponseData @@ -46,6 +47,7 @@ class CreditEventLedgerResponseData(UniversalBaseModel): source_id: int to_grant_id: typing.Optional[str] = None usage_event_id: typing.Optional[str] = None + usage_reason: typing.Optional[CreditUsageReason] = None zeroed_out_reason: typing.Optional[BillingCreditGrantZeroedOutReason] = None if IS_PYDANTIC_V2: diff --git a/src/schematic/types/credit_lease_response_data.py b/src/schematic/types/credit_lease_response_data.py new file mode 100644 index 0000000..cc98f48 --- /dev/null +++ b/src/schematic/types/credit_lease_response_data.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import datetime as dt +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CreditLeaseResponseData(UniversalBaseModel): + company_id: str + created_at: dt.datetime + credit_type_id: str + expires_at: dt.datetime + granted_amount: float + id: str + released_at: typing.Optional[dt.datetime] = None + updated_at: dt.datetime + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/credit_usage_reason.py b/src/schematic/types/credit_usage_reason.py new file mode 100644 index 0000000..76bbedf --- /dev/null +++ b/src/schematic/types/credit_usage_reason.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +CreditUsageReason = typing.Union[ + typing.Literal["lease_hold", "lease_release", "manual_adjustment", "reconciliation", "track"], typing.Any +] diff --git a/src/schematic/types/custom_plan_billing_response_data.py b/src/schematic/types/custom_plan_billing_response_data.py index a8374dd..d859cc7 100644 --- a/src/schematic/types/custom_plan_billing_response_data.py +++ b/src/schematic/types/custom_plan_billing_response_data.py @@ -14,6 +14,7 @@ class CustomPlanBillingResponseData(UniversalBaseModel): company_id: str created_at: dt.datetime days_until_due: int + external_invoice_id: typing.Optional[str] = None id: str paid_at: typing.Optional[dt.datetime] = None plan_id: str diff --git a/src/schematic/types/event_body_track.py b/src/schematic/types/event_body_track.py index d8a6f7d..fc92ccd 100644 --- a/src/schematic/types/event_body_track.py +++ b/src/schematic/types/event_body_track.py @@ -17,6 +17,11 @@ class EventBodyTrack(UniversalBaseModel): The name of the type of track event """ + lease_id: typing.Optional[str] = pydantic.Field(default=None) + """ + Credit lease ID this track event is redeeming against + """ + quantity: typing.Optional[int] = pydantic.Field(default=None) """ Optionally specify the quantity of the event diff --git a/src/schematic/types/event_detail_response_data.py b/src/schematic/types/event_detail_response_data.py index fa127c0..d86a444 100644 --- a/src/schematic/types/event_detail_response_data.py +++ b/src/schematic/types/event_detail_response_data.py @@ -26,6 +26,7 @@ class EventDetailResponseData(UniversalBaseModel): features: typing.List[PreviewObject] id: str idempotency_key: typing.Optional[str] = None + lease_id: typing.Optional[str] = None loaded_at: typing.Optional[dt.datetime] = None processed_at: typing.Optional[dt.datetime] = None quantity: int diff --git a/src/schematic/types/event_response_data.py b/src/schematic/types/event_response_data.py index a1cd727..e0a7e60 100644 --- a/src/schematic/types/event_response_data.py +++ b/src/schematic/types/event_response_data.py @@ -21,6 +21,7 @@ class EventResponseData(UniversalBaseModel): feature_ids: typing.List[str] id: str idempotency_key: typing.Optional[str] = None + lease_id: typing.Optional[str] = None loaded_at: typing.Optional[dt.datetime] = None processed_at: typing.Optional[dt.datetime] = None quantity: int diff --git a/src/schematic/types/feature_view.py b/src/schematic/types/feature_view.py index 4e56b4c..be5516d 100644 --- a/src/schematic/types/feature_view.py +++ b/src/schematic/types/feature_view.py @@ -33,6 +33,7 @@ class FeatureView(UniversalBaseModel): trait: typing.Optional[EntityTraitDefinitionResponseData] = None trait_id: typing.Optional[str] = None updated_at: dt.datetime + usage_limit_trait_id: typing.Optional[str] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/schematic/types/install_integration_request_body.py b/src/schematic/types/install_integration_request_body.py new file mode 100644 index 0000000..a30a2a7 --- /dev/null +++ b/src/schematic/types/install_integration_request_body.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .company_matching_criteria import CompanyMatchingCriteria +from .integration_type import IntegrationType + + +class InstallIntegrationRequestBody(UniversalBaseModel): + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = None + company_matching_field: typing.Optional[str] = None + config: typing.Optional[typing.Dict[str, typing.Any]] = None + is_sandbox: typing.Optional[bool] = None + live_mode: typing.Optional[bool] = None + type: IntegrationType + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/integration_config.py b/src/schematic/types/integration_config.py index 69c8bf9..f34b3be 100644 --- a/src/schematic/types/integration_config.py +++ b/src/schematic/types/integration_config.py @@ -24,6 +24,19 @@ class Config: extra = pydantic.Extra.allow +class IntegrationConfig_Metronome(UniversalBaseModel): + type: typing.Literal["metronome"] = "metronome" + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + class IntegrationConfig_Orb(UniversalBaseModel): type: typing.Literal["orb"] = "orb" external_customer_id_key: typing.Optional[str] = None @@ -46,7 +59,21 @@ class IntegrationConfig_Stripe(UniversalBaseModel): is_sandbox: bool live_mode: bool onboard_url: typing.Optional[str] = None - version: int + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + +class IntegrationConfig_Workos(UniversalBaseModel): + type: typing.Literal["workos"] = "workos" + first_events_received: typing.Optional[bool] = None + webhook_url: typing.Optional[str] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 @@ -59,6 +86,12 @@ class Config: IntegrationConfig = typing_extensions.Annotated[ - typing.Union[IntegrationConfig_Clerk, IntegrationConfig_Orb, IntegrationConfig_Stripe], + typing.Union[ + IntegrationConfig_Clerk, + IntegrationConfig_Metronome, + IntegrationConfig_Orb, + IntegrationConfig_Stripe, + IntegrationConfig_Workos, + ], pydantic.Field(discriminator="type"), ] diff --git a/src/schematic/types/integration_install_config.py b/src/schematic/types/integration_install_config.py new file mode 100644 index 0000000..a74cd92 --- /dev/null +++ b/src/schematic/types/integration_install_config.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import datetime as dt +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .company_matching_criteria import CompanyMatchingCriteria +from .integration_config import IntegrationConfig + + +class IntegrationInstallConfig(UniversalBaseModel): + company_matching_criteria: typing.Optional[CompanyMatchingCriteria] = None + company_matching_field: typing.Optional[str] = None + config: typing.Optional[IntegrationConfig] = None + created_at: dt.datetime + id: str + integration_id: str + is_app_install: bool + is_connect_install: bool + live_mode: bool + updated_at: dt.datetime + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/integration_install_response_data.py b/src/schematic/types/integration_install_response_data.py new file mode 100644 index 0000000..3e9cb0f --- /dev/null +++ b/src/schematic/types/integration_install_response_data.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .integration_capabilities import IntegrationCapabilities +from .integration_install_config import IntegrationInstallConfig +from .integration_response_data import IntegrationResponseData + + +class IntegrationInstallResponseData(UniversalBaseModel): + capabilities: IntegrationCapabilities + config: IntegrationInstallConfig + integration: IntegrationResponseData + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/integration_type.py b/src/schematic/types/integration_type.py index 7f5334d..b600c6e 100644 --- a/src/schematic/types/integration_type.py +++ b/src/schematic/types/integration_type.py @@ -2,4 +2,4 @@ import typing -IntegrationType = typing.Union[typing.Literal["clerk", "orb", "stripe", "unknown"], typing.Any] +IntegrationType = typing.Union[typing.Literal["clerk", "metronome", "orb", "stripe", "unknown", "workos"], typing.Any] diff --git a/src/schematic/types/manage_plan_request.py b/src/schematic/types/manage_plan_request.py index 8a42254..53aaab0 100644 --- a/src/schematic/types/manage_plan_request.py +++ b/src/schematic/types/manage_plan_request.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .checkout_field_value import CheckoutFieldValue from .plan_selection import PlanSelection from .update_credit_bundle_request_body import UpdateCreditBundleRequestBody from .update_pay_in_advance_request_body import UpdatePayInAdvanceRequestBody @@ -23,6 +24,7 @@ class ManagePlanRequest(UniversalBaseModel): company_id: str coupon_external_id: typing.Optional[str] = None credit_bundles: typing.List[UpdateCreditBundleRequestBody] + custom_field_values: typing.List[CheckoutFieldValue] pay_in_advance_entitlements: typing.List[UpdatePayInAdvanceRequestBody] payment_method_external_id: typing.Optional[str] = None promo_code: typing.Optional[str] = None diff --git a/src/schematic/types/mark_custom_plan_billing_paid_request_body.py b/src/schematic/types/mark_custom_plan_billing_paid_request_body.py new file mode 100644 index 0000000..134524c --- /dev/null +++ b/src/schematic/types/mark_custom_plan_billing_paid_request_body.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +MarkCustomPlanBillingPaidRequestBody = typing.Dict[str, typing.Any] diff --git a/src/schematic/types/metronome_integration_config.py b/src/schematic/types/metronome_integration_config.py new file mode 100644 index 0000000..e81287d --- /dev/null +++ b/src/schematic/types/metronome_integration_config.py @@ -0,0 +1,17 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class MetronomeIntegrationConfig(UniversalBaseModel): + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/schematic/types/migration_error_code.py b/src/schematic/types/migration_error_code.py new file mode 100644 index 0000000..8d2ed21 --- /dev/null +++ b/src/schematic/types/migration_error_code.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +MigrationErrorCode = typing.Union[ + typing.Literal[ + "ambiguous_subscription_item", + "multiple_subscriptions", + "no_price_for_interval", + "not_on_origin_version", + "operation_item_not_found", + "permanent_config", + "permanent_decline", + "transient_decline", + "transient_infra", + "transient_stripe", + "unknown", + "would_leave_empty_subscription", + ], + typing.Any, +] diff --git a/src/schematic/types/plan_credit_grant_view.py b/src/schematic/types/plan_credit_grant_view.py index fe9d9a0..43634fa 100644 --- a/src/schematic/types/plan_credit_grant_view.py +++ b/src/schematic/types/plan_credit_grant_view.py @@ -58,6 +58,7 @@ class PlanCreditGrantView(UniversalBaseModel): reset_cadence: typing.Optional[BillingPlanCreditGrantResetCadence] = None reset_start: typing.Optional[BillingPlanCreditGrantResetStart] = None reset_type: BillingPlanCreditGrantResetType + rollover_percentage: int singular_name: typing.Optional[str] = pydantic.Field(default=None) """ Deprecated field, will be removed in the future. Use Credit.SingularName instead. diff --git a/src/schematic/types/plan_detail_response_data.py b/src/schematic/types/plan_detail_response_data.py index 3a1f015..48de58c 100644 --- a/src/schematic/types/plan_detail_response_data.py +++ b/src/schematic/types/plan_detail_response_data.py @@ -10,9 +10,11 @@ from .billing_price_response_data import BillingPriceResponseData from .billing_product_detail_response_data import BillingProductDetailResponseData from .billing_provider_type import BillingProviderType +from .billing_strategy import BillingStrategy from .charge_type import ChargeType from .feature_in_plan_response_data import FeatureInPlanResponseData from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData +from .plan_entitlement_response_data import PlanEntitlementResponseData from .plan_icon import PlanIcon from .plan_type import PlanType from .plan_version_response_data import PlanVersionResponseData @@ -23,6 +25,7 @@ class PlanDetailResponseData(UniversalBaseModel): audience_type: typing.Optional[str] = None billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None billing_product: typing.Optional[BillingProductDetailResponseData] = None + billing_strategy: BillingStrategy charge_type: ChargeType company_count: int company_id: typing.Optional[str] = None @@ -33,12 +36,17 @@ class PlanDetailResponseData(UniversalBaseModel): currency_prices: typing.List[PlanCurrencyPricesResponseData] description: str draft_version: typing.Optional[PlanVersionResponseData] = None + entitlements: typing.Optional[typing.List[PlanEntitlementResponseData]] = None features: typing.List[FeatureInPlanResponseData] icon: PlanIcon id: str included_credit_grants: typing.Optional[typing.List[BillingPlanCreditGrantResponseData]] = None is_default: bool - is_free: bool + is_free: bool = pydantic.Field() + """ + Deprecated: Use BillingStrategy instead + """ + is_trialable: bool monthly_price: typing.Optional[BillingPriceResponseData] = None name: str diff --git a/src/schematic/types/plan_entitlement_response_data.py b/src/schematic/types/plan_entitlement_response_data.py index 846db8c..dc24b51 100644 --- a/src/schematic/types/plan_entitlement_response_data.py +++ b/src/schematic/types/plan_entitlement_response_data.py @@ -42,6 +42,11 @@ class PlanEntitlementResponseData(UniversalBaseModel): soft_limit: typing.Optional[int] = None updated_at: dt.datetime usage_based_product: typing.Optional[BillingProductResponseData] = None + usage_quantity: typing.Optional[int] = pydantic.Field(default=None) + """ + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + """ + value_bool: typing.Optional[bool] = None value_credit: typing.Optional[BillingCreditResponseData] = None value_numeric: typing.Optional[int] = None diff --git a/src/schematic/types/plan_group_detail_response_data.py b/src/schematic/types/plan_group_detail_response_data.py index bd37fd7..87e3be6 100644 --- a/src/schematic/types/plan_group_detail_response_data.py +++ b/src/schematic/types/plan_group_detail_response_data.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .billing_price_view import BillingPriceView +from .checkout_field_response_data import CheckoutFieldResponseData from .checkout_settings_response_data import CheckoutSettingsResponseData from .component_settings_response_data import ComponentSettingsResponseData from .custom_plan_view_config_response_data import CustomPlanViewConfigResponseData @@ -17,6 +18,7 @@ class PlanGroupDetailResponseData(UniversalBaseModel): add_ons: typing.List[PlanGroupPlanDetailResponseData] checkout_settings: CheckoutSettingsResponseData component_settings: ComponentSettingsResponseData + custom_checkout_fields: typing.List[CheckoutFieldResponseData] custom_plan_config: typing.Optional[CustomPlanViewConfigResponseData] = None custom_plan_id: typing.Optional[str] = None default_plan: typing.Optional[PlanGroupPlanDetailResponseData] = None diff --git a/src/schematic/types/plan_group_plan_detail_response_data.py b/src/schematic/types/plan_group_plan_detail_response_data.py index 4a48976..2057c34 100644 --- a/src/schematic/types/plan_group_plan_detail_response_data.py +++ b/src/schematic/types/plan_group_plan_detail_response_data.py @@ -10,12 +10,14 @@ from .billing_price_response_data import BillingPriceResponseData from .billing_product_detail_response_data import BillingProductDetailResponseData from .billing_provider_type import BillingProviderType +from .billing_strategy import BillingStrategy from .charge_type import ChargeType from .custom_plan_view_config_response_data import CustomPlanViewConfigResponseData from .feature_in_plan_response_data import FeatureInPlanResponseData from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData from .plan_entitlement_response_data import PlanEntitlementResponseData from .plan_icon import PlanIcon +from .plan_price_cadence import PlanPriceCadence from .plan_type import PlanType from .plan_version_response_data import PlanVersionResponseData @@ -23,8 +25,10 @@ class PlanGroupPlanDetailResponseData(UniversalBaseModel): active_version: typing.Optional[PlanVersionResponseData] = None audience_type: typing.Optional[str] = None + available_periods: typing.List[PlanPriceCadence] billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None billing_product: typing.Optional[BillingProductDetailResponseData] = None + billing_strategy: BillingStrategy charge_type: ChargeType company_count: int company_id: typing.Optional[str] = None @@ -37,14 +41,18 @@ class PlanGroupPlanDetailResponseData(UniversalBaseModel): custom_plan_config: typing.Optional[CustomPlanViewConfigResponseData] = None description: str draft_version: typing.Optional[PlanVersionResponseData] = None - entitlements: typing.List[PlanEntitlementResponseData] + entitlements: typing.Optional[typing.List[PlanEntitlementResponseData]] = None features: typing.List[FeatureInPlanResponseData] icon: PlanIcon id: str included_credit_grants: typing.Optional[typing.List[BillingPlanCreditGrantResponseData]] = None is_custom: bool is_default: bool - is_free: bool + is_free: bool = pydantic.Field() + """ + Deprecated: Use BillingStrategy instead + """ + is_trialable: bool monthly_price: typing.Optional[BillingPriceResponseData] = None name: str diff --git a/src/schematic/types/plan_price_cadence.py b/src/schematic/types/plan_price_cadence.py new file mode 100644 index 0000000..f642601 --- /dev/null +++ b/src/schematic/types/plan_price_cadence.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +PlanPriceCadence = typing.Union[typing.Literal["monthly", "quarterly", "yearly"], typing.Any] diff --git a/src/schematic/types/plan_version_company_migration_response_data.py b/src/schematic/types/plan_version_company_migration_response_data.py index be7e8cf..c38c833 100644 --- a/src/schematic/types/plan_version_company_migration_response_data.py +++ b/src/schematic/types/plan_version_company_migration_response_data.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .migration_error_code import MigrationErrorCode from .plan_version_company_migration_status import PlanVersionCompanyMigrationStatus @@ -14,6 +15,7 @@ class PlanVersionCompanyMigrationResponseData(UniversalBaseModel): completed_at: typing.Optional[dt.datetime] = None created_at: dt.datetime error: typing.Optional[str] = None + error_code: typing.Optional[MigrationErrorCode] = None id: str migration_id: str plan_version_id_from: typing.Optional[str] = None diff --git a/src/schematic/types/plan_version_migration_response_data.py b/src/schematic/types/plan_version_migration_response_data.py index 94a7d93..e3bfbc6 100644 --- a/src/schematic/types/plan_version_migration_response_data.py +++ b/src/schematic/types/plan_version_migration_response_data.py @@ -19,6 +19,7 @@ class PlanVersionMigrationResponseData(UniversalBaseModel): plan_id: str plan_version_id_from: typing.Optional[str] = None plan_version_id_to: str + plan_version_ids_from: typing.List[str] skipped_companies: int started_at: typing.Optional[dt.datetime] = None status: PlanVersionMigrationStatus diff --git a/src/schematic/types/plan_view_public_response_data.py b/src/schematic/types/plan_view_public_response_data.py index 102c64c..04b65ab 100644 --- a/src/schematic/types/plan_view_public_response_data.py +++ b/src/schematic/types/plan_view_public_response_data.py @@ -9,6 +9,7 @@ from .billing_price_response_data import BillingPriceResponseData from .billing_product_detail_response_data import BillingProductDetailResponseData from .billing_provider_type import BillingProviderType +from .billing_strategy import BillingStrategy from .charge_type import ChargeType from .custom_plan_config import CustomPlanConfig from .feature_in_plan_response_data import FeatureInPlanResponseData @@ -16,6 +17,7 @@ from .plan_currency_prices_response_data import PlanCurrencyPricesResponseData from .plan_entitlement_response_data import PlanEntitlementResponseData from .plan_icon import PlanIcon +from .plan_price_cadence import PlanPriceCadence from .plan_type import PlanType from .plan_version_response_data import PlanVersionResponseData @@ -23,8 +25,10 @@ class PlanViewPublicResponseData(UniversalBaseModel): active_version: typing.Optional[PlanVersionResponseData] = None audience_type: typing.Optional[str] = None + available_periods: typing.List[PlanPriceCadence] billing_linked_resource: typing.Optional[BillingLinkedResourceResponseData] = None billing_product: typing.Optional[BillingProductDetailResponseData] = None + billing_strategy: BillingStrategy charge_type: ChargeType company_count: int company_id: typing.Optional[str] = None @@ -38,14 +42,18 @@ class PlanViewPublicResponseData(UniversalBaseModel): custom_plan_config: typing.Optional[CustomPlanConfig] = None description: str draft_version: typing.Optional[PlanVersionResponseData] = None - entitlements: typing.List[PlanEntitlementResponseData] + entitlements: typing.Optional[typing.List[PlanEntitlementResponseData]] = None features: typing.List[FeatureInPlanResponseData] icon: PlanIcon id: str included_credit_grants: typing.List[PlanCreditGrantView] is_custom: bool is_default: bool - is_free: bool + is_free: bool = pydantic.Field() + """ + Deprecated: Use BillingStrategy instead + """ + is_trialable: bool monthly_price: typing.Optional[BillingPriceResponseData] = None name: str diff --git a/src/schematic/types/release_credit_lease_request_body.py b/src/schematic/types/release_credit_lease_request_body.py new file mode 100644 index 0000000..7fd3367 --- /dev/null +++ b/src/schematic/types/release_credit_lease_request_body.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ReleaseCreditLeaseRequestBody = typing.Dict[str, typing.Any] diff --git a/src/schematic/types/stripe_integration_config.py b/src/schematic/types/stripe_integration_config.py index b5268bc..84c885e 100644 --- a/src/schematic/types/stripe_integration_config.py +++ b/src/schematic/types/stripe_integration_config.py @@ -37,11 +37,6 @@ class StripeIntegrationConfig(UniversalBaseModel): Onboarding URL returned during the v2 (Connect) install flow before activation """ - version: int = pydantic.Field() - """ - Stripe integration config version (1 = legacy API key install, 2 = Connect/App install) - """ - if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: diff --git a/src/schematic/types/update_billing_plan_credit_grant_request_body.py b/src/schematic/types/update_billing_plan_credit_grant_request_body.py index 0a755d4..43b1c74 100644 --- a/src/schematic/types/update_billing_plan_credit_grant_request_body.py +++ b/src/schematic/types/update_billing_plan_credit_grant_request_body.py @@ -30,6 +30,10 @@ class UpdateBillingPlanCreditGrantRequestBody(UniversalBaseModel): reset_cadence: BillingPlanCreditGrantResetCadence reset_start: BillingPlanCreditGrantResetStart reset_type: typing.Optional[BillingPlanCreditGrantResetType] = None + rollover_percentage: typing.Optional[int] = pydantic.Field(default=None) + """ + Percentage of unused credits that carry over when this grant resets. Only applies when reset_type is plan_period. Rolled-over credits expire at the next reset and are not rolled again. + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/schematic/types/upsert_billing_product_request_body.py b/src/schematic/types/upsert_billing_product_request_body.py index 7599f07..b5a4a6e 100644 --- a/src/schematic/types/upsert_billing_product_request_body.py +++ b/src/schematic/types/upsert_billing_product_request_body.py @@ -4,12 +4,14 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .billing_strategy import BillingStrategy from .charge_type import ChargeType from .plan_currency_price_request_body import PlanCurrencyPriceRequestBody class UpsertBillingProductRequestBody(UniversalBaseModel): billing_product_id: typing.Optional[str] = None + billing_strategy: typing.Optional[BillingStrategy] = None charge_type: ChargeType currency: typing.Optional[str] = None currency_prices: typing.Optional[typing.List[PlanCurrencyPriceRequestBody]] = None diff --git a/src/schematic/types/usage_based_entitlement_request_body.py b/src/schematic/types/usage_based_entitlement_request_body.py index 9339c66..d284709 100644 --- a/src/schematic/types/usage_based_entitlement_request_body.py +++ b/src/schematic/types/usage_based_entitlement_request_body.py @@ -32,6 +32,11 @@ class UsageBasedEntitlementRequestBody(UniversalBaseModel): quarterly_unit_price_decimal: typing.Optional[str] = None soft_limit: typing.Optional[int] = None tier_mode: typing.Optional[BillingTiersMode] = None + usage_quantity: typing.Optional[int] = pydantic.Field(default=None) + """ + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + """ + yearly_metered_price_id: typing.Optional[str] = None yearly_price_tiers: typing.Optional[typing.List[CreatePriceTierRequestBody]] = None yearly_unit_price: typing.Optional[int] = None diff --git a/src/schematic/types/usage_based_entitlement_response_data.py b/src/schematic/types/usage_based_entitlement_response_data.py index 28386c6..e843695 100644 --- a/src/schematic/types/usage_based_entitlement_response_data.py +++ b/src/schematic/types/usage_based_entitlement_response_data.py @@ -21,6 +21,11 @@ class UsageBasedEntitlementResponseData(UniversalBaseModel): monthly_usage_based_price: typing.Optional[BillingPriceView] = None price_behavior: typing.Optional[EntitlementPriceBehavior] = None quarterly_usage_based_price: typing.Optional[BillingPriceView] = None + usage_quantity: typing.Optional[int] = pydantic.Field(default=None) + """ + The committed unit quantity for this entitlement. For custom plans this is the quantity the company is contractually committed to; for standard plans it is the quantity pre-filled when subscribing. Only applies to pay-in-advance entitlements. Note: this is not yet enforced/auto-provisioned as a true default — it is currently stored for downstream billing use. + """ + value_bool: typing.Optional[bool] = None value_numeric: typing.Optional[int] = None value_type: EntitlementValueType diff --git a/src/schematic/types/work_os_integration_config.py b/src/schematic/types/work_os_integration_config.py new file mode 100644 index 0000000..a38005a --- /dev/null +++ b/src/schematic/types/work_os_integration_config.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class WorkOsIntegrationConfig(UniversalBaseModel): + first_events_received: typing.Optional[bool] = pydantic.Field(default=None) + """ + Whether Schematic has received the first webhook event from WorkOS after install + """ + + webhook_url: typing.Optional[str] = pydantic.Field(default=None) + """ + URL configured on the WorkOS webhook endpoint that delivers events to Schematic + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow