diff --git a/client/src/components/Planner/ReservationModal.tsx b/client/src/components/Planner/ReservationModal.tsx index 6d7c7ee..f1827a8 100644 --- a/client/src/components/Planner/ReservationModal.tsx +++ b/client/src/components/Planner/ReservationModal.tsx @@ -75,6 +75,7 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p title: '', type: 'other', status: 'pending', reservation_time: '', reservation_end_time: '', end_date: '', location: '', confirmation_number: '', notes: '', assignment_id: '', accommodation_id: '', + price: '', budget_category: '', meta_airline: '', meta_flight_number: '', meta_departure_airport: '', meta_arrival_airport: '', meta_departure_timezone: '', meta_arrival_timezone: '', meta_train_number: '', meta_platform: '', meta_seat: '', @@ -130,12 +131,15 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p hotel_place_id: (() => { const acc = accommodations.find(a => a.id == reservation.accommodation_id); return acc?.place_id || '' })(), hotel_start_day: (() => { const acc = accommodations.find(a => a.id == reservation.accommodation_id); return acc?.start_day_id || '' })(), hotel_end_day: (() => { const acc = accommodations.find(a => a.id == reservation.accommodation_id); return acc?.end_day_id || '' })(), + price: meta.price || '', + budget_category: meta.budget_category || '', }) } else { setForm({ title: '', type: 'other', status: 'pending', reservation_time: '', reservation_end_time: '', end_date: '', location: '', confirmation_number: '', notes: '', assignment_id: '', accommodation_id: '', + price: '', budget_category: '', meta_airline: '', meta_flight_number: '', meta_departure_airport: '', meta_arrival_airport: '', meta_departure_timezone: '', meta_arrival_timezone: '', meta_train_number: '', meta_platform: '', meta_seat: '', @@ -185,6 +189,8 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p if (form.end_date) { combinedEndTime = form.reservation_end_time ? `${form.end_date}T${form.reservation_end_time}` : form.end_date } + if (form.price) metadata.price = form.price + if (form.budget_category) metadata.budget_category = form.budget_category const saveData: Record = { title: form.title, type: form.type, status: form.status, reservation_time: form.reservation_time, reservation_end_time: combinedEndTime, @@ -194,6 +200,13 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p accommodation_id: form.type === 'hotel' ? (form.accommodation_id || null) : null, metadata: Object.keys(metadata).length > 0 ? metadata : null, } + // Auto-create budget entry if price is set + if (form.price && parseFloat(form.price) > 0) { + saveData.create_budget_entry = { + total_price: parseFloat(form.price), + category: form.budget_category || form.type || 'Other', + } + } // If hotel with place + days, pass hotel data for auto-creation or update if (form.type === 'hotel' && form.hotel_place_id && form.hotel_start_day && form.hotel_end_day) { saveData.create_accommodation = { @@ -626,6 +639,27 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p + {/* Price + Budget Category */} +
+
+ + set('price', e.target.value)} + placeholder="0.00" + style={inputStyle} /> +
+
+ + set('budget_category', e.target.value)} + placeholder={t('reservations.budgetCategoryPlaceholder')} + style={inputStyle} /> +
+
+ {form.price && parseFloat(form.price) > 0 && ( +
+ {t('reservations.budgetHint')} +
+ )} + {/* Actions */}