fix: Preisanzeige korrigieren - Cent zu Euro Konvertierung
Problem: Preise wurden in Cent gespeichert aber fälschlicherweise als Euro angezeigt Lösung: Alle Backend-APIs konvertieren Preise korrekt von Cent zu Euro (/100) Betroffene Dateien: - bookings.ts: E-Mail-Templates und Preisberechnungen - cancellation.ts: Preisberechnungen für Stornierungen - email-templates.ts: HTML-E-Mail-Templates - email.ts: ICS-Kalender-Integration - caldav.ts: CalDAV-Kalender-Export Jetzt werden Preise konsistent in Euro angezeigt (z.B. 50.00€ statt 5000.00€)
This commit is contained in:
@@ -14,12 +14,12 @@ function renderTreatmentList(
|
|||||||
options: { showPrices: boolean } = { showPrices: true }
|
options: { showPrices: boolean } = { showPrices: true }
|
||||||
): string {
|
): string {
|
||||||
const totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
const treatmentItems = treatments.map(t =>
|
const treatmentItems = treatments.map(t =>
|
||||||
options.showPrices
|
options.showPrices
|
||||||
? `<li><strong>${t.name}</strong> - ${t.duration} Min - ${t.price.toFixed(2)} €</li>`
|
? `<li><strong>${t.name}</strong> - ${t.duration} Min - ${(t.price / 100).toFixed(2)} €</li>`
|
||||||
: `<li>${t.name} - ${t.duration} Min - ${t.price.toFixed(2)} €</li>`
|
: `<li>${t.name} - ${t.duration} Min - ${(t.price / 100).toFixed(2)} €</li>`
|
||||||
).join('');
|
).join('');
|
||||||
|
|
||||||
const totalLine = options.showPrices
|
const totalLine = options.showPrices
|
||||||
|
@@ -72,10 +72,10 @@ function createICSFile(params: {
|
|||||||
// Build treatments list for SUMMARY and DESCRIPTION
|
// Build treatments list for SUMMARY and DESCRIPTION
|
||||||
const treatmentNames = icsEscape(treatments.map(t => t.name).join(', '));
|
const treatmentNames = icsEscape(treatments.map(t => t.name).join(', '));
|
||||||
const totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
const treatmentDetails = treatments.map(t =>
|
const treatmentDetails = treatments.map(t =>
|
||||||
`${icsEscape(t.name)} (${t.duration} Min, ${t.price.toFixed(2)} EUR)`
|
`${icsEscape(t.name)} (${t.duration} Min, ${(t.price / 100).toFixed(2)} EUR)`
|
||||||
).join('\\n');
|
).join('\\n');
|
||||||
|
|
||||||
const description = `Behandlungen:\\n${treatmentDetails}\\n\\nGesamt: ${totalDuration} Min, ${totalPrice.toFixed(2)} EUR\\n\\nTermin bei Stargirlnails Kiel`;
|
const description = `Behandlungen:\\n${treatmentDetails}\\n\\nGesamt: ${totalDuration} Min, ${totalPrice.toFixed(2)} EUR\\n\\nTermin bei Stargirlnails Kiel`;
|
||||||
|
@@ -84,11 +84,11 @@ X-WR-TIMEZONE:Europe/Berlin
|
|||||||
treatmentNames = booking.treatments.map(t => t.name).join(', ');
|
treatmentNames = booking.treatments.map(t => t.name).join(', ');
|
||||||
|
|
||||||
duration = booking.treatments.reduce((sum, t) => sum + (t.duration || 0), 0);
|
duration = booking.treatments.reduce((sum, t) => sum + (t.duration || 0), 0);
|
||||||
totalPrice = booking.treatments.reduce((sum, t) => sum + (t.price || 0), 0);
|
totalPrice = booking.treatments.reduce((sum, t) => sum + ((t.price || 0) / 100), 0);
|
||||||
|
|
||||||
// Build detailed treatment list for description
|
// Build detailed treatment list for description
|
||||||
treatmentDetails = booking.treatments
|
treatmentDetails = booking.treatments
|
||||||
.map(t => `- ${t.name} (${t.duration} Min., ${t.price}€)`)
|
.map(t => `- ${t.name} (${t.duration} Min., ${(t.price / 100).toFixed(2)}€)`)
|
||||||
.join('\\n');
|
.join('\\n');
|
||||||
|
|
||||||
if (booking.treatments.length > 1) {
|
if (booking.treatments.length > 1) {
|
||||||
@@ -101,7 +101,7 @@ X-WR-TIMEZONE:Europe/Berlin
|
|||||||
duration = booking.bookedDurationMinutes || treatment?.duration || 60;
|
duration = booking.bookedDurationMinutes || treatment?.duration || 60;
|
||||||
treatmentDetails = `Behandlung: ${treatmentNames}`;
|
treatmentDetails = `Behandlung: ${treatmentNames}`;
|
||||||
if (treatment?.price) {
|
if (treatment?.price) {
|
||||||
treatmentDetails += ` (${duration} Min., ${treatment.price}€)`;
|
treatmentDetails += ` (${duration} Min., ${(treatment.price / 100).toFixed(2)}€)`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -367,9 +367,9 @@ const create = os
|
|||||||
treatments: input.treatments
|
treatments: input.treatments
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = input.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = input.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = input.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = input.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = input.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = input.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
await sendEmail({
|
await sendEmail({
|
||||||
to: input.customerEmail,
|
to: input.customerEmail,
|
||||||
@@ -394,9 +394,9 @@ const create = os
|
|||||||
});
|
});
|
||||||
|
|
||||||
const homepageUrl = generateUrl();
|
const homepageUrl = generateUrl();
|
||||||
const treatmentsText = input.treatments.map(t => ` - ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = input.treatments.map(t => ` - ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = input.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = input.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = input.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = input.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
const adminText = `Neue Buchungsanfrage eingegangen:\n\n` +
|
const adminText = `Neue Buchungsanfrage eingegangen:\n\n` +
|
||||||
`Name: ${input.customerName}\n` +
|
`Name: ${input.customerName}\n` +
|
||||||
@@ -483,9 +483,9 @@ const updateStatus = os
|
|||||||
treatments: booking.treatments
|
treatments: booking.treatments
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = booking.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = booking.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
if (booking.customerEmail) {
|
if (booking.customerEmail) {
|
||||||
await sendEmailWithAGBAndCalendar({
|
await sendEmailWithAGBAndCalendar({
|
||||||
@@ -512,9 +512,9 @@ const updateStatus = os
|
|||||||
treatments: booking.treatments
|
treatments: booking.treatments
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = booking.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = booking.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
if (booking.customerEmail) {
|
if (booking.customerEmail) {
|
||||||
await sendEmail({
|
await sendEmail({
|
||||||
@@ -571,9 +571,9 @@ const remove = os
|
|||||||
treatments: booking.treatments
|
treatments: booking.treatments
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = booking.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = booking.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
await sendEmail({
|
await sendEmail({
|
||||||
to: booking.customerEmail,
|
to: booking.customerEmail,
|
||||||
@@ -693,8 +693,8 @@ const createManual = os
|
|||||||
treatments: input.treatments
|
treatments: input.treatments
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = input.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = input.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalPrice = input.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = input.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
await sendEmailWithAGBAndCalendar({
|
await sendEmailWithAGBAndCalendar({
|
||||||
to: input.customerEmail!,
|
to: input.customerEmail!,
|
||||||
@@ -874,8 +874,8 @@ export const router = {
|
|||||||
treatments: updated.treatments,
|
treatments: updated.treatments,
|
||||||
});
|
});
|
||||||
|
|
||||||
const treatmentsText = updated.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = updated.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalPrice = updated.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = updated.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
await sendEmailWithAGBAndCalendar({
|
await sendEmailWithAGBAndCalendar({
|
||||||
to: updated.customerEmail,
|
to: updated.customerEmail,
|
||||||
@@ -929,9 +929,9 @@ export const router = {
|
|||||||
if (booking.customerEmail) {
|
if (booking.customerEmail) {
|
||||||
const bookingAccessToken = await queryClient.cancellation.createToken({ bookingId: booking.id });
|
const bookingAccessToken = await queryClient.cancellation.createToken({ bookingId: booking.id });
|
||||||
|
|
||||||
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${t.price.toFixed(2)} €)`).join('\n');
|
const treatmentsText = booking.treatments.map(t => `- ${t.name} (${t.duration} Min, ${(t.price / 100).toFixed(2)} €)`).join('\n');
|
||||||
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
const totalDuration = booking.treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
const totalPrice = booking.treatments.reduce((sum, t) => sum + t.price, 0);
|
const totalPrice = booking.treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
|
|
||||||
await sendEmail({
|
await sendEmail({
|
||||||
to: booking.customerEmail,
|
to: booking.customerEmail,
|
||||||
|
@@ -137,7 +137,7 @@ const getBookingByToken = os
|
|||||||
// New bookings with treatments array
|
// New bookings with treatments array
|
||||||
treatments = booking.treatments;
|
treatments = booking.treatments;
|
||||||
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
totalPrice = treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
} else if (booking.treatmentId) {
|
} else if (booking.treatmentId) {
|
||||||
// Old bookings with single treatmentId (backward compatibility)
|
// Old bookings with single treatmentId (backward compatibility)
|
||||||
const treatmentsKV = createKV<any>("treatments");
|
const treatmentsKV = createKV<any>("treatments");
|
||||||
@@ -151,7 +151,7 @@ const getBookingByToken = os
|
|||||||
price: treatment.price,
|
price: treatment.price,
|
||||||
}];
|
}];
|
||||||
totalDuration = treatment.duration;
|
totalDuration = treatment.duration;
|
||||||
totalPrice = treatment.price;
|
totalPrice = treatment.price / 100;
|
||||||
} else {
|
} else {
|
||||||
// Fallback if treatment not found
|
// Fallback if treatment not found
|
||||||
treatments = [];
|
treatments = [];
|
||||||
@@ -333,7 +333,7 @@ export const router = {
|
|||||||
// New bookings with treatments array
|
// New bookings with treatments array
|
||||||
treatments = booking.treatments;
|
treatments = booking.treatments;
|
||||||
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
totalDuration = treatments.reduce((sum, t) => sum + t.duration, 0);
|
||||||
totalPrice = treatments.reduce((sum, t) => sum + t.price, 0);
|
totalPrice = treatments.reduce((sum, t) => sum + (t.price / 100), 0);
|
||||||
} else if (booking.treatmentId) {
|
} else if (booking.treatmentId) {
|
||||||
// Old bookings with single treatmentId (backward compatibility)
|
// Old bookings with single treatmentId (backward compatibility)
|
||||||
const treatmentsKV = createKV<any>("treatments");
|
const treatmentsKV = createKV<any>("treatments");
|
||||||
@@ -347,7 +347,7 @@ export const router = {
|
|||||||
price: treatment.price,
|
price: treatment.price,
|
||||||
}];
|
}];
|
||||||
totalDuration = treatment.duration;
|
totalDuration = treatment.duration;
|
||||||
totalPrice = treatment.price;
|
totalPrice = treatment.price / 100;
|
||||||
} else {
|
} else {
|
||||||
// Fallback if treatment not found
|
// Fallback if treatment not found
|
||||||
treatments = [];
|
treatments = [];
|
||||||
|
Reference in New Issue
Block a user