mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 00:03:33 +10:00
## Description Add support for teams which will allow users to collaborate on documents. Teams features allows users to: - Create, manage and transfer teams - Manage team members - Manage team emails - Manage a shared team inbox and documents These changes do NOT include the following, which are planned for a future release: - Team templates - Team API - Search menu integration ## Testing Performed - Added E2E tests for general team management - Added E2E tests to validate document counts ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [ ] I have updated the documentation to reflect these changes, if applicable. - [X] I have followed the project's coding style guidelines.
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import type Stripe from 'stripe';
|
|
|
|
import { stripe } from '@documenso/lib/server-only/stripe';
|
|
|
|
export type UpdateSubscriptionItemQuantityOptions = {
|
|
subscriptionId: string;
|
|
quantity: number;
|
|
priceId: string;
|
|
};
|
|
|
|
export const updateSubscriptionItemQuantity = async ({
|
|
subscriptionId,
|
|
quantity,
|
|
priceId,
|
|
}: UpdateSubscriptionItemQuantityOptions) => {
|
|
const subscription = await stripe.subscriptions.retrieve(subscriptionId);
|
|
|
|
const items = subscription.items.data.filter((item) => item.price.id === priceId);
|
|
|
|
if (items.length !== 1) {
|
|
throw new Error('Subscription does not contain required item');
|
|
}
|
|
|
|
const hasYearlyItem = items.find((item) => item.price.recurring?.interval === 'year');
|
|
const oldQuantity = items[0].quantity;
|
|
|
|
if (oldQuantity === quantity) {
|
|
return;
|
|
}
|
|
|
|
const subscriptionUpdatePayload: Stripe.SubscriptionUpdateParams = {
|
|
items: items.map((item) => ({
|
|
id: item.id,
|
|
quantity,
|
|
})),
|
|
};
|
|
|
|
// Only invoice immediately when changing the quantity of yearly item.
|
|
if (hasYearlyItem) {
|
|
subscriptionUpdatePayload.proration_behavior = 'always_invoice';
|
|
}
|
|
|
|
await stripe.subscriptions.update(subscriptionId, subscriptionUpdatePayload);
|
|
};
|