diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 56b18b8..0deabab 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -561,15 +561,15 @@ model PQQAnswers { } model AgeRestrictions { - id Int @id @default(autoincrement()) - ageRestrictionName String @unique @map("age_restriction_name") @db.VarChar(30) - minAge Int @map("min_age") - maxAge Int @map("max_age") - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") - ActivityEligibility ActivityEligibility[] + id Int @id @default(autoincrement()) + ageRestrictionName String @unique @map("age_restriction_name") @db.VarChar(30) + minAge Int @map("min_age") + maxAge Int @map("max_age") + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + // ActivityEligibility ActivityEligibility[] @@map("age_restrictions") @@schema("mst") @@ -985,24 +985,24 @@ model ActivitiesMedia { } model ActivityVenues { - id Int @id @default(autoincrement()) - activityXid Int @map("activity_xid") - activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) - venueName String @map("venue_name") @db.VarChar(50) - venueCapacity Int @map("venue_capacity") - availableSeats Int @map("available_seats") - isMinPeopleReqMandatory Boolean @default(false) @map("is_min_people_req_mandatory") - minPeopleRequired Int? @map("min_people_required") - minReqfullfilledBeforeMins Int? @map("min_req_fullfilled_before_mins") - venueDescription String? @map("venue_description") @db.VarChar(200) - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") + id Int @id @default(autoincrement()) + activityXid Int @map("activity_xid") + activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) + venueName String @map("venue_name") @db.VarChar(50) + venueCapacity Int @map("venue_capacity") + availableSeats Int @map("available_seats") + isMinPeopleReqMandatory Boolean @default(false) @map("is_min_people_req_mandatory") + minPeopleRequired Int? @map("min_people_required") + minReqfullfilledBeforeMins Int? @map("min_req_fullfilled_before_mins") + venueDescription String? @map("venue_description") @db.VarChar(200) + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") ScheduleHeader ScheduleHeader[] ItineraryActivities ItineraryActivities[] - ActivityPrices ActivityPrices[] // <-- Added opposite relation - ActivityVenueArtifacts ActivityVenueArtifacts[] // <-- Added opposite relation + ActivityPrices ActivityPrices[] // <-- Added opposite relation + ActivityVenueArtifacts ActivityVenueArtifacts[] // <-- Added opposite relation @@map("activity_venues") @@schema("act") @@ -1042,28 +1042,35 @@ model ActivityTrainerTaxes { } model ActivityEligibility { - id Int @id @default(autoincrement()) - activityXid Int @map("activity_xid") - activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) - isAgeRestriction Boolean @default(false) @map("is_age_restriction") - ageRestrictionXid Int? @map("age_restriction_xid") - ageRestriction AgeRestrictions? @relation(fields: [ageRestrictionXid], references: [id], onDelete: Restrict) - isWeightRestriction Boolean @default(false) @map("is_weight_restriction") - weightRestrictionName String? @map("weight_restriction_name") @db.VarChar(30) - weightEntered Int? @map("weight_entered") - weightIn String? @map("weight_in") @db.VarChar(30) - minWeight Int? @map("min_weight") - maxWeight Int? @map("max_weight") - isHeightRestriction Boolean @default(false) @map("is_height_restriction") - heightRestrictionName String? @map("height_restriction_name") @db.VarChar(30) - heightEntered Int? @map("height_entered") - heightIn String? @map("height_in") @db.VarChar(30) - minHeight Int? @map("min_height") - maxHeight Int? @map("max_height") - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") + id Int @id @default(autoincrement()) + activityXid Int @map("activity_xid") + activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) + isAgeRestriction Boolean @default(false) @map("is_age_restriction") + // ageRestrictionXid Int? @map("age_restriction_xid") + // ageRestriction AgeRestrictions? @relation(fields: [ageRestrictionXid], references: [id], onDelete: Restrict) + ageRestrictionName String? @map("age_restriction_name") @db.VarChar(30) + ageEntered Int? @map("age_entered") + ageIn String? @map("age_in") @db.VarChar(30) + minAge Int? @map("min_age") + maxAge Int? @map("max_age") + isWeightRestriction Boolean @default(false) @map("is_weight_restriction") + weightRestrictionName String? @map("weight_restriction_name") @db.VarChar(30) + weightEntered Int? @map("weight_entered") + weightIn String? @map("weight_in") @db.VarChar(30) + minWeight Int? @map("min_weight") + maxWeight Int? @map("max_weight") + isHeightRestriction Boolean @default(false) @map("is_height_restriction") + heightRestrictionName String? @map("height_restriction_name") @db.VarChar(30) + heightEntered Int? @map("height_entered") + heightIn String? @map("height_in") @db.VarChar(30) + minHeight Int? @map("min_height") + maxHeight Int? @map("max_height") + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + // ageRestrictions AgeRestrictions? @relation(fields: [ageRestrictionsId], references: [id]) + // ageRestrictionsId Int? @@map("activity_eligibility") @@schema("act") @@ -1106,7 +1113,7 @@ model ActivityAmDetails { model ActivityPrices { id Int @id @default(autoincrement()) activityVenueXid Int @map("activity_venue_xid") - activityVenue ActivityVenues @relation(fields: [activityVenueXid], references: [id], onDelete: Cascade) + activityVenue ActivityVenues @relation(fields: [activityVenueXid], references: [id], onDelete: Cascade) noOfSession Int @map("no_of_session") isPackage Boolean @default(false) @map("is_package") sessionValidity Int @map("session_validity") @@ -1141,15 +1148,15 @@ model ActivityPriceTaxes { } model ActivityVenueArtifacts { - id Int @id @default(autoincrement()) - activityVenueXid Int @map("activity_venue_xid") + id Int @id @default(autoincrement()) + activityVenueXid Int @map("activity_venue_xid") activityVenue ActivityVenues @relation(fields: [activityVenueXid], references: [id], onDelete: Cascade) - mediaType String @map("media_type") @db.VarChar(30) - mediaFileName String @map("media_file_name") @db.VarChar(400) - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") + mediaType String @map("media_type") @db.VarChar(30) + mediaFileName String @map("media_file_name") @db.VarChar(400) + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") @@map("activity_venue_artifacts") @@schema("act") @@ -1290,35 +1297,35 @@ model ActivityFoodTaxes { } model ActivityEquipments { - id Int @id @default(autoincrement()) - activityXid Int @map("activity_xid") - activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) - equipmentName String @map("equipment_name") @db.VarChar(30) - isEquipmentChargeable Boolean @default(false) @map("is_equipment_chargeable") - equipmentBasePrice Int @map("equipment_base_price") - equipmentTotalPrice Int @map("equipment_total_price") - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") - ActivityEquipmentTaxes ActivityEquipmentTaxes[] + id Int @id @default(autoincrement()) + activityXid Int @map("activity_xid") + activity Activities @relation(fields: [activityXid], references: [id], onDelete: Cascade) + equipmentName String @map("equipment_name") @db.VarChar(30) + isEquipmentChargeable Boolean @default(false) @map("is_equipment_chargeable") + equipmentBasePrice Int @map("equipment_base_price") + equipmentTotalPrice Int @map("equipment_total_price") + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + ActivityEquipmentTaxes ActivityEquipmentTaxes[] @@map("activity_equipments") @@schema("act") } model ActivityEquipmentTaxes { - id Int @id @default(autoincrement()) - activityEquipmentXid Int @map("activity_equipment_xid") + id Int @id @default(autoincrement()) + activityEquipmentXid Int @map("activity_equipment_xid") activityEquipment ActivityEquipments @relation(fields: [activityEquipmentXid], references: [id], onDelete: Cascade) - taxXid Int @map("tax_xid") - taxes Taxes @relation(fields: [taxXid], references: [id], onDelete: Restrict) - taxPer Float @map("tax_per") - taxAmount Int @map("tax_amount") - isActive Boolean @default(true) @map("is_active") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - deletedAt DateTime? @map("deleted_at") + taxXid Int @map("tax_xid") + taxes Taxes @relation(fields: [taxXid], references: [id], onDelete: Restrict) + taxPer Float @map("tax_per") + taxAmount Int @map("tax_amount") + isActive Boolean @default(true) @map("is_active") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") @@map("activity_equipment_taxes") @@schema("act") diff --git a/src/common/utils/constants/common.constant.ts b/src/common/utils/constants/common.constant.ts index eec3934..024aa19 100644 --- a/src/common/utils/constants/common.constant.ts +++ b/src/common/utils/constants/common.constant.ts @@ -21,4 +21,9 @@ export const USER_STATUS = { ACTIVE: "Active", DE_ACTIVATED: "De-activated", REJECTED: "Rejected" +} + +export const RESTRICTION_NAME = { + ABOVE: "Above", + BELOW: "Below", } \ No newline at end of file diff --git a/src/modules/host/dto/createActivity.schema.ts b/src/modules/host/dto/createActivity.schema.ts index 0c27507..7a8b416 100644 --- a/src/modules/host/dto/createActivity.schema.ts +++ b/src/modules/host/dto/createActivity.schema.ts @@ -62,7 +62,11 @@ export const EquipmentDto = z.object({ /* ================= ELIGIBILITY ================= */ export const EligibilityDto = z.object({ isAgeRestriction: z.boolean().optional().default(false), - ageRestrictionXid: z.number().int().nullable().optional(), + ageRestrictionName: z.string().nullable().optional(), + ageEntered: z.number().int().nullable().optional(), + ageIn: z.string().nullable().optional(), + minAge: z.number().int().nullable().optional(), + maxAge: z.number().int().nullable().optional(), isWeightRestriction: z.boolean().optional().default(false), weightRestrictionName: z.string().nullable().optional(), @@ -159,6 +163,9 @@ export const CreateActivityDto = z.object({ otherDetails: OtherDetailsDto.optional(), allowedEntryTypes: z.array(z.number().int()).optional().default([]), + navigationModeIsChargeable: z.boolean().optional().default(false), + trainerTotalAmount: z.number().int().optional().default(0), + navigationModeTotalPrice: z.number().int().optional().default(0), }); export type CreateActivityInput = z.infer; diff --git a/src/modules/host/services/host.service.ts b/src/modules/host/services/host.service.ts index ba9b6b0..5bad61f 100644 --- a/src/modules/host/services/host.service.ts +++ b/src/modules/host/services/host.service.ts @@ -27,12 +27,14 @@ import { MINGLAR_STATUS_INTERNAL, } from '../../../common/utils/constants/minglar.constant'; import { + RESTRICTION_NAME, ROLE, ROLE_NAME, USER_STATUS, } from '../../../common/utils/constants/common.constant'; import { getPresignedUrl } from '../../../common/middlewares/aws/getPreSignedUrl'; import config from '../../../config/config'; +import { CreateActivityInput } from '../dto/createActivity.schema'; function sanitizeDocumentName(name?: string) { if (!name) return null; @@ -105,7 +107,7 @@ const bucket = config.aws.bucketName; @Injectable() export class HostService { - constructor(private prisma: PrismaClient) {} + constructor(private prisma: PrismaClient) { } async createHost(data: CreateHostDto) { return this.prisma.user.create({ data }); @@ -760,7 +762,7 @@ export class HostService { if ( existingHostCompany && existingHostCompany.hostStatusInternal === - HOST_STATUS_INTERNAL.HOST_TO_UPDATE && + HOST_STATUS_INTERNAL.HOST_TO_UPDATE && !isDraft ) { hostStatusInternal = HOST_STATUS_INTERNAL.HOST_SUBMITTED; @@ -773,7 +775,7 @@ export class HostService { else if ( existingHostCompany && existingHostCompany.hostStatusInternal === - HOST_STATUS_INTERNAL.HOST_TO_UPDATE && + HOST_STATUS_INTERNAL.HOST_TO_UPDATE && isDraft ) { // keep original @@ -884,19 +886,19 @@ export class HostService { // Safely handle city connection - only connect if valid ID exists cities: parentCompanyData?.cityXid && - !isNaN(Number(parentCompanyData.cityXid)) + !isNaN(Number(parentCompanyData.cityXid)) ? { connect: { id: Number(parentCompanyData.cityXid) } } : undefined, states: parentCompanyData?.stateXid && - !isNaN(Number(parentCompanyData.stateXid)) + !isNaN(Number(parentCompanyData.stateXid)) ? { connect: { id: Number(parentCompanyData.stateXid) } } : undefined, countries: parentCompanyData?.countryXid && - !isNaN(Number(parentCompanyData.countryXid)) + !isNaN(Number(parentCompanyData.countryXid)) ? { connect: { id: Number(parentCompanyData.countryXid) } } : undefined, pinCode: parentCompanyData.pinCode || null, @@ -1046,19 +1048,19 @@ export class HostService { address2: parentCompanyData.address2 || null, cities: parentCompanyData?.cityXid && - !isNaN(Number(parentCompanyData.cityXid)) + !isNaN(Number(parentCompanyData.cityXid)) ? { connect: { id: Number(parentCompanyData.cityXid) } } : undefined, states: parentCompanyData?.stateXid && - !isNaN(Number(parentCompanyData.stateXid)) + !isNaN(Number(parentCompanyData.stateXid)) ? { connect: { id: Number(parentCompanyData.stateXid) } } : undefined, countries: parentCompanyData?.countryXid && - !isNaN(Number(parentCompanyData.countryXid)) + !isNaN(Number(parentCompanyData.countryXid)) ? { connect: { id: Number(parentCompanyData.countryXid) } } : undefined, pinCode: parentCompanyData.pinCode || null, @@ -1104,19 +1106,19 @@ export class HostService { address2: parentCompanyData.address2 || null, cities: parentCompanyData?.cityXid && - !isNaN(Number(parentCompanyData.cityXid)) + !isNaN(Number(parentCompanyData.cityXid)) ? { connect: { id: Number(parentCompanyData.cityXid) } } : undefined, states: parentCompanyData?.stateXid && - !isNaN(Number(parentCompanyData.stateXid)) + !isNaN(Number(parentCompanyData.stateXid)) ? { connect: { id: Number(parentCompanyData.stateXid) } } : undefined, countries: parentCompanyData?.countryXid && - !isNaN(Number(parentCompanyData.countryXid)) + !isNaN(Number(parentCompanyData.countryXid)) ? { connect: { id: Number(parentCompanyData.countryXid) } } : undefined, pinCode: parentCompanyData.pinCode || null, @@ -1894,14 +1896,18 @@ export class HostService { select: { id: true, isAgeRestriction: true, - ageRestriction: { - select: { - id: true, - ageRestrictionName: true, - minAge: true, - maxAge: true, - }, - }, + // ageRestriction: { + // select: { + // id: true, + // ageRestrictionName: true, + // minAge: true, + // maxAge: true, + // }, + // }, + ageRestrictionName: true, + ageEntered: true, + minAge: true, + maxAge: true, isWeightRestriction: true, weightRestrictionName: true, weightEntered: true, @@ -2278,7 +2284,7 @@ export class HostService { * ActivityPickUpTransport/Details + ActivityNavigationModes + ActivityEquipments + * ActivityAmenities + ActivityEligibility */ - async createOrUpdateActivity(userId: number, payload: any, isDraft: boolean) { + async createOrUpdateActivity(userId: number, payload: CreateActivityInput, isDraft: boolean) { /* ===================================================== * HELPERS * ===================================================== */ @@ -2388,15 +2394,45 @@ export class HostService { const rootTaxes = taxIds.length > 0 ? await this.prisma.taxes.findMany({ - where: { id: { in: taxIds }, isActive: true }, - select: { id: true, taxPer: true }, - }) + where: { id: { in: taxIds }, isActive: true }, + select: { id: true, taxPer: true }, + }) : []; if (taxIds.length !== rootTaxes.length) { throw new ApiError(400, 'Invalid or inactive tax provided'); } + const eligibility = payload.eligibility; + + if (eligibility?.isAgeRestriction) { + if (eligibility.ageRestrictionName == RESTRICTION_NAME.ABOVE) { + eligibility.minAge = toNumber(eligibility.ageEntered); + eligibility.maxAge = 150; + } else if (eligibility.ageRestrictionName == RESTRICTION_NAME.BELOW) { + eligibility.maxAge = toNumber(eligibility.ageEntered); + eligibility.minAge = 0; + } + } + if (eligibility?.isWeightRestriction) { + if (eligibility.weightRestrictionName == RESTRICTION_NAME.ABOVE) { + eligibility.minWeight = toNumber(eligibility.weightEntered); + eligibility.maxWeight = 400; + } else if (eligibility.weightRestrictionName == RESTRICTION_NAME.BELOW) { + eligibility.maxWeight = toNumber(eligibility.weightEntered); + eligibility.minWeight = 0; + } + } + if (eligibility?.isHeightRestriction) { + if (eligibility.heightRestrictionName == RESTRICTION_NAME.ABOVE) { + eligibility.minHeight = toNumber(eligibility.heightEntered); + eligibility.maxHeight = 250; + } else if (eligibility.heightRestrictionName == RESTRICTION_NAME.BELOW) { + eligibility.maxHeight = toNumber(eligibility.heightEntered); + eligibility.minHeight = 0; + } + } + /* ===================================================== * TRANSACTION * ===================================================== */ @@ -2896,7 +2932,6 @@ export class HostService { data: { activityXid, isAgeRestriction: toBool(payload.eligibility.isAgeRestriction), - ageRestrictionXid: toNumber(payload.eligibility.ageRestrictionXid), isWeightRestriction: toBool( payload.eligibility.isWeightRestriction, ),