From 42d78e15ff72d904121358c0d2348d4dcfbd8c3b Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Tue, 17 Feb 2026 09:19:11 +0330 Subject: [PATCH] fix: companies --- src/app.module.ts | 2 +- src/configs/swagger.config.ts | 7 ++- src/modules/bills/bills.controller.ts | 11 +---- src/modules/bills/bills.module.ts | 6 +-- src/modules/bills/bills.service.ts | 45 +++++++++---------- .../bills/dto/create-charge-bill.dto.ts | 13 +++--- .../bills/dto/create-water-bill.dto.ts | 41 ++++++++--------- src/modules/bills/dto/update-bill.dto.ts | 4 +- src/modules/bills/entities/bill.entity.ts | 15 +++---- src/modules/companies/companies.controller.ts | 7 +++ .../companies/services/companies.service.ts | 8 +++- 11 files changed, 79 insertions(+), 80 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 47606ea..839a053 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -16,7 +16,7 @@ import { rateLimitConfig } from "./configs/rateLimit.config"; import { HTTPLogger } from "./core/middlewares/logger.middleware"; import { AnnouncementsModule } from "./modules/announcements/announcement.module"; import { AuthModule } from "./modules/auth/auth.module"; -import { BillsModule } from './modules/bills/bills.module'; +import { BillsModule } from "./modules/bills/bills.module"; import { BusinessesModule } from "./modules/businesses/businesses.module"; import { ChatbotModule } from "./modules/chatbot/chatbot.module"; import { CompaniesModule } from "./modules/companies/companies.module"; diff --git a/src/configs/swagger.config.ts b/src/configs/swagger.config.ts index 1b123bf..409a99a 100755 --- a/src/configs/swagger.config.ts +++ b/src/configs/swagger.config.ts @@ -20,5 +20,10 @@ export function getSwaggerDocument(app: NestFastifyApplication) { .build(); const swaggerDocument = SwaggerModule.createDocument(app, swaggerConfig); - SwaggerModule.setup("api-docs", app, swaggerDocument); + SwaggerModule.setup("api-docs", app, swaggerDocument, { + swaggerOptions: { + docExpansion: "none", + defaultModelsExpandDepth: -1, + }, + }); } diff --git a/src/modules/bills/bills.controller.ts b/src/modules/bills/bills.controller.ts index dd6c267..8c940e5 100644 --- a/src/modules/bills/bills.controller.ts +++ b/src/modules/bills/bills.controller.ts @@ -1,13 +1,4 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - Post, - Query, - UseInterceptors, -} from "@nestjs/common"; +import { Body, Controller, Delete, Get, Param, Post, Query, UseInterceptors } from "@nestjs/common"; import { ApiOperation } from "@nestjs/swagger"; import { BillsService } from "./bills.service"; diff --git a/src/modules/bills/bills.module.ts b/src/modules/bills/bills.module.ts index 8d0ef06..50d10b0 100644 --- a/src/modules/bills/bills.module.ts +++ b/src/modules/bills/bills.module.ts @@ -8,11 +8,7 @@ import { BusinessesModule } from "../businesses/businesses.module"; import { CompaniesModule } from "../companies/companies.module"; @Module({ - imports: [ - MikroOrmModule.forFeature([Bill]), - CompaniesModule, - BusinessesModule, - ], + imports: [MikroOrmModule.forFeature([Bill]), CompaniesModule, BusinessesModule], controllers: [BillsController], providers: [BillsService], }) diff --git a/src/modules/bills/bills.service.ts b/src/modules/bills/bills.service.ts index 2757af3..7224900 100644 --- a/src/modules/bills/bills.service.ts +++ b/src/modules/bills/bills.service.ts @@ -1,20 +1,20 @@ -import { EntityManager } from '@mikro-orm/postgresql'; -import { BadRequestException, Injectable } from '@nestjs/common'; -import dayjs from 'dayjs'; -import Decimal from 'decimal.js'; +import { EntityManager } from "@mikro-orm/postgresql"; +import { BadRequestException, Injectable } from "@nestjs/common"; +import dayjs from "dayjs"; +import Decimal from "decimal.js"; -import { BillListQueryDto } from './dto/bill-list-query.dto'; -import { CreateChargeBillDto } from './dto/create-charge-bill.dto'; -import { CreateWaterBillDto } from './dto/create-water-bill.dto'; -import { Bill } from './entities/bill.entity'; -import { BillType } from './enums/bill-type.enum'; -import { BillsRepository } from './repositories/bill.repository'; -import { CompanyMessage } from '../../common/enums/message.enum'; -import { Business } from '../businesses/entities/business.entity'; -import { Company } from '../companies/entities/company.entity'; -import { CompaniesService } from '../companies/services/companies.service'; -import { InvoiceItem } from '../invoices/entities/invoice-item.entity'; -import { Invoice } from '../invoices/entities/invoice.entity'; +import { BillListQueryDto } from "./dto/bill-list-query.dto"; +import { CreateChargeBillDto } from "./dto/create-charge-bill.dto"; +import { CreateWaterBillDto } from "./dto/create-water-bill.dto"; +import { Bill } from "./entities/bill.entity"; +import { BillType } from "./enums/bill-type.enum"; +import { BillsRepository } from "./repositories/bill.repository"; +import { CompanyMessage } from "../../common/enums/message.enum"; +import { Business } from "../businesses/entities/business.entity"; +import { Company } from "../companies/entities/company.entity"; +import { CompaniesService } from "../companies/services/companies.service"; +import { InvoiceItem } from "../invoices/entities/invoice-item.entity"; +import { Invoice } from "../invoices/entities/invoice.entity"; @Injectable() export class BillsService { @@ -33,7 +33,7 @@ export class BillsService { const bill = em.create(Bill, { type: BillType.WATER_BILL, business }); em.persist(bill); - const dueDate = dayjs().add(dueDays, 'day').toDate(); + const dueDate = dayjs().add(dueDays, "day").toDate(); const uniqueCompanyIds = [...new Set(values.map((v) => v.companyId))]; const companies = await this.companiesService.findByIds(uniqueCompanyIds, em); @@ -59,7 +59,7 @@ export class BillsService { }); const invoiceItem = em.create(InvoiceItem, { - name: 'قبض آب', + name: "قبض آب", count: value.waterUsage, unitPrice: new Decimal(waterRate), discount: new Decimal(0), @@ -90,7 +90,7 @@ export class BillsService { const bill = em.create(Bill, { type: BillType.MONTHLY_CHARGE, business }); em.persist(bill); - const dueDate = dayjs().add(dueDays, 'day').toDate(); + const dueDate = dayjs().add(dueDays, "day").toDate(); const companies = await this.companiesService.findAllBybusinessId(business.id, em); @@ -110,7 +110,7 @@ export class BillsService { }); const invoiceItem = em.create(InvoiceItem, { - name: 'قبض شارژ', + name: "قبض شارژ", count: 1, unitPrice: subtotal, discount: new Decimal(0), @@ -142,10 +142,7 @@ export class BillsService { } async findOne(id: string, businessId: string) { - const bill = await this.billRepository.findOne( - { id, business: { id: businessId } }, - { populate: ["invoices"] }, - ); + const bill = await this.billRepository.findOne({ id, business: { id: businessId } }, { populate: ["invoices"] }); if (!bill) { throw new BadRequestException("Bill not found"); } diff --git a/src/modules/bills/dto/create-charge-bill.dto.ts b/src/modules/bills/dto/create-charge-bill.dto.ts index f3b9579..31a656a 100644 --- a/src/modules/bills/dto/create-charge-bill.dto.ts +++ b/src/modules/bills/dto/create-charge-bill.dto.ts @@ -2,12 +2,11 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsInt } from "class-validator"; export class CreateChargeBillDto { - @ApiProperty() - @IsInt() - chargeRate: number; - - @ApiProperty() - @IsInt() - dueDays:number; + @ApiProperty() + @IsInt() + chargeRate: number; + @ApiProperty() + @IsInt() + dueDays: number; } diff --git a/src/modules/bills/dto/create-water-bill.dto.ts b/src/modules/bills/dto/create-water-bill.dto.ts index 5c12ef0..194a99a 100644 --- a/src/modules/bills/dto/create-water-bill.dto.ts +++ b/src/modules/bills/dto/create-water-bill.dto.ts @@ -3,30 +3,31 @@ import { Type } from "class-transformer"; import { ArrayMinSize, IsArray, IsInt, IsNotEmpty, IsUUID, ValidateNested } from "class-validator"; export class ValueDto { - @IsNotEmpty({ message: ' BillMessage.COMPANY_ID_REQUIRED' }) - @ApiProperty({ description: "شناسه شرکت", }) - @IsUUID("7") - companyId: string; + @IsNotEmpty({ message: " BillMessage.COMPANY_ID_REQUIRED" }) + @ApiProperty({ description: "شناسه شرکت" }) + @IsUUID("7") + companyId: string; - @ApiProperty() - @IsNotEmpty({ message: 'BillMessage.WATER_USAGE_REQUIRED' }) - @IsInt() - @ApiProperty({ description: "مصرف آب", example: 100 }) - waterUsage: number; + @ApiProperty() + @IsNotEmpty({ message: "BillMessage.WATER_USAGE_REQUIRED" }) + @IsInt() + @ApiProperty({ description: "مصرف آب", example: 100 }) + waterUsage: number; } export class CreateWaterBillDto { - @ApiProperty() - @IsInt() - waterRate:number; + @ApiProperty() + @IsInt() + waterRate: number; - @ApiProperty() - @IsInt() - dueDays:number; + @ApiProperty() + @IsInt() + dueDays: number; - @Type(() => ValueDto) - @IsArray() - @ArrayMinSize(1) - @ValidateNested({ each: true }) - values: ValueDto[]; + @ApiProperty({ example: [{ companyId: "", waterUsage: 100 }] }) + @Type(() => ValueDto) + @IsArray() + @ArrayMinSize(1) + @ValidateNested({ each: true }) + values: ValueDto[]; } diff --git a/src/modules/bills/dto/update-bill.dto.ts b/src/modules/bills/dto/update-bill.dto.ts index ebab0c7..496730d 100644 --- a/src/modules/bills/dto/update-bill.dto.ts +++ b/src/modules/bills/dto/update-bill.dto.ts @@ -1,5 +1,5 @@ -import { PartialType } from '@nestjs/swagger'; +import { PartialType } from "@nestjs/swagger"; -import { CreateWaterBillDto } from './create-water-bill.dto'; +import { CreateWaterBillDto } from "./create-water-bill.dto"; export class UpdateBillDto extends PartialType(CreateWaterBillDto) {} diff --git a/src/modules/bills/entities/bill.entity.ts b/src/modules/bills/entities/bill.entity.ts index abcd629..fa97c70 100644 --- a/src/modules/bills/entities/bill.entity.ts +++ b/src/modules/bills/entities/bill.entity.ts @@ -8,15 +8,14 @@ import { BillsRepository } from "../repositories/bill.repository"; @Entity({ repository: () => BillsRepository }) export class Bill extends BaseEntity { + @Enum({ items: () => BillType }) + type: BillType; - @Enum({ items: () => BillType }) - type: BillType; + @ManyToOne(() => Business, { nullable: false, deleteRule: "cascade" }) + business!: Business; - @ManyToOne(() => Business, { nullable: false, deleteRule: "cascade" }) - business!: Business; + @OneToMany(() => Invoice, (invoice) => invoice.bill, { cascade: [Cascade.PERSIST, Cascade.REMOVE], orphanRemoval: true }) + invoices = new Collection(this); - @OneToMany(() => Invoice, (invoice) => invoice.bill, { cascade: [Cascade.PERSIST, Cascade.REMOVE], orphanRemoval: true }) - invoices = new Collection(this); - - [EntityRepositoryType]?: BillsRepository; + [EntityRepositoryType]?: BillsRepository; } diff --git a/src/modules/companies/companies.controller.ts b/src/modules/companies/companies.controller.ts index 3978f64..af89c48 100644 --- a/src/modules/companies/companies.controller.ts +++ b/src/modules/companies/companies.controller.ts @@ -47,6 +47,13 @@ export class CompaniesController { return this.companiesService.getCompaniesList(query, businessId); } + @Get("list/all") + @AuthGuards() + @ApiOperation({ summary: "get companies list without pagination (admin)" }) + getAllCompanies(@BusinessDec("id") businessId: string) { + return this.companiesService.findAllBybusinessId2(businessId); + } + @Get("list/public") @ApiOperation({ summary: "get companies list (public)" }) getCompaniesListPublic(@Query() queryDto: CompanyListPublicQueryDto, @BusinessDec("id") businessId: string) { diff --git a/src/modules/companies/services/companies.service.ts b/src/modules/companies/services/companies.service.ts index 14d6665..52efbb2 100644 --- a/src/modules/companies/services/companies.service.ts +++ b/src/modules/companies/services/companies.service.ts @@ -29,7 +29,7 @@ export class CompaniesService { private readonly passwordService: PasswordService, private readonly em: EntityManager, private readonly companyRequestRepository: CompanyRequestRepository, - ) { } + ) {} async create(createDto: CreateCompanyDto, business: Business) { const em = this.em.fork(); @@ -461,7 +461,7 @@ export class CompaniesService { async findByIds(comapnyIds: string[], em: EntityManager) { const companies = await em.find(Company, { - id: { $in: comapnyIds } + id: { $in: comapnyIds }, }); if (companies.length !== comapnyIds.length) throw new BadRequestException(CompanyMessage.COMPANY_NOT_FOUND); return companies; @@ -471,4 +471,8 @@ export class CompaniesService { const companies = await em.find(Company, { business: { id: businessId } }); return companies; } + async findAllBybusinessId2(businessId: string) { + const companies = await this.em.find(Company, { business: { id: businessId } }); + return companies; + } }