Fix: TypeScript-Fehler für Multi-Treatment-Migration beheben
- admin-calendar.tsx: getTreatmentNames für treatments[] angepasst - admin-calendar.tsx: getAvailableTimes für treatmentIds[] umgestellt - admin-calendar.tsx: createManualBooking sendet treatments[] statt treatmentId - cancellation.ts: treatmentId optional behandeln (Rückwärtskompatibilität) - review-submission-page.tsx: treatmentName durch treatments[] ersetzt - booking-status-page.tsx: proposed date/time als optional markiert Docker-Build erfolgreich getestet.
This commit is contained in:
@@ -28,7 +28,15 @@ const cancellationKV = createKV<BookingAccessToken>("cancellation_tokens");
|
||||
// Types for booking and availability
|
||||
type Booking = {
|
||||
id: string;
|
||||
treatmentId: string;
|
||||
treatments: Array<{
|
||||
id: string;
|
||||
name: string;
|
||||
duration: number;
|
||||
price: number;
|
||||
}>;
|
||||
// Deprecated fields for backward compatibility
|
||||
treatmentId?: string;
|
||||
bookedDurationMinutes?: number;
|
||||
customerName: string;
|
||||
customerEmail?: string;
|
||||
customerPhone?: string;
|
||||
@@ -120,9 +128,42 @@ const getBookingByToken = os
|
||||
throw new Error("Booking not found");
|
||||
}
|
||||
|
||||
// Get treatment details
|
||||
const treatmentsKV = createKV<any>("treatments");
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
// Handle treatments array
|
||||
let treatments: Array<{id: string; name: string; duration: number; price: number}>;
|
||||
let totalDuration: number;
|
||||
let totalPrice: number;
|
||||
|
||||
if (booking.treatments && booking.treatments.length > 0) {
|
||||
// New bookings with treatments array
|
||||
treatments = booking.treatments;
|
||||
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||
totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
||||
} else if (booking.treatmentId) {
|
||||
// Old bookings with single treatmentId (backward compatibility)
|
||||
const treatmentsKV = createKV<any>("treatments");
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
|
||||
if (treatment) {
|
||||
treatments = [{
|
||||
id: treatment.id,
|
||||
name: treatment.name,
|
||||
duration: treatment.duration,
|
||||
price: treatment.price,
|
||||
}];
|
||||
totalDuration = treatment.duration;
|
||||
totalPrice = treatment.price;
|
||||
} else {
|
||||
// Fallback if treatment not found
|
||||
treatments = [];
|
||||
totalDuration = booking.bookedDurationMinutes || 60;
|
||||
totalPrice = 0;
|
||||
}
|
||||
} else {
|
||||
// Edge case: no treatments and no treatmentId
|
||||
treatments = [];
|
||||
totalDuration = 0;
|
||||
totalPrice = 0;
|
||||
}
|
||||
|
||||
// Calculate if cancellation is still possible
|
||||
const minStornoTimespan = parseInt(process.env.MIN_STORNO_TIMESPAN || "24");
|
||||
@@ -140,10 +181,9 @@ const getBookingByToken = os
|
||||
customerPhone: booking.customerPhone,
|
||||
appointmentDate: booking.appointmentDate,
|
||||
appointmentTime: booking.appointmentTime,
|
||||
treatmentId: booking.treatmentId,
|
||||
treatmentName: treatment?.name || "Unbekannte Behandlung",
|
||||
treatmentDuration: treatment?.duration || 60,
|
||||
treatmentPrice: treatment?.price || 0,
|
||||
treatments,
|
||||
totalDuration,
|
||||
totalPrice,
|
||||
status: booking.status,
|
||||
notes: booking.notes,
|
||||
formattedDate: formatDateGerman(booking.appointmentDate),
|
||||
@@ -284,8 +324,42 @@ export const router = {
|
||||
throw new Error("Booking not found");
|
||||
}
|
||||
|
||||
const treatmentsKV = createKV<any>("treatments");
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
// Handle treatments array
|
||||
let treatments: Array<{id: string; name: string; duration: number; price: number}>;
|
||||
let totalDuration: number;
|
||||
let totalPrice: number;
|
||||
|
||||
if (booking.treatments && booking.treatments.length > 0) {
|
||||
// New bookings with treatments array
|
||||
treatments = booking.treatments;
|
||||
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||
totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
||||
} else if (booking.treatmentId) {
|
||||
// Old bookings with single treatmentId (backward compatibility)
|
||||
const treatmentsKV = createKV<any>("treatments");
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
|
||||
if (treatment) {
|
||||
treatments = [{
|
||||
id: treatment.id,
|
||||
name: treatment.name,
|
||||
duration: treatment.duration,
|
||||
price: treatment.price,
|
||||
}];
|
||||
totalDuration = treatment.duration;
|
||||
totalPrice = treatment.price;
|
||||
} else {
|
||||
// Fallback if treatment not found
|
||||
treatments = [];
|
||||
totalDuration = booking.bookedDurationMinutes || 60;
|
||||
totalPrice = 0;
|
||||
}
|
||||
} else {
|
||||
// Edge case: no treatments and no treatmentId
|
||||
treatments = [];
|
||||
totalDuration = 0;
|
||||
totalPrice = 0;
|
||||
}
|
||||
|
||||
const now = new Date();
|
||||
const isExpired = new Date(proposal.expiresAt) <= now;
|
||||
@@ -298,8 +372,9 @@ export const router = {
|
||||
customerEmail: booking.customerEmail,
|
||||
customerPhone: booking.customerPhone,
|
||||
status: booking.status,
|
||||
treatmentId: booking.treatmentId,
|
||||
treatmentName: treatment?.name || "Unbekannte Behandlung",
|
||||
treatments,
|
||||
totalDuration,
|
||||
totalPrice,
|
||||
},
|
||||
original: {
|
||||
date: proposal.originalDate || booking.appointmentDate,
|
||||
@@ -358,14 +433,22 @@ export const router = {
|
||||
const booking = await bookingsKV.getItem(proposal.bookingId);
|
||||
if (booking) {
|
||||
const treatmentsKV = createKV<any>("treatments");
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
// Get treatment name(s) from new treatments array or fallback to deprecated treatmentId
|
||||
let treatmentName = "Unbekannte Behandlung";
|
||||
if (booking.treatments && Array.isArray(booking.treatments) && booking.treatments.length > 0) {
|
||||
treatmentName = booking.treatments.map((t: any) => t.name).join(", ");
|
||||
} else if (booking.treatmentId) {
|
||||
const treatment = await treatmentsKV.getItem(booking.treatmentId);
|
||||
treatmentName = treatment?.name || "Unbekannte Behandlung";
|
||||
}
|
||||
|
||||
expiredDetails.push({
|
||||
customerName: booking.customerName,
|
||||
originalDate: proposal.originalDate || booking.appointmentDate,
|
||||
originalTime: proposal.originalTime || booking.appointmentTime,
|
||||
proposedDate: proposal.proposedDate!,
|
||||
proposedTime: proposal.proposedTime!,
|
||||
treatmentName: treatment?.name || "Unbekannte Behandlung",
|
||||
treatmentName: treatmentName,
|
||||
customerEmail: booking.customerEmail,
|
||||
customerPhone: booking.customerPhone,
|
||||
expiredAt: proposal.expiresAt,
|
||||
|
Reference in New Issue
Block a user