@it_kyryl/arbitrage_admin_schema
Version:
Schema for arbitrage admin panel
90 lines (89 loc) • 4.93 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const big_js_1 = __importDefault(require("big.js"));
class ResolveRulesReportUseCase {
dependency;
constructor(dependency) {
this.dependency = dependency;
}
async execute({ financeProfile, totalFinanceReport, userFinanceProfile, financeReport }) {
// calculate rules report
await this.resolveRuleProfitReports({
financeReportId: financeReport.id,
totalFinanceReport,
userId: userFinanceProfile.userId,
financeProfileId: financeProfile.id,
totalFinanceReportId: totalFinanceReport.id
});
}
async resolveRuleProfitReports({ financeProfileId, financeReportId, totalFinanceReportId }) {
// get all tiered payout rule for finance profile id +
const tieredPayoutRules = await this.dependency.tieredPayoutRuleRepository.getTieredPayoutRuleSForFinanceResolver({
archived: false,
financeProfileId,
});
// for each tiered payout rule create or update rule profit report
for (const tieredPayoutRule of tieredPayoutRules) {
tieredPayoutRule.tieredPayoutRuleData = tieredPayoutRule.tieredPayoutRuleData.sort((a, b) => a.threshold - b.threshold);
const ruleProfitReport = await this.dependency.ruleProfitReportRepository.createOrUpdateRuleProfitReportForResolveUserFinanceReportUseCase({
financeReportId,
ruleId: tieredPayoutRule.id
});
for (const ruleSet of tieredPayoutRule.tieredPayoutTargetSets) {
let netProfit = new big_js_1.default(0);
let percent = null;
for (const setTarget of ruleSet.tieredPayoutRuleTargets) {
switch (tieredPayoutRule.entityType) {
case 'USER':
const userTargetProviderRevenue = await this.dependency.providerRevenueReportRepository.getTotalProvidersRevenueReport({
financeProfileId: setTarget.financeProfileId
});
const userTargetAccountsSpend = await this.dependency.accountSpendReportRepository.getTotalSpend({
financeProfileId: setTarget.financeProfileId
});
netProfit = netProfit.plus(userTargetProviderRevenue).minus(userTargetAccountsSpend);
break;
case "TEAM":
if (!setTarget.financeProfile.teamFinanceProfile?.teamId)
throw new Error(`Unable to find team id for finance profile ${setTarget.financeProfileId}`);
const teamIds = await this.dependency.teamRepository.getAllSubteamsForTeam(setTarget.financeProfile.teamFinanceProfile.teamId);
const teamTargetProviderRevenue = await this.dependency.providerRevenueReportRepository.getTotalProvidersRevenueReport({
teamIds,
totalFinanceReportId
});
const teamTargetAccountsSpend = await this.dependency.accountSpendReportRepository.getTotalSpend({
teamIds,
totalFinanceReportId
});
netProfit = netProfit.plus(teamTargetProviderRevenue).minus(teamTargetAccountsSpend);
break;
default:
break;
}
}
for (let ruleData of tieredPayoutRule.tieredPayoutRuleData) {
if (netProfit.lte(ruleData.threshold)) {
percent = ruleData.percent;
}
}
if (!percent && tieredPayoutRule.tieredPayoutRuleData.length > 0) {
percent = tieredPayoutRule.tieredPayoutRuleData[tieredPayoutRule.tieredPayoutRuleData.length - 1].percent;
}
if (!percent)
percent = 0;
const profitPayout = netProfit.mul(percent);
await this.dependency.ruleProfitReportEntityRepository.createOrUpdateRuleProfitReportForResolveUserFinanceReportUseCase({
ruleProfitReportId: ruleProfitReport.id,
setId: ruleSet.id,
bonusPercent: percent,
targetProfit: netProfit.toNumber(),
totalBonus: profitPayout.toNumber()
});
}
}
}
}
exports.default = ResolveRulesReportUseCase;