From a2d02321136e5914f068b426df3575561c61a4df Mon Sep 17 00:00:00 2001 From: Mahdi Date: Wed, 15 Jul 2026 20:42:03 +0330 Subject: [PATCH] AddServiceLoyalty --- src/api/bookings.ts | 6 +- src/api/business-services.ts | 2 + src/api/types.ts | 11 ++++ src/components/booking/DesktopBookingFlow.vue | 62 ++++++++++++++++++- src/views/app/AppOwnerView.vue | 47 ++++++++++++++ src/views/app/BookingPaymentView.vue | 14 ++++- 6 files changed, 137 insertions(+), 5 deletions(-) diff --git a/src/api/bookings.ts b/src/api/bookings.ts index 82074a4..8e03258 100644 --- a/src/api/bookings.ts +++ b/src/api/bookings.ts @@ -1,5 +1,5 @@ import { api } from './client'; -import type { Booking, BookingStatus } from './types'; +import type { Booking, BookingStatus, ServiceLoyaltyStatus } from './types'; export type CreateBookingPayload = { customerId: string; @@ -99,6 +99,10 @@ export function fetchPendingReviews() { return api('/bookings/pending-reviews'); } +export function fetchServiceLoyaltyStatus(businessServiceId: string) { + return api(`/bookings/loyalty/${businessServiceId}`); +} + export function submitBookingReview(bookingId: string, rating: number) { return api<{ id: string; rating: number }>(`/bookings/${bookingId}/review`, { method: 'POST', diff --git a/src/api/business-services.ts b/src/api/business-services.ts index c51d0f3..f57f67a 100644 --- a/src/api/business-services.ts +++ b/src/api/business-services.ts @@ -13,6 +13,8 @@ export type UpdateBusinessServicePayload = { price?: number; durationMinutes?: number | null; isActive?: boolean; + loyaltyEnabled?: boolean; + loyaltyEveryN?: number | null; }; export function fetchBusinessServices( diff --git a/src/api/types.ts b/src/api/types.ts index 650adc9..dd7a1d9 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -94,10 +94,20 @@ export type BusinessService = { price: string; durationMinutes?: number | null; isActive: boolean; + loyaltyEnabled?: boolean; + loyaltyEveryN?: number | null; serviceTemplate?: ServiceTemplate; classPrices?: BusinessServiceClassPrice[]; }; +export type ServiceLoyaltyStatus = { + enabled: boolean; + everyN: number | null; + paidCount: number; + nextIsFree: boolean; + remainingPaidVisits: number | null; +}; + export type Booking = { id: string; customerId: string; @@ -111,6 +121,7 @@ export type Booking = { cancellationReason?: string | null; paymentToken?: string | null; paymentAmount?: string | null; + loyaltyRedeemed?: boolean; business?: Business; businessService?: BusinessService; serviceClass?: BusinessServiceClass; diff --git a/src/components/booking/DesktopBookingFlow.vue b/src/components/booking/DesktopBookingFlow.vue index e80db71..76cc2b0 100644 --- a/src/components/booking/DesktopBookingFlow.vue +++ b/src/components/booking/DesktopBookingFlow.vue @@ -54,6 +54,12 @@ {{ formatPriceToman(selectedPrice) }} تومان +

+ {{ loyaltyHint }} +

@@ -268,10 +274,21 @@