Skip to content

Commit c6482f2

Browse files
fix(billing): only check owners for billed overages (#2085)
1 parent bf1719a commit c6482f2

File tree

1 file changed

+21
-25
lines changed

1 file changed

+21
-25
lines changed

apps/sim/lib/billing/webhooks/invoices.ts

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { render } from '@react-email/components'
22
import { db } from '@sim/db'
33
import { member, subscription as subscriptionTable, user, userStats } from '@sim/db/schema'
4-
import { eq, inArray } from 'drizzle-orm'
4+
import { and, eq, inArray } from 'drizzle-orm'
55
import type Stripe from 'stripe'
66
import PaymentFailedEmail from '@/components/emails/billing/payment-failed-email'
77
import { calculateSubscriptionOverage } from '@/lib/billing/core/billing'
@@ -226,42 +226,38 @@ export async function getBilledOverageForSubscription(sub: {
226226
plan: string | null
227227
referenceId: string
228228
}): Promise<number> {
229-
let billedOverage = 0
230-
231229
if (sub.plan === 'team') {
232-
const members = await db
230+
const ownerRows = await db
233231
.select({ userId: member.userId })
234232
.from(member)
235-
.where(eq(member.organizationId, sub.referenceId))
236-
237-
const memberIds = members.map((m) => m.userId)
233+
.where(and(eq(member.organizationId, sub.referenceId), eq(member.role, 'owner')))
234+
.limit(1)
238235

239-
if (memberIds.length > 0) {
240-
const memberStatsRows = await db
241-
.select({
242-
userId: userStats.userId,
243-
billedOverageThisPeriod: userStats.billedOverageThisPeriod,
244-
})
245-
.from(userStats)
246-
.where(inArray(userStats.userId, memberIds))
236+
const ownerId = ownerRows[0]?.userId
247237

248-
for (const stats of memberStatsRows) {
249-
billedOverage += parseDecimal(stats.billedOverageThisPeriod)
250-
}
238+
if (!ownerId) {
239+
logger.warn('Organization has no owner when fetching billed overage', {
240+
organizationId: sub.referenceId,
241+
})
242+
return 0
251243
}
252-
} else {
253-
const userStatsRecords = await db
244+
245+
const ownerStats = await db
254246
.select({ billedOverageThisPeriod: userStats.billedOverageThisPeriod })
255247
.from(userStats)
256-
.where(eq(userStats.userId, sub.referenceId))
248+
.where(eq(userStats.userId, ownerId))
257249
.limit(1)
258250

259-
if (userStatsRecords.length > 0) {
260-
billedOverage = parseDecimal(userStatsRecords[0].billedOverageThisPeriod)
261-
}
251+
return ownerStats.length > 0 ? parseDecimal(ownerStats[0].billedOverageThisPeriod) : 0
262252
}
263253

264-
return billedOverage
254+
const userStatsRecords = await db
255+
.select({ billedOverageThisPeriod: userStats.billedOverageThisPeriod })
256+
.from(userStats)
257+
.where(eq(userStats.userId, sub.referenceId))
258+
.limit(1)
259+
260+
return userStatsRecords.length > 0 ? parseDecimal(userStatsRecords[0].billedOverageThisPeriod) : 0
265261
}
266262

267263
export async function resetUsageForSubscription(sub: { plan: string | null; referenceId: string }) {

0 commit comments

Comments
 (0)