From 36a57db33b6314b6a04936a3d515b88e7082115e Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 16 Apr 2026 09:50:59 +0330 Subject: [PATCH] update users service --- src/modules/payments/payments.module.ts | 2 + .../payments/providers/payments.service.ts | 44 ++++++++++++------- src/modules/reseller/reseller.service.ts | 12 +++++ src/modules/users/providers/users.service.ts | 16 ++++++- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/modules/payments/payments.module.ts b/src/modules/payments/payments.module.ts index b32655c..272ebf8 100755 --- a/src/modules/payments/payments.module.ts +++ b/src/modules/payments/payments.module.ts @@ -23,6 +23,7 @@ import { PaymentsRepository } from "./repositories/payments.repository"; import { zarinpalConfig } from "../../configs/zarinpal.config"; import { NotificationModule } from "../notifications/notifications.module"; import { ReferralsModule } from "../referrals/referrals.module"; +import { UsersModule } from "../users/users.module"; @Module({ imports: [ @@ -49,6 +50,7 @@ import { ReferralsModule } from "../referrals/referrals.module"; WalletsModule, NotificationModule, ReferralsModule, + UsersModule ], controllers: [PaymentsController], providers: [ diff --git a/src/modules/payments/providers/payments.service.ts b/src/modules/payments/providers/payments.service.ts index 11bccaf..9d13065 100755 --- a/src/modules/payments/providers/payments.service.ts +++ b/src/modules/payments/providers/payments.service.ts @@ -39,6 +39,7 @@ import { DepositRequestsRepository } from "../repositories/deposit-requests.repo import { PaymentGatewaysRepository } from "../repositories/payment-gateway.repository"; import { PaymentsRepository } from "../repositories/payments.repository"; import { GatewayType } from "../types/gateway.type"; +import { UsersService } from "../../users/providers/users.service"; @Injectable() export class PaymentsService { private readonly logger = new Logger(PaymentsService.name); @@ -53,8 +54,9 @@ export class PaymentsService { private readonly walletsService: WalletsService, private readonly depositRequestsRepository: DepositRequestsRepository, private readonly referralsService: ReferralsService, + private readonly usersService: UsersService, private dataSource: DataSource, - ) {} + ) { } //=============================================== async chargeWalletWithGateway(chargeDto: GatewayDepositDto, userId: string) { @@ -453,34 +455,42 @@ export class PaymentsService { return frontUrl; } - private async isFirstPurchase(userId: string, queryRunner: QueryRunner) { - const paymentCount = await queryRunner.manager.count(Payment, { - where: { user: { id: userId }, status: PaymentStatus.COMPLETED }, - }); - return paymentCount === 0; - } + // private async isFirstPurchase(userId: string, queryRunner: QueryRunner) { + // const paymentCount = await queryRunner.manager.count(Payment, { + // where: { user: { id: userId }, status: PaymentStatus.COMPLETED }, + // }); + // return paymentCount === 0; + // } //=============================================== private async handleReferralReward(payment: Payment, queryRunner: QueryRunner) { - const isFirstPurchase = await this.isFirstPurchase(payment.user.id, queryRunner); - if (!isFirstPurchase) return; - + // const isFirstPurchase = await this.isFirstPurchase(payment.user.id, queryRunner); + // if (!isFirstPurchase) return; + //// const referral = await this.referralsService.getPendingReferral(payment.user.id, queryRunner); if (!referral) return; - // 10% - const rewardAmount = new Decimal(payment.amount).mul(0.1); + const agentId = referral.referrer.id + 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 - 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 - reward.status = ReferralRewardStatus.PAID; - reward.paidAt = dayjs().toDate(); - await queryRunner.manager.save(reward); + agentReward.status = ReferralRewardStatus.PAID; + agentReward.status = ReferralRewardStatus.PAID; + resellerOwnerReward.paidAt = dayjs().toDate(); + resellerOwnerReward.paidAt = dayjs().toDate(); + await queryRunner.manager.save([agentReward,resellerOwnerReward]); // Update referral status referral.status = ReferralStatus.COMPLETED; diff --git a/src/modules/reseller/reseller.service.ts b/src/modules/reseller/reseller.service.ts index 7220720..b77a11b 100644 --- a/src/modules/reseller/reseller.service.ts +++ b/src/modules/reseller/reseller.service.ts @@ -15,6 +15,7 @@ import { ResellerType } from '../auth/DTO/verify-reseller-otp.dto'; import { PaginationDto } from '../../common/DTO/pagination.dto'; import { WalletsService } from '../wallets/providers/wallets.service'; import Decimal from 'decimal.js'; +import { IsNull } from 'typeorm'; @Injectable() export class ResellerService { @@ -186,6 +187,17 @@ export class ResellerService { if (!user) { 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) if (new Decimal(balance).lessThan(requestedAmount)) { diff --git a/src/modules/users/providers/users.service.ts b/src/modules/users/providers/users.service.ts index 8a8cdd9..d62c2fb 100755 --- a/src/modules/users/providers/users.service.ts +++ b/src/modules/users/providers/users.service.ts @@ -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 + } }