refactor: the invoice and subscription flow of user
This commit is contained in:
@@ -28,12 +28,6 @@ export class UserSubscription extends BaseEntity {
|
||||
@Column({ type: "text", nullable: false })
|
||||
description: string;
|
||||
|
||||
@Column({ type: "enum", enum: SubscriptionStatus, default: SubscriptionStatus.PENDING })
|
||||
@Column({ type: "enum", enum: SubscriptionStatus, default: SubscriptionStatus.INACTIVE })
|
||||
status: SubscriptionStatus;
|
||||
|
||||
@Column({ type: "boolean", default: false })
|
||||
isCanceled: boolean;
|
||||
|
||||
// @OneToMany(() => UserQuickAccess, (quickAccess) => quickAccess.userSubscription)
|
||||
// quickAccess: UserQuickAccess[];
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
export enum SubscriptionStatus {
|
||||
ACTIVE = "ACTIVE",
|
||||
INACTIVE = "INACTIVE",
|
||||
PENDING = "PENDING",
|
||||
// PENDING = "PENDING",
|
||||
CANCELED = "CANCELED",
|
||||
EXPIRED = "EXPIRED",
|
||||
}
|
||||
|
||||
@@ -4,14 +4,14 @@ import dayjs from "dayjs";
|
||||
import Decimal from "decimal.js";
|
||||
import { DataSource, In } from "typeorm";
|
||||
|
||||
import { ServiceMessage, SubscriptionMessage, WalletMessage } from "../../../common/enums/message.enum";
|
||||
import { ServiceMessage, SubscriptionMessage } from "../../../common/enums/message.enum";
|
||||
import { DanakServicesService } from "../../danak-services/providers/danak-services.service";
|
||||
import { DiscountCalculationType } from "../../discounts/enums/discount-type.enum";
|
||||
import { InvoicesService } from "../../invoices/providers/invoices.service";
|
||||
import { UsersService } from "../../users/providers/users.service";
|
||||
import { PaginationUtils } from "../../utils/providers/pagination.utils";
|
||||
import { Wallet } from "../../wallets/entities/wallet.entity";
|
||||
import { WalletsService } from "../../wallets/providers/wallets.service";
|
||||
// import { Wallet } from "../../wallets/entities/wallet.entity";
|
||||
// import { WalletsService } from "../../wallets/providers/wallets.service";
|
||||
import { AddSubscriptionsToServiceDto } from "../DTO/create-subscription.dto";
|
||||
import { SearchUserSubsQueryDto } from "../DTO/search-user-subs-query.dto";
|
||||
import { ServiceSubsQueryDto } from "../DTO/service-subs-query.dto";
|
||||
@@ -30,7 +30,7 @@ export class SubscriptionsService {
|
||||
private readonly userSubscriptionsRepository: UserSubscriptionsRepository,
|
||||
private readonly invoicesService: InvoicesService,
|
||||
private readonly usersService: UsersService,
|
||||
private readonly walletsService: WalletsService,
|
||||
// private readonly walletsService: WalletsService,
|
||||
private readonly danakServices: DanakServicesService,
|
||||
private readonly dataSource: DataSource,
|
||||
) {}
|
||||
@@ -227,47 +227,18 @@ export class SubscriptionsService {
|
||||
|
||||
const startDate = dayjs().toDate();
|
||||
const endDate = dayjs().add(plan.duration, "day").toDate();
|
||||
// const startDate = new Date();
|
||||
// const endDate = new Date();
|
||||
// endDate.setDate(startDate.getDate() + plan.duration);
|
||||
|
||||
//
|
||||
const userSubscription = queryRunner.manager.create(UserSubscription, { ...subscribeDto, user, plan, startDate, endDate });
|
||||
|
||||
await queryRunner.manager.save(UserSubscription, userSubscription);
|
||||
|
||||
const userWallet = await this.walletsService.getWalletByUserId(user.id, queryRunner);
|
||||
|
||||
let finalPrice = new Decimal(plan.price);
|
||||
|
||||
const activeDiscounts =
|
||||
plan.discounts?.filter((discount) => discount.isActive && new Date() >= discount.startDate && new Date() <= discount.endDate) || [];
|
||||
|
||||
activeDiscounts.forEach((discount) => {
|
||||
if (discount.calculationType === DiscountCalculationType.PERCENTAGE) {
|
||||
finalPrice = finalPrice.sub(finalPrice.mul(discount.amount).div(100));
|
||||
} else if (discount.calculationType === DiscountCalculationType.FIXED) {
|
||||
finalPrice = finalPrice.sub(discount.amount);
|
||||
}
|
||||
});
|
||||
|
||||
plan.price = finalPrice;
|
||||
|
||||
if (new Decimal(userWallet.balance).lessThan(finalPrice)) throw new BadRequestException(WalletMessage.INSUFFICIENT_BALANCE);
|
||||
|
||||
// if (userWallet.balance < plan.price) throw new BadRequestException(WalletMessage.INSUFFICIENT_BALANCE);
|
||||
|
||||
//
|
||||
userWallet.balance = new Decimal(userWallet.balance).sub(finalPrice);
|
||||
|
||||
await queryRunner.manager.save(Wallet, userWallet);
|
||||
//
|
||||
|
||||
await this.walletsService.createSubscriptionTransaction(finalPrice, userWallet.id, queryRunner);
|
||||
//TODO: need queue handling for notification
|
||||
const invoiceDueDate = dayjs(userSubscription.endDate).subtract(3, "day").toDate();
|
||||
const invoiceDueDate = dayjs(userSubscription.startDate).add(5, "day").toDate();
|
||||
|
||||
const invoice = await this.invoicesService.createInvoiceForSubscription(userId, plan, invoiceDueDate, queryRunner);
|
||||
userSubscription.status = SubscriptionStatus.ACTIVE;
|
||||
const invoice = await this.invoicesService.createInvoiceForSubscription(userId, plan, userSubscription, invoiceDueDate, queryRunner);
|
||||
userSubscription.status = SubscriptionStatus.INACTIVE;
|
||||
|
||||
await queryRunner.manager.save(UserSubscription, userSubscription);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user