@it_kyryl/arbitrage_admin_schema
Version:
Schema for arbitrage admin panel
213 lines (212 loc) • 14.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const moment_timezone_1 = __importDefault(require("moment-timezone"));
const moment_1 = require("../../../domain/moment");
const prisma_1 = __importDefault(require("../../clients/prisma"));
const Account_repository_1 = __importDefault(require("../../repository/database/Account/Account.repository"));
const PrismaAccountSpendReport_repository_1 = __importDefault(require("../../repository/database/AccountSpendReport/PrismaAccountSpendReport.repository"));
const PrismaAdStat_repository_1 = __importDefault(require("../../repository/database/AdStat/PrismaAdStat.repository"));
const PrismaBalanceSetting_repository_1 = __importDefault(require("../../repository/database/BalanceSetting/PrismaBalanceSetting.repository"));
const PrismaDateRevenue_repository_1 = __importDefault(require("../../repository/database/DateRevenue/PrismaDateRevenue.repository"));
const PrismaFinanceProfile_repository_1 = __importDefault(require("../../repository/database/FinanceProfile/PrismaFinanceProfile.repository"));
const PrismaFinanceReport_repository_1 = __importDefault(require("../../repository/database/FinanceReport/PrismaFinanceReport.repository"));
const PrismaProviderBaseReport_repository_1 = __importDefault(require("../../repository/database/ProviderBaseReport/PrismaProviderBaseReport.repository"));
const PrismaProviderRevenueReport_repository_1 = __importDefault(require("../../repository/database/ProviderRevenueReport/PrismaProviderRevenueReport.repository"));
const PrismaProviderAccount_repository_1 = __importDefault(require("../../repository/database/ProvierAccount/PrismaProviderAccount.repository"));
const PrismaRuleProfitReport_repository_1 = __importDefault(require("../../repository/database/RuleProfitReport/PrismaRuleProfitReport.repository"));
const PrismaRuleProfitReportEntity_repository_1 = __importDefault(require("../../repository/database/RuleProfitReportEntity/PrismaRuleProfitReportEntity.repository"));
const PrismaTeam_repository_1 = __importDefault(require("../../repository/database/Team/PrismaTeam.repository"));
const TieredPayoutRule_repository_1 = __importDefault(require("../../repository/database/TieredPayoutRule/TieredPayoutRule.repository"));
const PrismaTransaction_repository_1 = __importDefault(require("../../repository/database/Transaction/PrismaTransaction.repository"));
const PrismaUserFinanceReport_repository_1 = __importDefault(require("../../repository/database/user-finance-report/PrismaUserFinanceReport.repository"));
const Transaction_service_1 = __importDefault(require("../../services/Transaction/Transaction.service"));
const ResolveFinanceBalance_use_case_1 = __importDefault(require("../../use-cases/Finance/ResolveFinanceBalance.use-case"));
const ResolveFinanceProviderReport_use_case_1 = __importDefault(require("../../use-cases/Finance/ResolveFinanceProviderReport.use-case"));
const ResolveRulesReport_use_case_1 = __importDefault(require("../../use-cases/Finance/ResolveRulesReport.use-case"));
const ResolveUserFinanceReport_use_case_1 = __importDefault(require("../../use-cases/Finance/ResolveUserFinanceReport.use-case"));
const BaseController_1 = require("../BaseController");
class ResolveFinanceController extends BaseController_1.BaseController {
async useCasesImplementation(input) {
const mainTimezone = moment_1.Timezone.AMERICA_LOS_ANGELES;
const thisMonthMainReportsDateFrom = input.dependency.momentService.getStartOfTheMonth();
const thisMonthMainReportsDateTo = input.dependency.momentService.getEndOfTheMonth();
const monthlyReports = [];
const workerStartDate = moment_timezone_1.default.utc();
//get common provider accounts, we'll use it in different places, data are static so we can get it here
const providerAccounts = await input.dependency.providerAccountRepository.getAllProviderAccountsForResolveFinance();
//try to get this mont report
let thisMonthReport = await input.dependency.monthlyReportRepository.getMonthlyReportForDateForResolveFinance(input.dependency.momentService.getCurDate());
// if this month report does not exist - create it
if (!thisMonthReport)
thisMonthReport = await input.dependency.monthlyReportRepository.createMonthlyReportForResolveFinance({
dateFrom: thisMonthMainReportsDateFrom,
dateTo: thisMonthMainReportsDateTo
});
//keep it in array for future actions
monthlyReports.push(thisMonthReport);
// get finance profiles
let financeProfiles = await input.dependency.financeProfileRepository.findManyForResolveFinance();
if (input.dependency.momentService.todayIsTheFirstDayOfTheMonth()) {
const lastMonthReport = await input.dependency.monthlyReportRepository.getMonthlyReportForDateForResolveFinance(input.dependency.momentService.getCurDate().subtract(1, 'month'));
if (lastMonthReport)
monthlyReports.push(lastMonthReport);
}
// resolve monthly reports
for (let monthlyReport of monthlyReports) {
// try to get total finance report, remember total finance report is a top entity for finance report, monthly report is top level entity for transactions and finance report
let totalFinanceReport = await input.dependency.totalFinanceReportRepository.getTotalFinanceReportByMonthlyReportIdForFinanceResolver(monthlyReport.id);
if (!totalFinanceReport)
totalFinanceReport = await input.dependency.totalFinanceReportRepository.createTotalFinanceReportForFinanceResolver({
dateFrom: thisMonthMainReportsDateFrom,
dateTo: thisMonthMainReportsDateTo,
monthlyReportId: monthlyReport.id,
name: `${thisMonthMainReportsDateFrom.format(`YYYY-MM-DD`)} - ${thisMonthMainReportsDateTo.format(`YYYY-MM-DD`)}`
});
for (let financeProfile of financeProfiles) {
await this.resolveBaseTotalFinanceReport(financeProfile, input, totalFinanceReport, providerAccounts);
}
for (let financeProfile of financeProfiles) {
await this.resolveRulesTotalFinanceReport(financeProfile, input, totalFinanceReport);
}
}
// get finance profiles again, balances has been changed
financeProfiles = await input.dependency.financeProfileRepository.findManyForResolveFinance();
// resolve finance balance transfer
for (let financeProfile of financeProfiles) {
await this.resolveFinanceBalance(financeProfile, input, mainTimezone, thisMonthReport.id, workerStartDate);
// update this use case which will also save cache to finance user report and update current balance before rules resolver to-do
}
}
async resolveProviderBaseReport(input, totalFinanceReport, prismaClient, providerAccounts) {
const resolveFinanceProviderReportUseCase = new ResolveFinanceProviderReport_use_case_1.default({
momentService: input.dependency.momentService,
dateRevenueRepository: new PrismaDateRevenue_repository_1.default(prismaClient),
providerAccountRepository: new PrismaProviderAccount_repository_1.default(prismaClient),
providerBaseReportRepository: new PrismaProviderBaseReport_repository_1.default(prismaClient)
});
await resolveFinanceProviderReportUseCase.execute({
totalFinanceReport,
providerAccounts
});
}
async resolveRulesTotalFinanceReport(financeProfile, input, totalFinanceReport) {
await prisma_1.default.$transaction(async (tsn) => {
// get or create finance report if does not exists
const financeReportRepository = new PrismaFinanceReport_repository_1.default(tsn);
let financeReport = await financeReportRepository.getFinanceReportForTotalReportResolver({
financeProfileId: financeProfile.id,
totalFinanceReportId: totalFinanceReport.id
});
if (!financeReport)
financeReport = await financeReportRepository.createFinanceReportForFinanceResolver({
financeProfileId: financeProfile.id,
remainedBalance: 0,
totalBalance: 0,
totalFinanceReportId: totalFinanceReport.id
});
// resolve user or team finance reports
if (financeProfile.userFinanceProfile?.userId) {
const resolveUserFinanceReportUseCase = new ResolveRulesReport_use_case_1.default({
financeReportRepository: financeReportRepository,
momentService: input.dependency.momentService,
userFinanceReportRepository: new PrismaUserFinanceReport_repository_1.default(tsn),
dateRevenueRepository: new PrismaDateRevenue_repository_1.default(tsn),
providerRevenueReportRepository: new PrismaProviderRevenueReport_repository_1.default(tsn),
accountSpendReportRepository: new PrismaAccountSpendReport_repository_1.default(tsn),
adStatRepository: new PrismaAdStat_repository_1.default(tsn),
accountRepository: new Account_repository_1.default(tsn),
ruleProfitReportEntityRepository: new PrismaRuleProfitReportEntity_repository_1.default(tsn),
tieredPayoutRuleRepository: new TieredPayoutRule_repository_1.default(tsn),
ruleProfitReportRepository: new PrismaRuleProfitReport_repository_1.default(tsn),
financeProfileRepository: new PrismaFinanceProfile_repository_1.default(tsn),
teamRepository: new PrismaTeam_repository_1.default(tsn)
});
await resolveUserFinanceReportUseCase.execute({
financeProfile,
totalFinanceReport,
userFinanceProfile: financeProfile.userFinanceProfile,
financeReport
});
}
else if (financeProfile.teamFinanceProfile?.teamId) {
throw new Error(`Team finance profile is not resolvable yet.`);
}
})
.catch(async (e) => {
await this.handleError(e);
});
}
async resolveBaseTotalFinanceReport(financeProfile, input, totalFinanceReport, providerAccounts) {
await prisma_1.default.$transaction(async (tsn) => {
await this.resolveProviderBaseReport(input, totalFinanceReport, tsn, providerAccounts);
// get or create finance report if does not exists
const financeReportRepository = new PrismaFinanceReport_repository_1.default(tsn);
let financeReport = await financeReportRepository.getFinanceReportForTotalReportResolver({
financeProfileId: financeProfile.id,
totalFinanceReportId: totalFinanceReport.id
});
if (!financeReport)
financeReport = await financeReportRepository.createFinanceReportForFinanceResolver({
financeProfileId: financeProfile.id,
remainedBalance: 0,
totalBalance: 0,
totalFinanceReportId: totalFinanceReport.id
});
// resolve user or team finance reports
if (financeProfile.userFinanceProfile?.userId) {
const resolveUserFinanceReportUseCase = new ResolveUserFinanceReport_use_case_1.default({
financeReportRepository: financeReportRepository,
momentService: input.dependency.momentService,
userFinanceReportRepository: new PrismaUserFinanceReport_repository_1.default(tsn),
dateRevenueRepository: new PrismaDateRevenue_repository_1.default(tsn),
providerRevenueReportRepository: new PrismaProviderRevenueReport_repository_1.default(tsn),
accountSpendReportRepository: new PrismaAccountSpendReport_repository_1.default(tsn),
adStatRepository: new PrismaAdStat_repository_1.default(tsn),
accountRepository: new Account_repository_1.default(tsn)
});
await resolveUserFinanceReportUseCase.execute({
totalFinanceReport,
userFinanceProfile: financeProfile.userFinanceProfile,
financeReport,
providerAccounts
});
}
else if (financeProfile.teamFinanceProfile?.teamId) {
throw new Error(`Team finance profile is not resolvable yet.`);
}
})
.catch(async (e) => {
await this.handleError(e);
});
}
async resolveFinanceBalance(financeProfile, input, mainTimezone, thisMonthReportId, workerStartDate) {
await prisma_1.default.$transaction(async (tsn) => {
const financeProfileRepository = new PrismaFinanceProfile_repository_1.default(tsn);
const transactionRepository = new PrismaTransaction_repository_1.default(tsn);
const resolveFinanceBalanceUseCase = new ResolveFinanceBalance_use_case_1.default({
financeProfileRepository,
balanceSettingRepository: new PrismaBalanceSetting_repository_1.default(tsn),
financeReportRepository: new PrismaFinanceReport_repository_1.default(tsn),
momentService: input.dependency.momentService,
transactionRepository: transactionRepository,
transactionService: new Transaction_service_1.default({
financeProfileRepository,
transactionRepository
})
});
await resolveFinanceBalanceUseCase.execute({
financeProfile,
mainTimezone,
monthlyReportId: thisMonthReportId,
todayDate: workerStartDate,
});
})
.catch(async (e) => {
await this.handleError(e);
});
}
}
exports.default = ResolveFinanceController;