@it_kyryl/arbitrage_admin_schema
Version:
Schema for arbitrage admin panel
104 lines (103 loc) • 5.07 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"));
const moment_timezone_1 = __importDefault(require("moment-timezone"));
class ResolveUserFinanceReportUseCase {
dependency;
constructor(dependency) {
this.dependency = dependency;
}
async execute({ totalFinanceReport, userFinanceProfile, financeReport, providerAccounts }) {
// calculate static monthly salary, hourly salary rate
await this.resolverUserFinanceReport({
userFinanceProfile,
userFinanceReport: financeReport.userFinanceReport,
financeReportId: financeReport.id
});
// calculate providers revenue
await this.resolveProviderRevenueReport({
financeReportId: financeReport.id,
totalFinanceReport,
userId: userFinanceProfile.userId,
providerAccounts
});
// calculate accounts spend
await this.resolveAccountsSpendReport({
financeReportId: financeReport.id,
totalFinanceReport,
userId: userFinanceProfile.userId
});
}
// resolve fixed salary, hors salary
async resolverUserFinanceReport({ userFinanceProfile, userFinanceReport, financeReportId }) {
let fixedSalary = new big_js_1.default(userFinanceProfile.fixedSalary);
let workingHours = 0;
let hourlyRate = userFinanceProfile.hourlyRate;
let totalRateSalary = new big_js_1.default(workingHours).mul(new big_js_1.default(hourlyRate));
let totalEmploymentSalary = totalRateSalary.add(fixedSalary);
if (!userFinanceReport) {
userFinanceReport = await this.dependency.userFinanceReportRepository.createUserFinanceReportForResolveFinanceProviderUseCase({
financeReportId,
fixedSalary: fixedSalary.toNumber(),
hourlyRate: hourlyRate,
workingHours,
totalEmploymentSalary: totalEmploymentSalary.toNumber(),
totalRateSalary: totalRateSalary.toNumber()
});
}
else if (userFinanceReport.totalEmploymentSalary !== totalEmploymentSalary.toNumber()) {
await this.dependency.userFinanceReportRepository.updateUserFinanceReport(userFinanceReport.id, {
fixedSalary: fixedSalary.toNumber(),
workingHours,
hourlyRate,
totalRateSalary: totalRateSalary.toNumber(),
totalEmploymentSalary: totalEmploymentSalary.toNumber()
});
}
}
async resolveProviderRevenueReport({ financeReportId, totalFinanceReport, userId, providerAccounts }) {
for (let providerAccount of providerAccounts) {
const providerAccountId = providerAccount.id;
const dateRevenue = await this.dependency.dateRevenueRepository.getTotalDateRevenueForResolveFinanceProviderUseCase({
dateFrom: (0, moment_timezone_1.default)(totalFinanceReport.dateFrom),
dateTo: (0, moment_timezone_1.default)(totalFinanceReport.dateTo),
providerAccountId,
userId
});
await this.dependency.providerRevenueReportRepository.createOrUpdateProviderRevenueReportForResolveUserFinanceReportUseCase({
revenue: dateRevenue,
financeReportId,
providerAccountId
});
}
}
async resolveAccountsSpendReport({ financeReportId, totalFinanceReport, userId }) {
const accountsSpend = await this.dependency.adStatRepository.getGroupedAccountSpend({
userId,
dateFrom: (0, moment_timezone_1.default)(totalFinanceReport.dateFrom),
dateTo: (0, moment_timezone_1.default)(totalFinanceReport.dateTo)
});
for (let accountSpend of accountsSpend) {
const accountData = await this.dependency.accountRepository.getAccountDetailsForFinanceResolver(accountSpend.accountId);
if (!accountData)
continue;
const feeSubscription = accountData.startFee;
const feePercent = accountData.accountFeePercent;
const fee = new big_js_1.default(feePercent).mul(accountSpend.spend);
const totalSpend = fee.plus(new big_js_1.default(accountSpend.spend)).plus(new big_js_1.default(feeSubscription));
await this.dependency.accountSpendReportRepository.createOrUpdateAccountSpendReportForResolveUserFinanceReportUseCase({
accountId: accountSpend.accountId,
financeReportId,
feeSubscription,
feePercent,
fee: fee.toNumber(),
spend: accountSpend.spend,
totalSpend: totalSpend.toNumber()
});
}
}
}
exports.default = ResolveUserFinanceReportUseCase;