diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index b218fb0..47ce18a 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -122,6 +122,7 @@ export const enum CommonMessage { SEARCH_QUERY_STRING = "رشته جستجو باید یک رشته باشد", UPDATED = "با موفقیت آپدیت شد", IS_ACTIVE_SHOULD_BE_1_0 = "وضعیت باید یکی از مقادیر ۰ و ۱ باشد", + PAGINATE_SHOULD_BE_1_0 = "PAGINATE_SHOULD_BE_1_0", } export const enum CategoryMessage { @@ -525,6 +526,8 @@ export const enum InvoiceMessage { DISCOUNT_MUST_BE_BETWEEN_0_AND_100 = "تخفیف باید بین ۰ تا ۱۰۰ باشد", TOTAL_PRICE_MUST_BE_POSITIVE = "قیمت کل باید مثبت باشد", DISCOUNT_NOT_FOR_THIS_USER = "این تخفیف برای شما معتبر نیست", + DISCOUNT_IS_NOT_ACTIVE = "تخفیف فعال نیست", + DISCOUNT_NOT_STARTED = "تخفیف هنوز شروع نشده است", } export const enum LearningMessage { diff --git a/src/modules/invoices/providers/invoices.service.ts b/src/modules/invoices/providers/invoices.service.ts index cb92666..5e6a93f 100755 --- a/src/modules/invoices/providers/invoices.service.ts +++ b/src/modules/invoices/providers/invoices.service.ts @@ -693,12 +693,17 @@ export class InvoicesService { relations: { user: true }, }); - if (discount?.user?.id && discount?.user?.id !== userId) throw new BadRequestException(InvoiceMessage.DISCOUNT_NOT_FOR_THIS_USER); - if (!discount) throw new BadRequestException(InvoiceMessage.INVALID_DISCOUNT_CODE); + if (discount?.user?.id && discount?.user?.id !== userId) throw new BadRequestException(InvoiceMessage.DISCOUNT_NOT_FOR_THIS_USER); + + if (discount?.isActive) throw new BadRequestException(InvoiceMessage.DISCOUNT_IS_NOT_ACTIVE); + if (discount.endDate && dayjs(discount.endDate).isBefore(dayjs())) throw new BadRequestException(InvoiceMessage.DISCOUNT_EXPIRED); + if (discount.startDate && dayjs(discount.startDate).isAfter(dayjs())) + throw new BadRequestException(InvoiceMessage.DISCOUNT_NOT_STARTED); + if (!invoice.originalPrice) invoice.originalPrice = new Decimal(invoice.totalPrice); let discountAmount: Decimal; diff --git a/src/modules/tickets/entities/ticket-message.entity.ts b/src/modules/tickets/entities/ticket-message.entity.ts index a668ff3..bf5c667 100755 --- a/src/modules/tickets/entities/ticket-message.entity.ts +++ b/src/modules/tickets/entities/ticket-message.entity.ts @@ -17,7 +17,7 @@ export class TicketMessage extends BaseEntity { @ManyToOne(() => Ticket, (ticket) => ticket.messages, { onDelete: "CASCADE", nullable: false }) ticket: Ticket; - @ManyToOne(() => User, (user) => user.ticketMessage, { onDelete: "SET NULL", nullable: true }) + @ManyToOne(() => User, (user) => user.ticketMessage, { onDelete: "CASCADE", nullable: false }) @JoinColumn() author: User; } diff --git a/src/modules/users/DTO/search-customers.dto.ts b/src/modules/users/DTO/search-customers.dto.ts index 1bef363..fe1baef 100755 --- a/src/modules/users/DTO/search-customers.dto.ts +++ b/src/modules/users/DTO/search-customers.dto.ts @@ -1,12 +1,19 @@ import { ApiPropertyOptional } from "@nestjs/swagger"; -import { IsOptional, IsString } from "class-validator"; +import { Type } from "class-transformer"; +import { IsIn, IsOptional, IsString } from "class-validator"; import { PaginationDto } from "../../../common/DTO/pagination.dto"; -import { FinancialMessage } from "../../../common/enums/message.enum"; +import { CommonMessage, FinancialMessage } from "../../../common/enums/message.enum"; export class SearchCustomersDto extends PaginationDto { @IsOptional() @IsString({ message: FinancialMessage.SEARCH_QUERY_MUST_BE_A_STRING }) @ApiPropertyOptional({ description: "search query", example: "search query" }) q?: string; + + @IsOptional() + @Type(() => Number) + @IsIn([1, 0], { message: CommonMessage.PAGINATE_SHOULD_BE_1_0 }) + @ApiPropertyOptional({ description: "paginate status", example: 1 }) + paginate?: number; } diff --git a/src/modules/users/providers/customers.service.ts b/src/modules/users/providers/customers.service.ts index 08ec6f7..3c2e33d 100755 --- a/src/modules/users/providers/customers.service.ts +++ b/src/modules/users/providers/customers.service.ts @@ -374,9 +374,14 @@ export class CustomersService { /************************************************************ */ async getCustomers(queryDto: SearchCustomersDto) { - const [customers, count] = await this.userRepository.getCustomer(queryDto); + if (queryDto.paginate !== undefined && queryDto.paginate === 0) { + const customers = await this.userRepository.getCustomersWithoutPagination(queryDto); + return { customers }; + } else { + const [customers, count] = await this.userRepository.getCustomer(queryDto); - return { customers, count }; + return { customers, count }; + } } /************************************************************ */ diff --git a/src/modules/users/repositories/users.repository.ts b/src/modules/users/repositories/users.repository.ts index 1583e57..39409a6 100755 --- a/src/modules/users/repositories/users.repository.ts +++ b/src/modules/users/repositories/users.repository.ts @@ -85,6 +85,51 @@ export class UserRepository extends Repository { //************* */ + async getCustomersWithoutPagination(queryDto: SearchCustomersDto) { + const queryBuilder = this.createQueryBuilder("user") + .leftJoin("user.roles", "role") + .where("role.name = :roleName", { roleName: RoleEnum.USER }) + .leftJoin("user.legalUser", "legalUser") + .addSelect([ + "legalUser.id", + "legalUser.registrationName", + "legalUser.nationalIdentity", + "legalUser.economicCode", + "legalUser.registrationCode", + ]) + .leftJoinAndSelect("legalUser.address", "address") + .leftJoinAndSelect("address.city", "city") + .leftJoinAndSelect("city.province", "province") + .leftJoin("user.realUser", "realUser") + .addSelect([ + "realUser.id", + "realUser.firstName", + "realUser.lastName", + "realUser.phone", + "realUser.gender", + "realUser.nationalCode", + "realUser.birthDate", + "realUser.nationality", + ]) + .leftJoinAndSelect("realUser.address", "realAddress") + .leftJoinAndSelect("realAddress.city", "realCity") + .leftJoinAndSelect("realCity.province", "realProvince") + .loadRelationCountAndMap("user.invoicesCount", "user.invoices") + .loadRelationCountAndMap("user.subscriptionsCount", "user.subscriptions") + .loadRelationCountAndMap("user.ticketsCount", "user.tickets"); + + if (queryDto.q) { + queryBuilder + .orWhere("user.firstName ILIKE :search", { search: `%${queryDto.q}%` }) + .orWhere("user.lastName ILIKE :search", { search: `%${queryDto.q}%` }) + .orWhere("user.userName ILIKE :search", { search: `%${queryDto.q}%` }); + } + + return queryBuilder.getMany(); + } + + //======== + async getCustomer(queryDto: SearchCustomersDto) { const { limit, skip } = PaginationUtils(queryDto);