feat: add monthly proration processing#27002
Conversation
Part 1 of monthly proration feature. Adds seat change tracking infrastructure with operationId for idempotency. **Dependency chain:** - This PR (seat tracking) - PR #27002 depends on this
Add seat change logging infrastructure with operationId for idempotency. This PR adds the foundation for monthly proration billing by tracking seat additions and removals, gated behind the monthly-proration feature flag. - Add operationId field to SeatChangeLog for idempotency - Update SeatChangeLogRepository to support upsert with operationId - Add feature flag guard in SeatChangeTrackingService - Integrate seat tracking in team member invites - Integrate seat tracking in bulk user deletions - Integrate seat tracking in team service operations - Integrate seat tracking in DSYNC user creation When monthly-proration feature flag is disabled, seat logging is skipped and behavior remains unchanged. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add monthly proration billing processing that works on top of the seat tracking infrastructure. This PR implements the core proration logic, webhook handlers, and integration with Stripe billing. - Enhance MonthlyProrationService to process seat change logs - Add payment webhook handlers (invoice.payment_succeeded, invoice.payment_failed) - Update subscription webhook to sync billing period on renewals - Update TeamBillingService to skip real-time updates when proration enabled - Enhance StripeBillingService with proration capabilities - Add Tasker enhancements for processing queues - Update team creation/upgrade routes Depends on: feat/monthly-proration-seat-tracking Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
fb62dea to
1917746
Compare
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Resolved conflicts in: - packages/features/ee/billing/service/billingProvider/IBillingProviderService.ts - packages/features/ee/billing/service/billingProvider/StripeBillingService.ts Both branches added independent methods to the billing interface: - PR branch: voidInvoice, getPaymentIntentFailureReason, hasDefaultPaymentMethod - main branch: createSubscriptionUsageRecord All methods from both branches have been preserved. Co-Authored-By: unknown <>
…er.devin.ai/proxy/github.com/calcom/cal.com into feat/monthly-proration-processing
|
|
||
| const { billingPeriod, pricePerSeat, paidSeats } = extractBillingDataFromStripeSubscription(subscription); | ||
|
|
||
| const teamBilling = await prisma.teamBilling.findUnique({ |
There was a problem hiding this comment.
perhaps we use a repository here?
There was a problem hiding this comment.
I'm actually going to make this blocking since we don't need to rush this out.
joeauyeung
left a comment
There was a problem hiding this comment.
Tested this out and it's working as expected.
I think we should ensure that we don't call prisma directly in any handlers so I'm making that a blocking comment before merging.
|
|
||
| const { billingPeriod, pricePerSeat, paidSeats } = extractBillingDataFromStripeSubscription(subscription); | ||
|
|
||
| const teamBilling = await prisma.teamBilling.findUnique({ |
There was a problem hiding this comment.
I'm actually going to make this blocking since we don't need to rush this out.
joeauyeung
left a comment
There was a problem hiding this comment.
Chatted with @sean-brydon about some feedback on ensuring we're checking the feature flag properly at every entry point into Cal.
Great job!
E2E results are ready! |
610df62 to
535775c
Compare
Part 2 of monthly proration feature.
Adds monthly proration billing processing that works on top of the seat tracking infrastructure.
Dependency chain:
Testing locally
--analyzecommandmonthly-prorationfeature flag