|
1 | 1 | import { render } from '@react-email/components' |
2 | 2 | import { db } from '@sim/db' |
3 | 3 | 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' |
5 | 5 | import type Stripe from 'stripe' |
6 | 6 | import PaymentFailedEmail from '@/components/emails/billing/payment-failed-email' |
7 | 7 | import { calculateSubscriptionOverage } from '@/lib/billing/core/billing' |
@@ -226,42 +226,38 @@ export async function getBilledOverageForSubscription(sub: { |
226 | 226 | plan: string | null |
227 | 227 | referenceId: string |
228 | 228 | }): Promise<number> { |
229 | | - let billedOverage = 0 |
230 | | - |
231 | 229 | if (sub.plan === 'team') { |
232 | | - const members = await db |
| 230 | + const ownerRows = await db |
233 | 231 | .select({ userId: member.userId }) |
234 | 232 | .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) |
238 | 235 |
|
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 |
247 | 237 |
|
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 |
251 | 243 | } |
252 | | - } else { |
253 | | - const userStatsRecords = await db |
| 244 | + |
| 245 | + const ownerStats = await db |
254 | 246 | .select({ billedOverageThisPeriod: userStats.billedOverageThisPeriod }) |
255 | 247 | .from(userStats) |
256 | | - .where(eq(userStats.userId, sub.referenceId)) |
| 248 | + .where(eq(userStats.userId, ownerId)) |
257 | 249 | .limit(1) |
258 | 250 |
|
259 | | - if (userStatsRecords.length > 0) { |
260 | | - billedOverage = parseDecimal(userStatsRecords[0].billedOverageThisPeriod) |
261 | | - } |
| 251 | + return ownerStats.length > 0 ? parseDecimal(ownerStats[0].billedOverageThisPeriod) : 0 |
262 | 252 | } |
263 | 253 |
|
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 |
265 | 261 | } |
266 | 262 |
|
267 | 263 | export async function resetUsageForSubscription(sub: { plan: string | null; referenceId: string }) { |
|
0 commit comments