UNPKG

@it_kyryl/arbitrage_admin_schema

Version:

Schema for arbitrage admin panel

213 lines (212 loc) 14.5 kB
"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;