Files
modstagram-back/utils/walletSplit.js
2026-09-24 21:00:07 +03:30

43 lines
2.2 KiB
JavaScript

const WalletTransactionModel = require('../models/WalletTransactionModel')
const { getBucketBalance } = require('../controllers/application/wallet/walletController')
/**
* وقتی کاربر موقع خرید تیکِ «استفاده از موجودی کیف پول» رو می‌زنه (useWallet=true)،
* تا هر مقدار که سبدِ «charged» (شارژِ دستیِ کیف پول، همون چیزی که کاربر خودش واریز
* کرده — نه سبدهای درآمدیِ shop/academy/project/booking) پوشش بده از همونجا کسر
* می‌شه و فقط باقی‌مونده (اگه چیزی مونده باشه) از درگاه زرین‌پال گرفته می‌شه. اگه
* useWallet نباشه یا موجودی صفر باشه، دقیقاً مثلِ قبل کاملش از درگاه پرداخت می‌شه.
*
* عمداً همینجا چیزی کسر نمی‌کنه (فقط محاسبه) — کسرِ واقعی رو خودِ فراخوان، فقط لحظه‌ای
* که پرداخت قطعاً موفق شده (یا کلاً از درگاه رد نشده، یعنی fullyCovered) صدا می‌زنه؛
* این‌طوری اگه کاربر پرداختِ درگاه رو نصفه ول کنه، هیچ مبلغی از کیف پول کم نشده که
* لازم باشه برگردونده بشه
*/
async function resolveWalletSplit (userId, amount, useWallet) {
if (!useWallet) {
return { walletAmount: 0, gatewayAmount: amount, fullyCovered: false }
}
const balance = await getBucketBalance(userId, 'charged')
if (!balance || balance <= 0) {
return { walletAmount: 0, gatewayAmount: amount, fullyCovered: false }
}
const walletAmount = Math.min(balance, amount)
const gatewayAmount = amount - walletAmount
return { walletAmount, gatewayAmount, fullyCovered: gatewayAmount <= 0 }
}
async function debitWalletForPurchase (userId, walletAmount, { referenceType, referenceId, description }) {
if (!walletAmount || walletAmount <= 0) return
await WalletTransactionModel.create({
user: userId,
bucket: 'charged',
type: 'debit',
amount: walletAmount,
referenceType,
referenceId,
description
})
}
module.exports = { resolveWalletSplit, debitWalletForPurchase }