import { ApiProperty, ApiPropertyOptional, PickType } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { ArrayMinSize, IsArray, IsBoolean, IsDateString, IsEmail, IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, IsUUID, IsUrl, Length, Min, ValidateNested, } from "class-validator"; import { CreateCompanyProductDto } from "./create-company-product.dto"; import { CreateCompanyServiceDto } from "./create-company-service.dto"; import { CompanyMessage } from "../../../common/enums/message.enum"; import { CompleteRegistrationDto } from "../../auth/DTO/complete-register.dto"; import { CompanyRequestStatus } from "../enums/company-request-status.enum"; export class CreateCompanyDto extends PickType(CompleteRegistrationDto, ["phone", "firstName", "lastName", "password", "nationalCode"]) { @IsNotEmpty({ message: CompanyMessage.NAME_REQUIRED }) @Length(3, 255, { message: CompanyMessage.NAME_LENGTH }) @IsString({ message: CompanyMessage.NAME_MUST_BE_STRING }) @ApiProperty({ description: "نام شرکت", example: "شرکت تولیدی و صنعتی کارگر" }) name: string; @IsNotEmpty({ message: CompanyMessage.EMAIL_REQUIRED }) @IsEmail(undefined, { message: CompanyMessage.EMAIL_MUST_BE_VALID }) @ApiProperty({ description: "ایمیل", example: "info@example.com" }) email: string; @IsNotEmpty({ message: CompanyMessage.IDENTIFICATION_NUMBER_REQUIRED }) @IsString({ message: CompanyMessage.IDENTIFICATION_NUMBER_MUST_BE_STRING }) @ApiProperty({ description: "شماره ثبت", example: "1234567890" }) identificationNumber: string; @IsNotEmpty({ message: CompanyMessage.DATE_OF_ESTABLISHMENT_REQUIRED }) @IsDateString(undefined, { message: CompanyMessage.DATE_OF_ESTABLISHMENT_MUST_BE_DATE }) @ApiProperty({ description: "تاریخ تاسیس", example: "2021-01-01" }) dateOfEstablishment: string; @IsNotEmpty({ message: CompanyMessage.ADDRESS_REQUIRED }) @IsString({ message: CompanyMessage.ADDRESS_MUST_BE_STRING }) @ApiProperty({ description: "آدرس", example: "تهران، خیابان ولیعصر، پلاک 123" }) address: string; @IsNotEmpty({ message: CompanyMessage.MAP_ADDRESS_LINK_REQUIRED }) @IsUrl({ protocols: ["http", "https"] }, { message: CompanyMessage.MAP_ADDRESS_LINK_MUST_BE_URL }) @ApiProperty({ description: "لینک آدرس", example: "https://maps.app.goo.gl/1234567890" }) mapAddressLink: string; @IsNotEmpty({ message: CompanyMessage.DESCRIPTION_REQUIRED }) @IsString({ message: CompanyMessage.DESCRIPTION_MUST_BE_STRING }) @ApiProperty({ description: "توضیحات", example: "شرکت تولیدی و صنعتی کارگر" }) description: string; @IsNotEmpty({ message: CompanyMessage.WEBSITE_URL_REQUIRED }) @IsUrl({ protocols: ["http", "https"] }, { message: CompanyMessage.WEBSITE_URL_MUST_BE_URL }) @ApiProperty({ description: "آدرس وبسایت", example: "https://www.example.com" }) websiteUrl: string; @IsNotEmpty({ message: CompanyMessage.PROFILE_IMAGE_URL_REQUIRED }) @IsUrl({ protocols: ["http", "https"] }, { message: CompanyMessage.PROFILE_IMAGE_URL_MUST_BE_URL }) @ApiProperty({ description: "آدرس تصویر پروفایل", example: "https://www.example.com/profile.jpg" }) profileImageUrl: string; @IsNotEmpty({ message: CompanyMessage.COVER_IMAGE_URL_REQUIRED }) @IsUrl({ protocols: ["http", "https"] }, { message: CompanyMessage.COVER_IMAGE_URL_MUST_BE_URL }) @ApiProperty({ description: "آدرس تصویر کاور", example: "https://www.example.com/cover.jpg" }) coverImageUrl: string; @IsInt({ message: CompanyMessage.METRAGE_MUST_BE_INT }) @Min(1, { message: CompanyMessage.METRAGE_MUST_BE_POSITIVE }) @ApiProperty({ description: "متراژ شرکت (متر مربع)", example: 500 }) metrage: number; @IsOptional() @IsNotEmpty({ message: CompanyMessage.IS_ACTIVE_REQUIRED }) @IsBoolean({ message: CompanyMessage.IS_ACTIVE_MUST_BE_BOOLEAN }) @ApiProperty({ description: "وضعیت فعالیت", example: true }) isActive?: boolean; @IsBoolean() @ApiProperty({ description: "وضعیت اجاره", example: true }) isRented: boolean; @IsOptional() @IsDateString() @ApiPropertyOptional({ description: " تاریخ پایان قرارداد اجاره در صورتیکه اجاره ای است" }) rentEndAt?: string; @IsArray() @ApiProperty({ description: " یا سند تصاویر قرارداد اجاره" }) contractImages: string[]; @IsNotEmpty({ message: CompanyMessage.INDUSTRY_ID_REQUIRED }) @IsUUID("7", { message: CompanyMessage.INDUSTRY_ID_SHOULD_BE_UUID }) @ApiProperty({ description: "شناسه صنعت", example: "123e4567-e89b-12d3-a456-426614174000" }) industryId: string; @IsNotEmpty({ message: CompanyMessage.PRODUCTS_REQUIRED }) @IsArray({ message: CompanyMessage.PRODUCTS_MUST_BE_ARRAY }) @ArrayMinSize(1, { message: CompanyMessage.PRODUCTS_REQUIRED }) @ValidateNested({ each: true }) @Type(() => CreateCompanyProductDto) @ApiProperty({ description: "محصولات شرکت", type: [CreateCompanyProductDto], required: false }) products: CreateCompanyProductDto[]; @IsNotEmpty({ message: CompanyMessage.SERVICES_REQUIRED }) @IsArray({ message: CompanyMessage.SERVICES_MUST_BE_ARRAY }) @ArrayMinSize(1, { message: CompanyMessage.SERVICES_REQUIRED }) @ValidateNested({ each: true }) @Type(() => CreateCompanyServiceDto) @ApiProperty({ description: "خدمات شرکت", type: [CreateCompanyServiceDto], required: false }) services: CreateCompanyServiceDto[]; } export class CreateCompanyRequestDto extends PickType(CreateCompanyDto, [ "name", "email", "phone", "identificationNumber", "dateOfEstablishment", "address", "mapAddressLink", "description", "websiteUrl", "profileImageUrl", "coverImageUrl", "metrage", "industryId", "products", "services", "metrage", "isRented", "contractImages", "rentEndAt" ]) { @IsNotEmpty({ message: CompanyMessage.CHIEF_EXECUTIVE_REQUIRED }) @IsString({ message: CompanyMessage.CHIEF_EXECUTIVE_MUST_BE_STRING }) @Length(3, 255, { message: CompanyMessage.CHIEF_EXECUTIVE_MUST_BE_STRING }) @ApiProperty({ description: "نام مدیر عامل", example: "محمد حسین حسینی" }) chiefExecutiveOfficer: string; } export class ChangeCompanyRequestStatusDto { @IsNotEmpty({ message: CompanyMessage.COMPANY_REQUEST_STATUS_REQUIRED }) @IsEnum(CompanyRequestStatus) @ApiProperty({ enum: CompanyRequestStatus, description: "وضعیت درخواست" }) requestStatus: CompanyRequestStatus; @IsOptional() @IsString({ message: CompanyMessage.REJECT_REASON_MUST_BE_STRING }) @ApiProperty({ required: false, description: "دلیل رد درخواست" }) rejectReason?: string; } //-----------------------------------