PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.16
Yatra – Travel Booking & Tour Operator Software v3.0.16
3.0.16 3.0.15 3.0.14 3.0.14.1 3.0.14.2 3.0.12 3.0.13 3.0.11 3.0.10 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.5.1 3.0.4 3.0.3 3.0.2.9 3.0.2.7 3.0.2.8 3.0.2.6 trunk 1.0.0 2.0.0 2.0.1 All 84 releases
← All changes | app/Services/SettingsService.php +50 -4 3.0.8 → 3.0.16 View file →
@@ -45,8 +45,10 @@
45 45 /** Primary brand color (hex) for trip/booking/listing frontend — see FrontendThemeCss */
46 46 'frontend_primary_color' => '#3b82f6',
47 47 /** Max width for Yatra trip/booking/listing containers (CSS length). Empty = theme.json / content width / filter. */
48 48 'frontend_container_max_width' => '',
49 + /** Trip listing card density: 'standard' | 'compact_mobile' | 'compact_all'. */
50 + 'frontend_listing_card_layout' => 'standard',
49 51
50 52 // Booking
51 53 'booking_base' => 'book',
52 54 'use_booking_page' => false,
@@ -55,8 +57,13 @@
55 57 'privacy_policy_page_id' => 0,
56 58 'enable_guest_booking' => true,
57 59 'booking_confirmation' => true,
58 60 'auto_confirm_bookings' => false,
61 + // Auto-confirm mode: none | online | all. Default 'online' (successful
62 + // online payment => confirmed). Behaviour is resolved via
63 + // yatra_get_auto_confirm_mode(), which uses the stored mode when set and
64 + // otherwise derives from the legacy auto_confirm_bookings boolean.
65 + 'auto_confirm_mode' => 'online',
59 66 'require_login' => false,
60 67 'allow_guest_checkout' => true,
61 68 // Hold guest bookings in `pending_verification` status until
62 69 // the customer clicks a magic link sent to the email they
@@ -74,8 +81,12 @@
74 81 // gracefully by skipping the cancellation paragraph or
75 82 // falling back to the per-trip cancellation_policy.
76 83 'booking_expiry_hours' => 24,
77 84 'booking_reminder_days' => 3,
85 + // Storefront booking horizon in months. 12 is the value that was
86 + // hard-coded before it became configurable, so a site that never
87 + // touches it behaves exactly as before. See yatra_get_availability_horizon_months().
88 + 'availability_horizon_months' => 12,
78 89 'allow_waitlist' => true,
79 90 'waitlist_auto_confirm' => false,
80 91 // Pro: when enabled, the single-trip date_specific mode renders a
81 92 // <select> of available departure dates instead of the flatpickr
@@ -112,8 +123,12 @@
112 123 'email_from_address' => '',
113 124 'admin_email' => '',
114 125 'enable_admin_notifications' => true,
115 126 'enable_customer_notifications' => true,
127 + // Blind copy of every outgoing Yatra email, for archiving or monitoring.
128 + // Empty (the default) means no copy is sent, so existing sites are
129 + // unaffected. Accepts several comma-separated addresses.
130 + 'email_always_bcc' => '',
116 131
117 132 // Email template enable flags.
118 133 //
119 134 // These mirror SettingsController::$default_settings + the
@@ -131,8 +146,13 @@
131 146 // confirmation + every transactional email silently no-ops
132 147 // on those installs (sendIfEnabled gates on the flag).
133 148 'email_template_booking' => true,
134 149 'email_template_confirmation' => true,
150 + // Separate "part payment received" email. Off by default: existing sites
151 + // keep sending the single payment-received template for every payment,
152 + // exactly as before. Only meaningful when deposits / partial payments
153 + // are enabled.
154 + 'email_template_partial_payment' => false,
135 155 'email_template_cancellation' => true,
136 156 'email_template_reminder' => true,
137 157 'email_template_admin_new_booking' => true,
138 158 'email_template_admin_payment' => true,
@@ -139,8 +159,10 @@
139 159 'email_template_admin_cancellation' => true,
140 160 'email_template_trip_consent' => true,
141 161 'email_template_customer_verification' => true,
142 162 'email_template_guest_verification' => true,
163 + 'email_template_account_email_change' => true,
164 + 'email_template_account_email_changed' => true,
143 165 'email_template_booking_completed' => true,
144 166 'email_template_booking_expired_customer' => true,
145 167 'email_template_admin_booking_expired' => true,
146 168 'email_template_scheduled_payment_reminder' => true,
@@ -176,8 +198,12 @@
176 198 'search_show_destination' => true,
177 199 'search_show_activities' => true,
178 200 'search_show_duration' => true,
179 201 'search_show_budget' => true,
202 + // Opt-in (default false): show a date field that filters trips to those
203 + // with a departure on the selected date. Off by default so existing
204 + // search bars are unchanged on update.
205 + 'search_show_date' => false,
180 206 // Collapse the listing filter sidebar sections on mobile. Default false
181 207 // = today's behaviour (all sections expanded on every viewport), so an
182 208 // existing site sees no change on update until the owner opts in.
183 209 'collapse_filters_on_mobile' => false,
@@ -218,8 +244,15 @@
218 244 'trip_category_base' => 'trip-category',
219 245
220 246 // SEO
221 247 'enable_sitemap' => true,
248 + // Which Yatra content types appear in /yatra-sitemap.xml. Defaults to
249 + // every type, so a site that never touches this keeps today's sitemap.
250 + 'sitemap_types' => ['archive', 'trip', 'destination', 'activity', 'category'],
251 + // Opt-in, and deliberately separate from the list above: dropping a type
252 + // from the sitemap is housekeeping, while noindex de-indexes pages that
253 + // may currently rank. That should never happen as a side effect.
254 + 'sitemap_noindex_excluded' => false,
222 255
223 256 // Advanced
224 257 'enable_debug_mode' => false,
225 258 'delete_data_on_uninstall' => false,
@@ -303,12 +336,17 @@
303 336 }
304 337
305 338 /**
306 339 * Get booking form configuration (merged with defaults)
307 - *
340 + *
341 + * @param int|null $tripId Trip being booked. When given, Pro's Dynamic Form
342 + * Field module resolves each section's per-trip
343 + * conditions for that trip (title, description and
344 + * field list); without it the full config is
345 + * returned, conditions included (the Settings editor).
308 346 * @return array
309 347 */
310 - public static function getBookingFormConfig(): array
348 + public static function getBookingFormConfig(?int $tripId = null): array
311 349 {
312 350 $saved_config = self::get('booking_form_config', []);
313 351 $default_config = self::getDefaultBookingFormConfig();
314 352
@@ -313,9 +351,9 @@
313 351 $default_config = self::getDefaultBookingFormConfig();
314 352
315 353 // If no saved config, return defaults (Pro may filter)
316 354 if (empty($saved_config)) {
317 - return apply_filters('yatra_booking_form_config', $default_config);
355 + return apply_filters('yatra_booking_form_config', $default_config, $tripId);
318 356 }
319 357
320 358 // Merge saved over defaults. IMPORTANT: `fields` is a positional list,
321 359 // so a naive array_replace_recursive() merges field-by-INDEX — which
@@ -405,9 +443,9 @@
405 443 $merged[$form_type] = $saved_section;
406 444 }
407 445 }
408 446
409 - return apply_filters('yatra_booking_form_config', $merged);
447 + return apply_filters('yatra_booking_form_config', $merged, $tripId);
410 448 }
411 449
412 450 private static function isEmailIdentityKey(string $key): bool
413 451 {
@@ -1042,8 +1080,16 @@
1042 1080 'scheduled_payment_days' => 15,
1043 1081 'scheduled_payment_installments' => 1,
1044 1082 'scheduled_payment_interval' => 30,
1045 1083 'scheduled_payment_reminder_days' => 3,
1084 + // Anchor for the remaining-balance schedule:
1085 + // 'booking' (default, backward-compatible) → balance charged
1086 + // scheduled_payment_days after the deposit.
1087 + // 'tour' → balance charged/collected balance_due_days BEFORE the
1088 + // tour start date, and bookings made within that window
1089 + // must pay in full up front.
1090 + 'balance_anchor' => 'booking',
1091 + 'balance_due_days' => 14,
1046 1092 ];
1047 1093 }
1048 1094
1049 1095 private static function isScheduledPaymentSetting(string $key): bool