full app
This commit is contained in:
42
utils/walletSplit.js
Normal file
42
utils/walletSplit.js
Normal file
@@ -0,0 +1,42 @@
|
||||
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 }
|
||||
Reference in New Issue
Block a user