Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions apps/web/app/(ee)/api/cron/trigger-withdrawal/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export async function GET(req: Request) {
try {
await verifyVercelSignature(req);

const [currentBalance, pendingPayouts] = await Promise.all([
const [stripeBalanceData, dubProcessingPayouts] = await Promise.all([
stripe.balance.retrieve(),
prisma.payout.aggregate({
where: {
Expand All @@ -26,40 +26,51 @@ export async function GET(req: Request) {
}),
]);

const currentAvailableBalance = stripeBalanceData.available[0].amount;
const currentPendingBalance = stripeBalanceData.pending[0].amount;
const currentNetBalance = currentAvailableBalance + currentPendingBalance;

console.log({
currentAvailableBalance,
currentPendingBalance,
currentNetBalance,
dubProcessingPayouts,
stripeBalanceData,
});

let reservedBalance = 50000; // keep at least $500 in the account

const totalPendingPayouts = pendingPayouts._sum.amount;
if (totalPendingPayouts) {
const totalProcessingPayouts = dubProcessingPayouts._sum.amount;
if (totalProcessingPayouts) {
// add the pending payouts to the reserved balance (to make sure we have enough balance
// to pay out partners when chargeSucceeded webhook is triggered)
reservedBalance += totalPendingPayouts;
reservedBalance += totalProcessingPayouts;
}

if (reservedBalance > currentBalance.available[0].amount) {
if (reservedBalance > currentNetBalance) {
return NextResponse.json({
message: "Insufficient balance to trigger withdrawal, skipping...",
});
}

const balanceToWithdraw =
currentBalance.available[0].amount - reservedBalance;
const balanceToWithdraw = currentNetBalance - reservedBalance;

if (balanceToWithdraw <= 10000) {
return NextResponse.json({
message: "Balance to withdraw is less than $100, skipping...",
});
}

const createPayout = await stripe.payouts.create({
const createdPayout = await stripe.payouts.create({
amount: balanceToWithdraw,
currency: "usd",
});

return NextResponse.json({
currentBalance,
currentNetBalance,
reservedBalance,
balanceToWithdraw,
createPayout,
createdPayout,
});
} catch (error) {
return handleAndReturnErrorResponse(error);
Expand Down