update users service
This commit is contained in:
@@ -23,6 +23,7 @@ import { PaymentsRepository } from "./repositories/payments.repository";
|
|||||||
import { zarinpalConfig } from "../../configs/zarinpal.config";
|
import { zarinpalConfig } from "../../configs/zarinpal.config";
|
||||||
import { NotificationModule } from "../notifications/notifications.module";
|
import { NotificationModule } from "../notifications/notifications.module";
|
||||||
import { ReferralsModule } from "../referrals/referrals.module";
|
import { ReferralsModule } from "../referrals/referrals.module";
|
||||||
|
import { UsersModule } from "../users/users.module";
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -49,6 +50,7 @@ import { ReferralsModule } from "../referrals/referrals.module";
|
|||||||
WalletsModule,
|
WalletsModule,
|
||||||
NotificationModule,
|
NotificationModule,
|
||||||
ReferralsModule,
|
ReferralsModule,
|
||||||
|
UsersModule
|
||||||
],
|
],
|
||||||
controllers: [PaymentsController],
|
controllers: [PaymentsController],
|
||||||
providers: [
|
providers: [
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import { DepositRequestsRepository } from "../repositories/deposit-requests.repo
|
|||||||
import { PaymentGatewaysRepository } from "../repositories/payment-gateway.repository";
|
import { PaymentGatewaysRepository } from "../repositories/payment-gateway.repository";
|
||||||
import { PaymentsRepository } from "../repositories/payments.repository";
|
import { PaymentsRepository } from "../repositories/payments.repository";
|
||||||
import { GatewayType } from "../types/gateway.type";
|
import { GatewayType } from "../types/gateway.type";
|
||||||
|
import { UsersService } from "../../users/providers/users.service";
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PaymentsService {
|
export class PaymentsService {
|
||||||
private readonly logger = new Logger(PaymentsService.name);
|
private readonly logger = new Logger(PaymentsService.name);
|
||||||
@@ -53,8 +54,9 @@ export class PaymentsService {
|
|||||||
private readonly walletsService: WalletsService,
|
private readonly walletsService: WalletsService,
|
||||||
private readonly depositRequestsRepository: DepositRequestsRepository,
|
private readonly depositRequestsRepository: DepositRequestsRepository,
|
||||||
private readonly referralsService: ReferralsService,
|
private readonly referralsService: ReferralsService,
|
||||||
|
private readonly usersService: UsersService,
|
||||||
private dataSource: DataSource,
|
private dataSource: DataSource,
|
||||||
) {}
|
) { }
|
||||||
|
|
||||||
//===============================================
|
//===============================================
|
||||||
async chargeWalletWithGateway(chargeDto: GatewayDepositDto, userId: string) {
|
async chargeWalletWithGateway(chargeDto: GatewayDepositDto, userId: string) {
|
||||||
@@ -453,34 +455,42 @@ export class PaymentsService {
|
|||||||
return frontUrl;
|
return frontUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async isFirstPurchase(userId: string, queryRunner: QueryRunner) {
|
// private async isFirstPurchase(userId: string, queryRunner: QueryRunner) {
|
||||||
const paymentCount = await queryRunner.manager.count(Payment, {
|
// const paymentCount = await queryRunner.manager.count(Payment, {
|
||||||
where: { user: { id: userId }, status: PaymentStatus.COMPLETED },
|
// where: { user: { id: userId }, status: PaymentStatus.COMPLETED },
|
||||||
});
|
// });
|
||||||
return paymentCount === 0;
|
// return paymentCount === 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
//===============================================
|
//===============================================
|
||||||
|
|
||||||
private async handleReferralReward(payment: Payment, queryRunner: QueryRunner) {
|
private async handleReferralReward(payment: Payment, queryRunner: QueryRunner) {
|
||||||
const isFirstPurchase = await this.isFirstPurchase(payment.user.id, queryRunner);
|
// const isFirstPurchase = await this.isFirstPurchase(payment.user.id, queryRunner);
|
||||||
if (!isFirstPurchase) return;
|
// if (!isFirstPurchase) return;
|
||||||
|
////
|
||||||
const referral = await this.referralsService.getPendingReferral(payment.user.id, queryRunner);
|
const referral = await this.referralsService.getPendingReferral(payment.user.id, queryRunner);
|
||||||
if (!referral) return;
|
if (!referral) return;
|
||||||
|
|
||||||
// 10%
|
const agentId = referral.referrer.id
|
||||||
const rewardAmount = new Decimal(payment.amount).mul(0.1);
|
const resellerOwner = await this.usersService.finResellerOwnerByAgentId(agentId)
|
||||||
|
|
||||||
const reward = await this.referralsService.createReferralReward(referral.referrer.id, referral.id, rewardAmount, queryRunner);
|
// 8%
|
||||||
|
const agentRewardAmount = new Decimal(payment.amount).mul(0.08);
|
||||||
|
const resellerOwnerRewardAmount = new Decimal(payment.amount).mul(0.02);
|
||||||
|
|
||||||
|
const agentReward = await this.referralsService.createReferralReward(agentId, referral.id, agentRewardAmount, queryRunner);
|
||||||
|
const resellerOwnerReward = await this.referralsService.createReferralReward(agentId, resellerOwner.id, resellerOwnerRewardAmount, queryRunner);
|
||||||
|
|
||||||
// Charge referrer's wallet
|
// Charge referrer's wallet
|
||||||
await this.walletsService.createReferralRewardTransaction(referral.referrer.id, rewardAmount, queryRunner);
|
await this.walletsService.createReferralRewardTransaction(agentId, agentRewardAmount, queryRunner);
|
||||||
|
await this.walletsService.createReferralRewardTransaction(resellerOwner.id, resellerOwnerRewardAmount, queryRunner);
|
||||||
|
|
||||||
// Update reward status
|
// Update reward status
|
||||||
reward.status = ReferralRewardStatus.PAID;
|
agentReward.status = ReferralRewardStatus.PAID;
|
||||||
reward.paidAt = dayjs().toDate();
|
agentReward.status = ReferralRewardStatus.PAID;
|
||||||
await queryRunner.manager.save(reward);
|
resellerOwnerReward.paidAt = dayjs().toDate();
|
||||||
|
resellerOwnerReward.paidAt = dayjs().toDate();
|
||||||
|
await queryRunner.manager.save([agentReward,resellerOwnerReward]);
|
||||||
|
|
||||||
// Update referral status
|
// Update referral status
|
||||||
referral.status = ReferralStatus.COMPLETED;
|
referral.status = ReferralStatus.COMPLETED;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { ResellerType } from '../auth/DTO/verify-reseller-otp.dto';
|
|||||||
import { PaginationDto } from '../../common/DTO/pagination.dto';
|
import { PaginationDto } from '../../common/DTO/pagination.dto';
|
||||||
import { WalletsService } from '../wallets/providers/wallets.service';
|
import { WalletsService } from '../wallets/providers/wallets.service';
|
||||||
import Decimal from 'decimal.js';
|
import Decimal from 'decimal.js';
|
||||||
|
import { IsNull } from 'typeorm';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ResellerService {
|
export class ResellerService {
|
||||||
@@ -186,6 +187,17 @@ export class ResellerService {
|
|||||||
if (!user) {
|
if (!user) {
|
||||||
throw new NotFoundException(AuthMessage.USER_NOT_FOUND)
|
throw new NotFoundException(AuthMessage.USER_NOT_FOUND)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pendingWithdrawRequest = await this.withdrawRequestRepository.findOne({
|
||||||
|
where: {
|
||||||
|
user: { id: userId },
|
||||||
|
paidAt: IsNull()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (pendingWithdrawRequest) {
|
||||||
|
throw new BadRequestException("امکان ایجاد درخواست برداشت جدید نیست")
|
||||||
|
}
|
||||||
|
|
||||||
const { balance } = await this.walletsService.getBalance(userId)
|
const { balance } = await this.walletsService.getBalance(userId)
|
||||||
|
|
||||||
if (new Decimal(balance).lessThan(requestedAmount)) {
|
if (new Decimal(balance).lessThan(requestedAmount)) {
|
||||||
|
|||||||
@@ -427,6 +427,20 @@ export class UsersService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**************************** */
|
/**************************** */
|
||||||
|
async finResellerOwnerByAgentId(agentId: string) {
|
||||||
|
const owner = await this.userRepository.findOne({
|
||||||
|
where: {
|
||||||
|
ownedReseller: {
|
||||||
|
agents: {
|
||||||
|
id: agentId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (!owner) {
|
||||||
|
throw new BadRequestException("صاحب نمایندگی پیدا نشد")
|
||||||
|
}
|
||||||
|
return owner
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user