Skip to content

Commit ee57fed

Browse files
committed
restore functionality fixed
1 parent a04f77a commit ee57fed

File tree

4 files changed

+52
-23
lines changed

4 files changed

+52
-23
lines changed

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface CancelSubscriptionProps {
2929
}
3030
subscriptionData?: {
3131
periodEnd?: Date | null
32+
cancelAtPeriodEnd?: boolean
3233
}
3334
}
3435

@@ -126,35 +127,48 @@ export function CancelSubscription({ subscription, subscriptionData }: CancelSub
126127
const subscriptionStatus = getSubscriptionStatus()
127128
const activeOrgId = activeOrganization?.id
128129

129-
// For team/enterprise plans, get the subscription ID from organization store
130-
if ((subscriptionStatus.isTeam || subscriptionStatus.isEnterprise) && activeOrgId) {
131-
const orgSubscription = useOrganizationStore.getState().subscriptionData
130+
if (isCancelAtPeriodEnd) {
131+
if (!betterAuthSubscription.restore) {
132+
throw new Error('Subscription restore not available')
133+
}
134+
135+
let referenceId: string
136+
let subscriptionId: string | undefined
137+
138+
if ((subscriptionStatus.isTeam || subscriptionStatus.isEnterprise) && activeOrgId) {
139+
const orgSubscription = useOrganizationStore.getState().subscriptionData
140+
referenceId = activeOrgId
141+
subscriptionId = orgSubscription?.id
142+
} else {
143+
// For personal subscriptions, use user ID and let better-auth find the subscription
144+
referenceId = session.user.id
145+
subscriptionId = undefined
146+
}
147+
148+
logger.info('Restoring subscription', { referenceId, subscriptionId })
132149

133-
if (orgSubscription?.id && orgSubscription?.cancelAtPeriodEnd) {
134-
// Restore the organization subscription
135-
if (!betterAuthSubscription.restore) {
136-
throw new Error('Subscription restore not available')
137-
}
138-
139-
const result = await betterAuthSubscription.restore({
140-
referenceId: activeOrgId,
141-
subscriptionId: orgSubscription.id,
142-
})
143-
logger.info('Organization subscription restored successfully', result)
150+
// Build restore params - only include subscriptionId if we have one (team/enterprise)
151+
const restoreParams: any = { referenceId }
152+
if (subscriptionId) {
153+
restoreParams.subscriptionId = subscriptionId
144154
}
155+
156+
const result = await betterAuthSubscription.restore(restoreParams)
157+
158+
logger.info('Subscription restored successfully', result)
145159
}
146160

147-
// Refresh state and close
148161
await refresh()
149162
if (activeOrgId) {
150163
await loadOrganizationSubscription(activeOrgId)
151164
await refreshOrganization().catch(() => {})
152165
}
166+
153167
setIsDialogOpen(false)
154168
} catch (error) {
155-
const errorMessage = error instanceof Error ? error.message : 'Failed to keep subscription'
169+
const errorMessage = error instanceof Error ? error.message : 'Failed to restore subscription'
156170
setError(errorMessage)
157-
logger.error('Failed to keep subscription', { error })
171+
logger.error('Failed to restore subscription', { error })
158172
} finally {
159173
setIsLoading(false)
160174
}
@@ -190,6 +204,12 @@ export function CancelSubscription({ subscription, subscriptionData }: CancelSub
190204

191205
// Check if subscription is set to cancel at period end
192206
const isCancelAtPeriodEnd = (() => {
207+
// First check if it's passed via props (works for all subscription types)
208+
if (subscriptionData?.cancelAtPeriodEnd === true) {
209+
return true
210+
}
211+
212+
// Fall back to checking organization store for team subscriptions
193213
const subscriptionStatus = getSubscriptionStatus()
194214
if (subscriptionStatus.isTeam || subscriptionStatus.isEnterprise) {
195215
return useOrganizationStore.getState().subscriptionData?.cancelAtPeriodEnd === true
@@ -271,12 +291,7 @@ export function CancelSubscription({ subscription, subscriptionData }: CancelSub
271291

272292
{(() => {
273293
const subscriptionStatus = getSubscriptionStatus()
274-
if (
275-
subscriptionStatus.isPaid &&
276-
(activeOrganization?.id
277-
? useOrganizationStore.getState().subscriptionData?.cancelAtPeriodEnd
278-
: false)
279-
) {
294+
if (subscriptionStatus.isPaid && isCancelAtPeriodEnd) {
280295
return (
281296
<AlertDialogAction
282297
onClick={handleKeep}

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ export function Subscription({ onOpenChange }: SubscriptionProps) {
523523
}}
524524
subscriptionData={{
525525
periodEnd: subscriptionData?.periodEnd || null,
526+
cancelAtPeriodEnd: subscriptionData?.cancelAtPeriodEnd,
526527
}}
527528
/>
528529
</div>

apps/sim/lib/billing/core/billing.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ export async function getSimplifiedBillingSummary(
220220
metadata: any
221221
stripeSubscriptionId: string | null
222222
periodEnd: Date | string | null
223+
cancelAtPeriodEnd?: boolean
223224
// Usage details
224225
usage: {
225226
current: number
@@ -318,6 +319,7 @@ export async function getSimplifiedBillingSummary(
318319
metadata: subscription.metadata || null,
319320
stripeSubscriptionId: subscription.stripeSubscriptionId || null,
320321
periodEnd: subscription.periodEnd || null,
322+
cancelAtPeriodEnd: subscription.cancelAtPeriodEnd || undefined,
321323
// Usage details
322324
usage: {
323325
current: usageData.currentUsage,
@@ -393,6 +395,7 @@ export async function getSimplifiedBillingSummary(
393395
metadata: subscription?.metadata || null,
394396
stripeSubscriptionId: subscription?.stripeSubscriptionId || null,
395397
periodEnd: subscription?.periodEnd || null,
398+
cancelAtPeriodEnd: subscription?.cancelAtPeriodEnd || undefined,
396399
// Usage details
397400
usage: {
398401
current: currentUsage,
@@ -450,5 +453,14 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') {
450453
lastPeriodCost: 0,
451454
daysRemaining: 0,
452455
},
456+
...(type === 'organization' && {
457+
organizationData: {
458+
seatCount: 0,
459+
memberCount: 0,
460+
totalBasePrice: 0,
461+
totalCurrentUsage: 0,
462+
totalOverage: 0,
463+
},
464+
}),
453465
}
454466
}

apps/sim/stores/subscription/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface SubscriptionData {
2929
metadata: any | null
3030
stripeSubscriptionId: string | null
3131
periodEnd: Date | null
32+
cancelAtPeriodEnd?: boolean
3233
usage: UsageData
3334
billingBlocked?: boolean
3435
}

0 commit comments

Comments
 (0)