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 }