43 lines
2.2 KiB
JavaScript
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 }
|