UNPKG

@it_kyryl/arbitrage_admin_schema

Version:

Schema for arbitrage admin panel

90 lines (89 loc) 4.93 kB
"use strict"; 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;