UNPKG

@1amageek/tradable

Version:

Cloud Firestore model framework for TypeScript - Google

256 lines 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BalanceManager = void 0; const index_1 = require("./index"); class BalanceManager { constructor(transaction, account) { this._BalanceTransaction = transaction; this._Account = account; } /// Purchaser -> Platform charge(purchasedBy, orderID, currency, amount, transactionResult, transaction) { const purchaser = new this._Account(purchasedBy, {}); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.payment; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = purchasedBy; balanceTransaction.to = BalanceManager.platform; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(purchaser.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); return balanceTransaction; } /// Platform -> Purchaser refund(purchasedBy, orderID, currency, amount, transactionResult, transaction) { const purchaser = new this._Account(purchasedBy, {}); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.paymentRefund; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = BalanceManager.platform; balanceTransaction.to = purchasedBy; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(purchaser.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); return balanceTransaction; } /// User -> User from: userID, to: userID /// Platform -> User from: "platform", to: userID /// User -> Platform from: userID, to: "platform" async transfer(from, to, orderID, currency, amount, transactionResult, transaction) { if (from === BalanceManager.platform) { const receiver = new this._Account(to, {}); await receiver.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transfer; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(receiver.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const receiverBalance = (receiver.balance.available[currency] || 0) + amount; transaction.set(receiver.reference, { balance: { available: { [currency]: receiverBalance } } }); return balanceTransaction; } else if (to === BalanceManager.platform) { const sender = new this._Account(from, {}); await sender.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transfer; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(sender.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const senderBalance = (sender.balance.available[currency] || 0) - amount; transaction.set(sender.reference, { balance: { available: { [currency]: senderBalance } } }); return balanceTransaction; } else { const sender = new this._Account(from, {}); const receiver = new this._Account(to, {}); await Promise.all([sender.fetch(transaction), receiver.fetch(transaction)]); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transfer; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(sender.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); transaction.set(receiver.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const senderBalance = (sender.balance.available[currency] || 0) - amount; const receiverBalance = (receiver.balance.available[currency] || 0) + amount; transaction.set(sender.reference, { balance: { available: { [currency]: senderBalance } } }); transaction.set(receiver.reference, { balance: { available: { [currency]: receiverBalance } } }); return balanceTransaction; } } /// User -> User from: userID, to: userID /// Platform -> User from: "platform", to: userID /// User -> Platform from: userID, to: platform async transferRefund(from, to, orderID, currency, amount, transactionResult, transaction) { if (from === BalanceManager.platform) { const receiver = new this._Account(to, {}); await receiver.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transferRefund; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(receiver.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const receiverBalance = (receiver.balance.available[currency] || 0) + amount; transaction.set(receiver.reference, { balance: { available: { [currency]: receiverBalance } } }); return balanceTransaction; } else if (to === BalanceManager.platform) { const sender = new this._Account(from, {}); await sender.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transferRefund; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(sender.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const senderBalance = (sender.balance.available[currency] || 0) - amount; transaction.set(sender.reference, { balance: { available: { [currency]: senderBalance } } }); return balanceTransaction; } else { const sender = new this._Account(from, {}); const receiver = new this._Account(to, {}); await Promise.all([sender.fetch(transaction), receiver.fetch(transaction)]); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.transferRefund; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.order = orderID; balanceTransaction.from = from; balanceTransaction.to = to; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(sender.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); transaction.set(receiver.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const senderBalance = (sender.balance.available[currency] || 0) - amount; const receiverBalance = (receiver.balance.available[currency] || 0) + amount; transaction.set(sender.reference, { balance: { available: { [currency]: senderBalance } } }); transaction.set(receiver.reference, { balance: { available: { [currency]: receiverBalance } } }); return balanceTransaction; } } async payout(accountID, currency, amount, transactionResult, transaction) { const sender = new this._Account(accountID, {}); await sender.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.payout; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.from = accountID; balanceTransaction.to = BalanceManager.bankAccount; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(sender.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const senderBalance = (sender.balance.available[currency] || 0) - amount; transaction.set(sender.reference, { balance: { available: { [currency]: senderBalance } } }); return balanceTransaction; } async payoutCancel(accountID, currency, amount, transactionResult, transaction) { const receiver = new this._Account(accountID, {}); await receiver.fetch(transaction); const balanceTransaction = new this._BalanceTransaction(); balanceTransaction.type = index_1.BalanceTransactionType.payoutCancel; balanceTransaction.currency = currency; balanceTransaction.amount = amount; balanceTransaction.from = BalanceManager.bankAccount; balanceTransaction.to = accountID; balanceTransaction.transactionResults.push(transactionResult); transaction.set(balanceTransaction.reference, balanceTransaction.value(), { merge: true }); transaction.set(receiver.balanceTransactions.reference.doc(balanceTransaction.id), balanceTransaction.value(), { merge: true }); const receiverBalance = (receiver.balance.available[currency] || 0) + amount; transaction.set(receiver.reference, { balance: { available: { [currency]: receiverBalance } } }); return balanceTransaction; } } exports.BalanceManager = BalanceManager; BalanceManager.platform = "platform"; BalanceManager.bankAccount = "bank_account"; //# sourceMappingURL=balanceManager.js.map