@1amageek/tradable
Version:
Cloud Firestore model framework for TypeScript - Google
256 lines • 13.4 kB
JavaScript
"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