$bookingFieldKey) { if (empty($bookingFieldKey)) { continue; } // If mapped to custom_link, use the static value from static_values if ($bookingFieldKey === 'custom_link') { $staticValue = $staticValues[$templateVariable] ?? ''; if ($staticValue !== '') { $variables[$templateVariable] = (string)$staticValue; } continue; } $value = $this->getBookingFieldValue($booking, $bookingFieldKey, $widget_id); if ($value !== null && $value !== '') { $variables[$templateVariable] = (string)$value; } } return $variables; } /** * Get the value of a booking field * * @param object $booking The booking object * @param string $fieldKey The field key (e.g., 'name', 'date', 'time', etc.) * @return mixed The field value */ protected function getBookingFieldValue($booking, string $fieldKey, $widget_id = null) { $restaurant = $booking->restaurant; $language = $booking->language ?: $restaurant->language; switch ($fieldKey) { case 'restaurant': return $restaurant->name ?? ''; case 'restaurant_phone': return $restaurant->dial_code . ' ' . $restaurant->phone; case 'book_now': $extraParams = []; if ($booking->customer_id) { $customer = Customer::find($booking->customer_id); if ($customer && $customer->uuid) { $extraParams['customer'] = $customer->uuid; } } // If no widget_id passed explicitly, resolve from centralized setting if ($widget_id === null) { $widget_id = BookNowWidgetResolver::resolve($restaurant->id); } return evavel_action_book_now($restaurant->id, $widget_id, $extraParams); case 'name': return $booking->name ?? ''; case 'first_name': return $booking->first_name ?? ''; case 'last_name': return $booking->last_name ?? ''; case 'email': return $booking->email ?? ''; case 'phone': return '(' . $booking->dial_code . ')' . $booking->phone; case 'guests': case 'party': return (string)($booking->party ?? ''); case 'date': return $this->formatBookingDate($booking, $language); case 'time': return $booking->getTimeFormatted(); case 'end_time': return $booking->getEndTimeFormatted(); case 'duration': return $booking->toDuration($booking->duration); case 'current_date': return $this->formatCurrentDate($booking, $language); case 'mybooking': case 'mybooking_link': return evavel_view_booking_url($booking->uuid); case 'reservation_number': return $booking->uuid ?? ''; case 'site_link': return evavel_site_url(); case 'restaurant_link': return $restaurant->link_web ?? ''; case 'restaurant_facebook': return $restaurant->link_facebook ?? ''; case 'restaurant_instagram': return $restaurant->link_instagram ?? ''; case 'menu_link': return $restaurant->link_menu ?? ''; case 'opening_link': return $restaurant->link_opening ?? ''; case 'service': return $booking->shift_event_name ?? ''; case 'area_table': return $booking->getAreaTable(); case 'area_table_assigned': return $booking->getAreaTableAssigned(); case 'message': return $booking->notes ?? ''; case 'tags': return $booking->getTagsNames(); case 'country': return Countries::country($booking->country_code) ?? ''; case 'cancel_reason': return $booking->cancelReason ?? ''; default: return $booking->{$fieldKey} ?? ''; } } /** * Get the customer phone with dial code * * @param object $booking * @return string */ protected function getCustomerPhone($booking): string { $phone = $booking->phone ?? ''; $dialCode = $booking->dial_code ?? ''; if (empty($phone)) { return ''; } if (strpos($phone, '+') === 0) { return $phone; } if (!empty($dialCode)) { if (strpos($dialCode, '+') !== 0) { $dialCode = '+' . $dialCode; } return $dialCode . $phone; } return $phone; } /** * Format the booking date using the same method as emails * * @param object $booking * @param string $language * @return string Formatted date */ protected function formatBookingDate($booking, $language): string { $date_format = $booking->getDateFormat(); return evavel_date_createFromFormatTranslate('Y-m-d', $booking->date, $language, $date_format); } /** * Format the current date using the same method as emails * * @param object $booking * @param string $language * @return string Formatted current date */ protected function formatCurrentDate($booking, $language): string { $date_format = $booking->getDateFormat(); return evavel_date_translate( evavel_now_timezone_formatted($booking->restaurant->timezone, $date_format), $language ); } }