From d5a153702de430ecd0dc2c7dac6e019b2f556b1c Mon Sep 17 00:00:00 2001 From: ItsMalma Date: Thu, 8 Jan 2026 21:15:47 +0700 Subject: [PATCH] update order price calculation --- .../midtrans.payment-service.ts | 62 +++++++++++-------- src/modules/order/order.schemas.ts | 8 +-- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/common/services/payment-service/midtrans.payment-service.ts b/src/common/services/payment-service/midtrans.payment-service.ts index e2399fb..69a53a6 100644 --- a/src/common/services/payment-service/midtrans.payment-service.ts +++ b/src/common/services/payment-service/midtrans.payment-service.ts @@ -35,32 +35,42 @@ export class MidtransPaymentService extends AbstractPaymentService { if (order.type === OrderType.bookingSeat) { price += BOOKING_SEAT_PRICE * quantity; } else if (order.type === OrderType.downPayment) { - price += - Math.ceil( - ((order.quadDownPaymentPercentage / 100) * - (order.package.quadPrice - order.package.quadDiscount)) / - 100_000, - ) * - 100_000 + - Math.ceil( - ((order.tripleDownPaymentPercentage / 100) * - (order.package.triplePrice - order.package.tripleDiscount)) / - 100_000, - ) * - 100_000 + - Math.ceil( - ((order.doubleDownPaymentPercentage / 100) * - (order.package.doublePrice - order.package.doubleDiscount)) / - 100_000, - ) * - 100_000 + - Math.ceil( - ((order.infantDownPaymentPercentage / 100) * - ((order.package.infantPrice ?? 0) - - (order.package.infantDiscount ?? 0))) / - 100_000, - ) * - 100_000; + if (order.quadDownPaymentPercentage > 0) { + price += + Math.ceil( + ((order.quadDownPaymentPercentage / 100) * + (order.package.quadPrice - order.package.quadDiscount)) / + 100_000, + ) * 100_000; + } + if (order.tripleDownPaymentPercentage > 0) { + price += + Math.ceil( + ((order.tripleDownPaymentPercentage / 100) * + (order.package.triplePrice - order.package.tripleDiscount)) / + 100_000, + ) * 100_000; + } + if (order.doubleDownPaymentPercentage > 0) { + price += + Math.ceil( + ((order.doubleDownPaymentPercentage / 100) * + (order.package.doublePrice - order.package.doubleDiscount)) / + 100_000, + ) * 100_000; + } + if ( + order.infantDownPaymentPercentage > 0 && + order.package.infantPrice !== null && + order.package.infantDiscount !== null + ) { + price += + Math.ceil( + ((order.infantDownPaymentPercentage / 100) * + (order.package.infantPrice - order.package.infantDiscount)) / + 100_000, + ) * 100_000; + } } if (order.kit === Kit.minimal) { price += MINIMAL_KIT_PRICE; diff --git a/src/modules/order/order.schemas.ts b/src/modules/order/order.schemas.ts index 4adb918..bbe9dcb 100644 --- a/src/modules/order/order.schemas.ts +++ b/src/modules/order/order.schemas.ts @@ -16,22 +16,22 @@ export const orderRequestSchema = z.object({ quad_down_payment_percentage: z .number("Must be number.") .int("Must be integer") - .min(25, "Min 25.") + .min(0, "Min 0.") .max(100, "Max 100."), triple_down_payment_percentage: z .number("Must be number.") .int("Must be integer") - .min(25, "Min 25.") + .min(0, "Min 0.") .max(100, "Max 100."), double_down_payment_percentage: z .number("Must be number.") .int("Must be integer") - .min(25, "Min 25.") + .min(0, "Min 0.") .max(100, "Max 100."), infant_down_payment_percentage: z .number("Must be number.") .int("Must be integer") - .min(25, "Min 25.") + .min(0, "Min 0.") .max(100, "Max 100."), kit: z.enum(Kit, "Must be either 'minimal', 'without_suitcase', or 'full'."), vaccine: z.number("Must be number.").int("Must be integer.").min(0, "Min 0."),