🛂 (billing) Past due status only for unpaid invoices with additional usage
This commit is contained in:
@ -9,6 +9,7 @@ import { RequestHandler } from 'next/dist/server/next'
|
|||||||
import { sendTelemetryEvents } from '@typebot.io/lib/telemetry/sendTelemetryEvent'
|
import { sendTelemetryEvents } from '@typebot.io/lib/telemetry/sendTelemetryEvent'
|
||||||
import { Settings } from '@typebot.io/schemas'
|
import { Settings } from '@typebot.io/schemas'
|
||||||
import { env } from '@typebot.io/env'
|
import { env } from '@typebot.io/env'
|
||||||
|
import { prices } from '@typebot.io/lib/billing/constants'
|
||||||
|
|
||||||
if (!env.STRIPE_SECRET_KEY || !env.STRIPE_WEBHOOK_SECRET)
|
if (!env.STRIPE_SECRET_KEY || !env.STRIPE_WEBHOOK_SECRET)
|
||||||
throw new Error('STRIPE_SECRET_KEY or STRIPE_WEBHOOK_SECRET missing')
|
throw new Error('STRIPE_SECRET_KEY or STRIPE_WEBHOOK_SECRET missing')
|
||||||
@ -176,7 +177,11 @@ const webhookHandler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
customer: invoice.customer as string,
|
customer: invoice.customer as string,
|
||||||
status: 'open',
|
status: 'open',
|
||||||
})
|
})
|
||||||
if (outstandingInvoices.data.length > 0)
|
const outstandingInvoicesWithAdditionalUsageCosts =
|
||||||
|
outstandingInvoices.data.filter(
|
||||||
|
(invoice) => invoice.amount_due > prices['PRO'] * 100
|
||||||
|
)
|
||||||
|
if (outstandingInvoicesWithAdditionalUsageCosts.length > 0)
|
||||||
return res.send({
|
return res.send({
|
||||||
message: 'Workspace has outstanding invoices, skipping.',
|
message: 'Workspace has outstanding invoices, skipping.',
|
||||||
})
|
})
|
||||||
@ -221,6 +226,14 @@ const webhookHandler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
message:
|
message:
|
||||||
'An active subscription still exists. Skipping downgrade.',
|
'An active subscription still exists. Skipping downgrade.',
|
||||||
})
|
})
|
||||||
|
const outstandingInvoices = await stripe.invoices.list({
|
||||||
|
customer: subscription.customer as string,
|
||||||
|
status: 'open',
|
||||||
|
})
|
||||||
|
const outstandingInvoicesWithAdditionalUsageCosts =
|
||||||
|
outstandingInvoices.data.filter(
|
||||||
|
(invoice) => invoice.amount_due > prices['PRO'] * 100
|
||||||
|
)
|
||||||
const workspace = await prisma.workspace.update({
|
const workspace = await prisma.workspace.update({
|
||||||
where: {
|
where: {
|
||||||
stripeId: subscription.customer as string,
|
stripeId: subscription.customer as string,
|
||||||
@ -230,6 +243,7 @@ const webhookHandler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
customChatsLimit: null,
|
customChatsLimit: null,
|
||||||
customStorageLimit: null,
|
customStorageLimit: null,
|
||||||
customSeatsLimit: null,
|
customSeatsLimit: null,
|
||||||
|
isPastDue: outstandingInvoicesWithAdditionalUsageCosts.length > 0,
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
members: {
|
members: {
|
||||||
|
Reference in New Issue
Block a user