From c09f484ec4e1c9b1548d810340e7cd05f78cca21 Mon Sep 17 00:00:00 2001 From: morgankrey Date: Fri, 11 Jul 2025 10:26:36 -0500 Subject: [PATCH] collab: Add ability to add tax ID during Stripe Checkout (#34246) ### 1. **Added Tax ID Collection Types** - Created a new `StripeTaxIdCollection` struct with an `enabled` field - Added `tax_id_collection` field to `StripeCreateCheckoutSessionParams` ### 2. **Updated the Stripe Client Interface** - Modified the real Stripe client to handle tax ID collection conversion - Updated the fake Stripe client for testing purposes - Added proper imports across all affected files ### 3. **Enabled Tax ID Collection in Checkout Sessions** - Both `checkout_with_zed_pro` and `checkout_with_zed_pro_trial` methods now enable tax ID collection - The implementation correctly sets `tax_id_collection.enabled = true` for all checkout sessions ### 4. **Key Implementation Details** - Tax ID collection will be shown to new customers and existing customers without tax IDs - Collected tax IDs will be automatically saved to the customer's `tax_ids` array in Stripe - Business names will be saved to the customer's `name` property - The existing `customer_update.name = auto` setting ensures compatibility with tax ID collection Release Notes: - N/A --- crates/collab/src/stripe_billing.rs | 6 ++++-- crates/collab/src/stripe_client.rs | 6 ++++++ .../collab/src/stripe_client/fake_stripe_client.rs | 6 ++++-- .../collab/src/stripe_client/real_stripe_client.rs | 13 +++++++++++-- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/collab/src/stripe_billing.rs b/crates/collab/src/stripe_billing.rs index 8bf6c08158..fdd9653d7c 100644 --- a/crates/collab/src/stripe_billing.rs +++ b/crates/collab/src/stripe_billing.rs @@ -19,8 +19,8 @@ use crate::stripe_client::{ StripeCustomerId, StripeCustomerUpdate, StripeCustomerUpdateAddress, StripeCustomerUpdateName, StripeMeter, StripePrice, StripePriceId, StripeSubscription, StripeSubscriptionId, StripeSubscriptionTrialSettings, StripeSubscriptionTrialSettingsEndBehavior, - StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod, UpdateSubscriptionItems, - UpdateSubscriptionParams, + StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod, StripeTaxIdCollection, + UpdateSubscriptionItems, UpdateSubscriptionParams, }; pub struct StripeBilling { @@ -252,6 +252,7 @@ impl StripeBilling { name: Some(StripeCustomerUpdateName::Auto), shipping: None, }); + params.tax_id_collection = Some(StripeTaxIdCollection { enabled: true }); let session = self.client.create_checkout_session(params).await?; Ok(session.url.context("no checkout session URL")?) @@ -311,6 +312,7 @@ impl StripeBilling { name: Some(StripeCustomerUpdateName::Auto), shipping: None, }); + params.tax_id_collection = Some(StripeTaxIdCollection { enabled: true }); let session = self.client.create_checkout_session(params).await?; Ok(session.url.context("no checkout session URL")?) diff --git a/crates/collab/src/stripe_client.rs b/crates/collab/src/stripe_client.rs index 9ffcb2ba6c..ec947e12f7 100644 --- a/crates/collab/src/stripe_client.rs +++ b/crates/collab/src/stripe_client.rs @@ -190,6 +190,7 @@ pub struct StripeCreateCheckoutSessionParams<'a> { pub success_url: Option<&'a str>, pub billing_address_collection: Option, pub customer_update: Option, + pub tax_id_collection: Option, } #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -218,6 +219,11 @@ pub struct StripeCreateCheckoutSessionSubscriptionData { pub trial_settings: Option, } +#[derive(Debug, PartialEq, Clone)] +pub struct StripeTaxIdCollection { + pub enabled: bool, +} + #[derive(Debug)] pub struct StripeCheckoutSession { pub url: Option, diff --git a/crates/collab/src/stripe_client/fake_stripe_client.rs b/crates/collab/src/stripe_client/fake_stripe_client.rs index 11b210dd0e..9bb08443ec 100644 --- a/crates/collab/src/stripe_client/fake_stripe_client.rs +++ b/crates/collab/src/stripe_client/fake_stripe_client.rs @@ -14,8 +14,8 @@ use crate::stripe_client::{ StripeCreateCheckoutSessionSubscriptionData, StripeCreateMeterEventParams, StripeCreateSubscriptionParams, StripeCustomer, StripeCustomerId, StripeCustomerUpdate, StripeMeter, StripeMeterId, StripePrice, StripePriceId, StripeSubscription, - StripeSubscriptionId, StripeSubscriptionItem, StripeSubscriptionItemId, UpdateCustomerParams, - UpdateSubscriptionParams, + StripeSubscriptionId, StripeSubscriptionItem, StripeSubscriptionItemId, StripeTaxIdCollection, + UpdateCustomerParams, UpdateSubscriptionParams, }; #[derive(Debug, Clone)] @@ -38,6 +38,7 @@ pub struct StripeCreateCheckoutSessionCall { pub success_url: Option, pub billing_address_collection: Option, pub customer_update: Option, + pub tax_id_collection: Option, } pub struct FakeStripeClient { @@ -236,6 +237,7 @@ impl StripeClient for FakeStripeClient { success_url: params.success_url.map(|url| url.to_string()), billing_address_collection: params.billing_address_collection, customer_update: params.customer_update, + tax_id_collection: params.tax_id_collection, }); Ok(StripeCheckoutSession { diff --git a/crates/collab/src/stripe_client/real_stripe_client.rs b/crates/collab/src/stripe_client/real_stripe_client.rs index 7108e8d759..07dde68d17 100644 --- a/crates/collab/src/stripe_client/real_stripe_client.rs +++ b/crates/collab/src/stripe_client/real_stripe_client.rs @@ -27,8 +27,8 @@ use crate::stripe_client::{ StripeMeter, StripePrice, StripePriceId, StripePriceRecurring, StripeSubscription, StripeSubscriptionId, StripeSubscriptionItem, StripeSubscriptionItemId, StripeSubscriptionTrialSettings, StripeSubscriptionTrialSettingsEndBehavior, - StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod, UpdateCustomerParams, - UpdateSubscriptionParams, + StripeSubscriptionTrialSettingsEndBehaviorMissingPaymentMethod, StripeTaxIdCollection, + UpdateCustomerParams, UpdateSubscriptionParams, }; pub struct RealStripeClient { @@ -448,6 +448,7 @@ impl<'a> TryFrom> for CreateCheckoutSessio success_url: value.success_url, billing_address_collection: value.billing_address_collection.map(Into::into), customer_update: value.customer_update.map(Into::into), + tax_id_collection: value.tax_id_collection.map(Into::into), ..Default::default() }) } @@ -590,3 +591,11 @@ impl From for stripe::CreateCheckoutSessionCustomerUpdate } } } + +impl From for stripe::CreateCheckoutSessionTaxIdCollection { + fn from(value: StripeTaxIdCollection) -> Self { + stripe::CreateCheckoutSessionTaxIdCollection { + enabled: value.enabled, + } + } +}