id) ? (int) $trip_data->id : 0; $max_travelers = (int) ($trip_data->max_travelers ?? 20); $item_id = isset($card['id']) ? (string) $card['id'] : (string) $index; // Get pricing from card (already calculated with dynamic pricing in Controller) $sale_price = (float) ($card['sale_price'] ?? 0); $original_price = (float) ($card['original_price'] ?? 0); $initial_total_price = $sale_price; $seats_available = (int) ($card['seats_available'] ?? 0); $is_limited = !empty($card['is_limited']); $card_status = $card['status'] ?? 'available'; $is_sold_out = isset($card['is_sold_out']) && $card['is_sold_out']; if ($is_sold_out || $card_status === 'sold_out') { $card_status = 'sold_out'; } // Match Y-m-d even if DB returns datetime (e.g. 2026-08-13 00:00:00) $yatra_card_date_norm = static function ($v): string { $v = trim((string) $v); return preg_match('/^(\d{4}-\d{2}-\d{2})/', $v, $m) ? $m[1] : $v; }; $sel_norm = $yatra_card_date_norm($selected_date_filter ?? ''); $card_date_norm = $yatra_card_date_norm($card['data_date'] ?? ''); $is_selected_card = ($sel_norm !== '' && $card_date_norm !== '' && $sel_norm === $card_date_norm); $should_be_open = $is_selected_card || $index === 0; // Apply Yatra date format to availability header dates when the controller returns ISO. $yatra_format_card_date_for_display = static function ($value): string { $raw = trim((string) $value); if ($raw === '') { return ''; } // Only transform ISO-like values; leave already-human strings unchanged. if (!preg_match('/^\d{4}-\d{2}-\d{2}/', $raw)) { return $raw; } return \Yatra\Helpers\FormatHelper::formatDate($raw); }; $from_date_display = $yatra_format_card_date_for_display($card['from_date'] ?? ''); $to_date_display = $yatra_format_card_date_for_display($card['to_date'] ?? ''); $date_display_display = $yatra_format_card_date_for_display($card['date_display'] ?? ''); $dp_disp = $card['dynamic_pricing_display'] ?? []; $dp_show_original = filter_var($dp_disp['show_original_price'] ?? true, FILTER_VALIDATE_BOOLEAN); $dp_show_savings = filter_var($dp_disp['show_savings_badge'] ?? true, FILTER_VALIDATE_BOOLEAN); $dp_show_urgency = filter_var($dp_disp['show_urgency_messages'] ?? false, FILTER_VALIDATE_BOOLEAN); $dp_urgency_messages = []; if (!empty($card['dynamic_pricing_urgency_messages']) && is_array($card['dynamic_pricing_urgency_messages'])) { $dp_urgency_messages = $card['dynamic_pricing_urgency_messages']; } $dp_enabled = (bool) apply_filters('yatra_dynamic_pricing_enabled', false); // Display amounts for this card (must match traveler row data-price, including per-category DP). $display_sale_price = $sale_price; $display_original_price = $original_price; $card_pricing_type_header = $card['pricing_type'] ?? $pricing_type ?? 'regular'; if ($card_pricing_type_header === 'traveler_based' && !empty($card['traveler_pricing']) && is_array($card['traveler_pricing'])) { $first_traveler = $card['traveler_pricing'][0]; $first_traveler = is_array($first_traveler) ? (object) $first_traveler : $first_traveler; $pt_price = 0.0; if (isset($first_traveler->effective_price) && (float) $first_traveler->effective_price > 0) { $pt_price = (float) $first_traveler->effective_price; } elseif (isset($first_traveler->discounted_price) && (float) $first_traveler->discounted_price > 0) { $pt_price = (float) $first_traveler->discounted_price; } elseif (isset($first_traveler->original_price) && (float) $first_traveler->original_price > 0) { $pt_price = (float) $first_traveler->original_price; } if ($dp_enabled && $pt_price > 0) { $pt_orig_dp = (float) ($first_traveler->original_price ?? 0); $pt_disc_dp = (float) ($first_traveler->discounted_price ?? $first_traveler->sale_price ?? $first_traveler->effective_price ?? 0); if ($pt_disc_dp <= 0) { $pt_disc_dp = $pt_price; } $pt_price = (float) apply_filters('yatra_availability_price', $pt_price, $trip_id, [ 'departure_date' => $card['date'] ?? null, 'spots_remaining' => $card['spots_remaining'] ?? null, 'availability_id' => $item_id, 'price_type_id' => $first_traveler->id ?? ($first_traveler->price_type_id ?? null), 'original_price' => $pt_orig_dp > 0 ? $pt_orig_dp : $pt_price, 'discounted_price' => $pt_disc_dp > 0 ? $pt_disc_dp : $pt_price, ]); } if ($pt_price > 0) { $display_sale_price = $pt_price; } $fo = (float) ($first_traveler->original_price ?? 0); if ($fo > 0) { $display_original_price = $fo; } } $yatra_av_badges_row_original = $dp_show_original && $display_original_price > $display_sale_price && $display_original_price > 0; $yatra_av_badges_row_savings = $dp_show_savings && !empty($card['discount_text']); $yatra_av_discount_is_surge = $yatra_av_badges_row_savings && strpos((string) $card['discount_text'], '+') === 0; $initial_total_price = $display_sale_price; ?>