Merge branch 'mayankSprint2' of http://git.wdipl.com/Mayank.Mishra/MinglarBackendNestJS into paritosh-main1

This commit is contained in:
paritosh18
2025-12-24 17:11:17 +05:30
4 changed files with 158 additions and 104 deletions

View File

@@ -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")

View File

@@ -21,4 +21,9 @@ export const USER_STATUS = {
ACTIVE: "Active",
DE_ACTIVATED: "De-activated",
REJECTED: "Rejected"
}
export const RESTRICTION_NAME = {
ABOVE: "Above",
BELOW: "Below",
}

View File

@@ -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<typeof CreateActivityDto>;

View File

@@ -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,
),