add discount to package

This commit is contained in:
ItsMalma
2025-12-03 18:47:58 +07:00
parent 78cc084939
commit 9b58977f26
7 changed files with 3574 additions and 0 deletions

View File

@@ -65,15 +65,27 @@ export class PackageDetail {
@Property({ type: "decimal", unsigned: true }) @Property({ type: "decimal", unsigned: true })
quadPrice!: number; quadPrice!: number;
@Property({ type: "decimal", unsigned: true })
quadDiscount!: number;
@Property({ type: "decimal", unsigned: true }) @Property({ type: "decimal", unsigned: true })
triplePrice!: number; triplePrice!: number;
@Property({ type: "decimal", unsigned: true })
tripleDiscount!: number;
@Property({ type: "decimal", unsigned: true }) @Property({ type: "decimal", unsigned: true })
doublePrice!: number; doublePrice!: number;
@Property({ type: "decimal", unsigned: true })
doubleDiscount!: number;
@Property({ type: "decimal", nullable: true, unsigned: true }) @Property({ type: "decimal", nullable: true, unsigned: true })
infantPrice!: number | null; infantPrice!: number | null;
@Property({ type: "decimal", nullable: true, unsigned: true })
infantDiscount!: number | null;
@ManyToOne(() => PackageItinerary, { @ManyToOne(() => PackageItinerary, {
cascade: [Cascade.REMOVE], cascade: [Cascade.REMOVE],
}) })

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
import { Migration } from "@mikro-orm/migrations";
export class Migration20251203114705 extends Migration {
override async up(): Promise<void> {
const knex = this.getKnex();
await knex.schema.alterTable("packages", (table) => {
table.decimal("quad_discount", 10, 2).notNullable().defaultTo(0);
table.decimal("triple_discount", 10, 2).notNullable().defaultTo(0);
table.decimal("double_discount", 10, 2).notNullable().defaultTo(0);
table.decimal("infant_discount", 10, 2).notNullable().defaultTo(0);
});
}
override async down(): Promise<void> {
const knex = this.getKnex();
await knex.schema.alterTable("packages", (table) => {
table.dropColumn("quad_discount");
table.dropColumn("triple_discount");
table.dropColumn("double_discount");
table.dropColumn("infant_discount");
});
}
}

View File

@@ -675,9 +675,13 @@ export class PackageController extends Controller {
madinahHotel: madinahHotel, madinahHotel: madinahHotel,
transportation: transportationClass, transportation: transportationClass,
quadPrice: body.quad_price, quadPrice: body.quad_price,
quadDiscount: body.quad_discount,
triplePrice: body.triple_price, triplePrice: body.triple_price,
tripleDiscount: body.triple_discount,
doublePrice: body.double_price, doublePrice: body.double_price,
doubleDiscount: body.double_discount,
infantPrice: body.infant_price, infantPrice: body.infant_price,
infantDiscount: body.infant_discount,
itinerary: itineraryEntity, itinerary: itineraryEntity,
createdAt: new Date(), createdAt: new Date(),
updatedAt: new Date(), updatedAt: new Date(),
@@ -1258,9 +1262,13 @@ export class PackageController extends Controller {
madinahHotel: madinahHotel, madinahHotel: madinahHotel,
transportation: transportationClass, transportation: transportationClass,
quadPrice: body.quad_price, quadPrice: body.quad_price,
quadDiscount: body.quad_discount,
triplePrice: body.triple_price, triplePrice: body.triple_price,
tripleDiscount: body.triple_discount,
doublePrice: body.double_price, doublePrice: body.double_price,
doubleDiscount: body.double_discount,
infantPrice: body.infant_price, infantPrice: body.infant_price,
infantDiscount: body.infant_discount,
itinerary: itineraryEntity, itinerary: itineraryEntity,
updatedAt: new Date(), updatedAt: new Date(),
}); });

View File

@@ -173,9 +173,13 @@ export class PackageMapper {
packageDetail.transportation, packageDetail.transportation,
), ),
quad_price: packageDetail.quadPrice, quad_price: packageDetail.quadPrice,
quad_discount: packageDetail.quadDiscount,
triple_price: packageDetail.triplePrice, triple_price: packageDetail.triplePrice,
triple_discount: packageDetail.tripleDiscount,
double_price: packageDetail.doublePrice, double_price: packageDetail.doublePrice,
double_discount: packageDetail.doubleDiscount,
infant_price: packageDetail.infantPrice, infant_price: packageDetail.infantPrice,
infant_discount: packageDetail.infantDiscount,
itineraries, itineraries,
created_at: packageDetail.createdAt, created_at: packageDetail.createdAt,
updated_at: packageDetail.updatedAt, updated_at: packageDetail.updatedAt,

View File

@@ -77,19 +77,36 @@ export const packageDetailRequestSchema = z.object({
.number("Must be number.") .number("Must be number.")
.int("Must be integer.") .int("Must be integer.")
.positive("Must be positive."), .positive("Must be positive."),
quad_discount: z
.number("Must be number.")
.int("Must be integer.")
.nonnegative("Must be non-negative."),
triple_price: z triple_price: z
.number("Must be number.") .number("Must be number.")
.int("Must be integer.") .int("Must be integer.")
.positive("Must be positive."), .positive("Must be positive."),
triple_discount: z
.number("Must be number.")
.int("Must be integer.")
.nonnegative("Must be non-negative."),
double_price: z double_price: z
.number("Must be number.") .number("Must be number.")
.int("Must be integer.") .int("Must be integer.")
.positive("Must be positive."), .positive("Must be positive."),
double_discount: z
.number("Must be number.")
.int("Must be integer.")
.nonnegative("Must be non-negative."),
infant_price: z infant_price: z
.number("Must be number.") .number("Must be number.")
.int("Must be integer.") .int("Must be integer.")
.positive("Must be positive.") .positive("Must be positive.")
.nullable(), .nullable(),
infant_discount: z
.number("Must be number.")
.int("Must be integer.")
.nonnegative("Must be non-negative.")
.nullable(),
itineraries: z.array( itineraries: z.array(
z.object( z.object(
{ {

View File

@@ -78,9 +78,13 @@ export type PackageDetailResponse = {
madinah_hotel: HotelResponse; madinah_hotel: HotelResponse;
transportation: TransportationClassResponse; transportation: TransportationClassResponse;
quad_price: number; quad_price: number;
quad_discount: number;
triple_price: number; triple_price: number;
triple_discount: number;
double_price: number; double_price: number;
double_discount: number;
infant_price: number | null; infant_price: number | null;
infant_discount: number | null;
itineraries: PackageItineraryResponse[]; itineraries: PackageItineraryResponse[];
created_at: Date; created_at: Date;
updated_at: Date; updated_at: Date;