diff --git a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql index fb2de18b63..185bd45cd3 100644 --- a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql +++ b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql @@ -430,6 +430,7 @@ CREATE TABLE IF NOT EXISTS billing_customers ( id INTEGER PRIMARY KEY AUTOINCREMENT, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, user_id INTEGER NOT NULL REFERENCES users(id), + has_overdue_invoices BOOLEAN NOT NULL DEFAULT FALSE, stripe_customer_id TEXT NOT NULL ); diff --git a/crates/collab/migrations/20250204224004_add_has_overdue_invoices_to_billing_customers.sql b/crates/collab/migrations/20250204224004_add_has_overdue_invoices_to_billing_customers.sql new file mode 100644 index 0000000000..07c4030399 --- /dev/null +++ b/crates/collab/migrations/20250204224004_add_has_overdue_invoices_to_billing_customers.sql @@ -0,0 +1,2 @@ +alter table billing_customers +add column has_overdue_invoices bool not null default false; diff --git a/crates/collab/src/api/billing.rs b/crates/collab/src/api/billing.rs index eceb01ee23..2e5a4a925b 100644 --- a/crates/collab/src/api/billing.rs +++ b/crates/collab/src/api/billing.rs @@ -666,6 +666,27 @@ async fn handle_customer_subscription_event( .await? .ok_or_else(|| anyhow!("billing customer not found"))?; + let was_canceled_due_to_payment_failure = subscription.status == SubscriptionStatus::Canceled + && subscription + .cancellation_details + .as_ref() + .and_then(|details| details.reason) + .map_or(false, |reason| { + reason == CancellationDetailsReason::PaymentFailed + }); + + if was_canceled_due_to_payment_failure { + app.db + .update_billing_customer( + billing_customer.id, + &UpdateBillingCustomerParams { + has_overdue_invoices: ActiveValue::set(true), + ..Default::default() + }, + ) + .await?; + } + if let Some(existing_subscription) = app .db .get_billing_subscription_by_stripe_subscription_id(&subscription.id) diff --git a/crates/collab/src/db/queries/billing_customers.rs b/crates/collab/src/db/queries/billing_customers.rs index 188bb39e1c..efbc31c7c7 100644 --- a/crates/collab/src/db/queries/billing_customers.rs +++ b/crates/collab/src/db/queries/billing_customers.rs @@ -10,6 +10,7 @@ pub struct CreateBillingCustomerParams { pub struct UpdateBillingCustomerParams { pub user_id: ActiveValue, pub stripe_customer_id: ActiveValue, + pub has_overdue_invoices: ActiveValue, } impl Database { @@ -43,6 +44,7 @@ impl Database { id: ActiveValue::set(id), user_id: params.user_id.clone(), stripe_customer_id: params.stripe_customer_id.clone(), + has_overdue_invoices: params.has_overdue_invoices.clone(), ..Default::default() }) .exec(&*tx) diff --git a/crates/collab/src/db/tables/billing_customer.rs b/crates/collab/src/db/tables/billing_customer.rs index 258a7e0c0c..914d73061f 100644 --- a/crates/collab/src/db/tables/billing_customer.rs +++ b/crates/collab/src/db/tables/billing_customer.rs @@ -9,6 +9,7 @@ pub struct Model { pub id: BillingCustomerId, pub user_id: UserId, pub stripe_customer_id: String, + pub has_overdue_invoices: bool, pub created_at: DateTime, }