@@ -23,7 +23,7 @@ import { createLogger } from '@sim/logger'
2323import { getErrorMessage } from '@sim/utils/errors'
2424import { generateId } from '@sim/utils/id'
2525import { normalizeEmail } from '@sim/utils/string'
26- import { and , count , eq , inArray , isNull , ne , or , sql } from 'drizzle-orm'
26+ import { and , count , desc , eq , inArray , isNull , ne , or , sql } from 'drizzle-orm'
2727import { invalidateMembershipCache } from '@/lib/auth/security-policy'
2828import { applySessionPolicyToNewMember } from '@/lib/auth/session-policy'
2929import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage'
@@ -429,6 +429,8 @@ export interface AddMemberParams {
429429 skipBillingLogic ?: boolean
430430 /** Skip seat validation (default: false) */
431431 skipSeatValidation ?: boolean
432+ /** Restrict billing decisions to an already-resolved entitled organization subscription. */
433+ organizationSubscriptionId ?: string
432434 /** When provided, the acceptor's own pending invitation is excluded from the seat count during validation. */
433435 acceptingInvitationId ?: string
434436}
@@ -593,6 +595,7 @@ export async function ensureUserInOrganizationTx(
593595 role,
594596 skipBillingLogic = false ,
595597 skipSeatValidation = false ,
598+ organizationSubscriptionId,
596599 } = params
597600 const emptyBillingActions = {
598601 proUsageSnapshotted : false ,
@@ -665,9 +668,13 @@ export async function ensureUserInOrganizationTx(
665668 . where (
666669 and (
667670 eq ( subscriptionTable . referenceId , organizationId ) ,
668- inArray ( subscriptionTable . status , ENTITLED_SUBSCRIPTION_STATUSES )
671+ inArray ( subscriptionTable . status , ENTITLED_SUBSCRIPTION_STATUSES ) ,
672+ organizationSubscriptionId
673+ ? eq ( subscriptionTable . id , organizationSubscriptionId )
674+ : undefined
669675 )
670676 )
677+ . orderBy ( desc ( subscriptionTable . periodStart ) , desc ( subscriptionTable . id ) )
671678 . limit ( 1 )
672679 if ( ! organizationSubscription || ! isPaid ( organizationSubscription . plan ) ) {
673680 return {
@@ -724,9 +731,13 @@ export async function ensureUserInOrganizationTx(
724731 . where (
725732 and (
726733 eq ( subscriptionTable . referenceId , organizationId ) ,
727- inArray ( subscriptionTable . status , ENTITLED_SUBSCRIPTION_STATUSES )
734+ inArray ( subscriptionTable . status , ENTITLED_SUBSCRIPTION_STATUSES ) ,
735+ organizationSubscriptionId
736+ ? eq ( subscriptionTable . id , organizationSubscriptionId )
737+ : undefined
728738 )
729739 )
740+ . orderBy ( desc ( subscriptionTable . periodStart ) , desc ( subscriptionTable . id ) )
730741 . limit ( 1 )
731742 return organizationSubscription && isPaid ( organizationSubscription . plan )
732743 ? applyPaidOrgJoinBillingTx ( tx , userId , organizationId )
@@ -2008,6 +2019,7 @@ export async function addUserToOrganization(params: AddMemberParams): Promise<Ad
20082019 role,
20092020 skipBillingLogic = false ,
20102021 skipSeatValidation = false ,
2022+ organizationSubscriptionId,
20112023 acceptingInvitationId,
20122024 } = params
20132025
@@ -2066,6 +2078,7 @@ export async function addUserToOrganization(params: AddMemberParams): Promise<Ad
20662078 role,
20672079 skipBillingLogic,
20682080 skipSeatValidation,
2081+ organizationSubscriptionId,
20692082 acceptingInvitationId,
20702083 } )
20712084 )
0 commit comments