feat: add response DTOs for various services across modules

- Created response DTOs for ConfigService, AppService, AuthService, CatalogsService, AccountsService, BusinessActivityComplexesService, ComplexPosesService, SalesInvoicesService, BusinessActivitiesService, ConsumerBusinessActivityGoodsService, and others.
- Implemented Create, FindAll, FindOne, and Update response types for services in consumer, partners, and POS modules.
- Added request DTOs for creating and updating goods in the consumer business activities module.
- Introduced filtering DTO for partner licenses.
- Enhanced response mapping for partner license activations.
This commit is contained in:
2026-04-27 10:45:39 +03:30
parent 34793295c9
commit dee96b6e91
208 changed files with 8058 additions and 2349 deletions
@@ -1,13 +1,19 @@
import { QUERY_CONSTANTS } from '@/common/queryConstants'
import mapConsumerWithLicenseUtil from '@/common/utils/mappers/consumer_mappers.util'
import { PasswordUtil } from '@/common/utils/password.util'
import {
AccountStatus,
AccountType,
ConsumerRole,
ConsumerStatus,
ConsumerType,
PartnerStatus,
} from '@/generated/prisma/enums'
import { ConsumerSelect, ConsumerWhereInput } from '@/generated/prisma/models'
import mapConsumerWithLicenseUtil from '@/modules/consumer/utils/mapConsumerWithLicense.util'
import {
ConsumerCreateInput,
ConsumerSelect,
ConsumerWhereInput,
} from '@/generated/prisma/models'
import { PrismaService } from '@/prisma/prisma.service'
import { BadRequestException, Injectable } from '@nestjs/common'
import { ResponseMapper } from 'common/response/response-mapper'
@@ -25,16 +31,24 @@ export class PartnerConsumersService {
defaultSelect: ConsumerSelect = {
id: true,
first_name: true,
last_name: true,
mobile_number: true,
national_code: true,
...QUERY_CONSTANTS.CONSUMER.infoSelect,
status: true,
created_at: true,
}
private defaultWhere = (partner_id: string): ConsumerWhereInput => ({
partner_id,
OR: [
{
legal: {
partner_id,
},
},
{
individual: {
partner_id,
},
},
],
})
async findAll(partner_id: string, page = 1, perPage = 10) {
@@ -105,48 +119,102 @@ export class PartnerConsumersService {
throw new BadRequestException(`تعداد لایسنس‌های فعلی شما به پایان رسیده است.`)
}
const { username, password, license_starts_at, ...rest } = data
const { username, password, customer, ...rest } = data
const { individual, legal } = customer
const existingConsumer = await tx.consumer.findFirst({
where: {
partner_id,
OR: [
{ mobile_number: data.mobile_number },
{ national_code: data.national_code },
],
},
select: { id: true, first_name: true, last_name: true },
})
if (existingConsumer) {
throw new BadRequestException(
`مصرف کننده‌ی ${existingConsumer.first_name} ${existingConsumer.last_name} با شماره موبایل یا کد ملی وارد شده از قبل ثبت شده است.`,
)
}
return await tx.consumer.create({
data: {
...rest,
partner: {
connect: {
id: partner_id,
},
},
consumer_accounts: {
create: {
role: ConsumerRole.OWNER,
account: {
create: {
username,
password: await PasswordUtil.hash(password),
type: AccountType.CONSUMER,
status: AccountStatus.ACTIVE,
},
const createConsumerData: ConsumerCreateInput = {
...rest,
accounts: {
create: {
role: ConsumerRole.OWNER,
account: {
create: {
username,
password: await PasswordUtil.hash(password),
type: AccountType.CONSUMER,
status: AccountStatus.ACTIVE,
},
},
},
status: ConsumerStatus.ACTIVE,
},
status: ConsumerStatus.ACTIVE,
}
const partner = {
partner: { connect: { id: partner_id } },
}
if (!legal && !individual) {
throw new BadRequestException(
`برای ایجاد مصرف کننده باید یکی از اطلاعات فردی یا حقوقی وارد شود.`,
)
}
if (data.type === ConsumerType.INDIVIDUAL && !individual) {
throw new BadRequestException(
`برای ایجاد مصرف کننده با نوع حقیقی باید اطلاعات فردی وارد شود.`,
)
}
if (data.type === ConsumerType.LEGAL && !legal) {
throw new BadRequestException(
`برای ایجاد مصرف کننده با نوع حقوقی باید اطلاعات حقوقی وارد شود.`,
)
}
let consumerExistError = ''
if (legal) {
const existingConsumer = await tx.consumer.findFirst({
where: {
legal: { registration_code: legal.registration_code, partner_id },
},
select: {
id: true,
legal: {
select: {
name: true,
},
},
},
})
createConsumerData.legal = {
create: {
...legal,
...partner,
},
}
if (existingConsumer) {
consumerExistError = `مشتری با نام ${existingConsumer.legal!.name} با این شماره ثبت، از قبل توسط شما ایجاد شده است.`
}
} else if (individual) {
const existingConsumer = await tx.consumer.findFirst({
where: {
individual: { national_code: individual.national_code, partner_id },
},
select: {
id: true,
individual: {
select: {
first_name: true,
last_name: true,
},
},
},
})
createConsumerData.individual = {
create: {
...individual,
...partner,
},
}
if (existingConsumer) {
;`مشتری با نام ${existingConsumer.individual!.first_name} ${existingConsumer.individual!.last_name} یا این کد ملی، از قبل توسط شما ایجاد شده است.`
}
}
return await tx.consumer.create({
data: createConsumerData,
select: this.defaultSelect,
})
})