PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.17
Yatra – Travel Booking & Tour Operator Software v3.0.17
3.0.17 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 All 85 releases
← All changes | app/Services/SettingsService.php +54 -6 3.0.13 → 3.0.17 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
@@ -160,9 +171,18 @@
160 171 'email_template_admin_scheduled_payment_failed' => true,
161 172 'email_template_enquiry_received' => true,
162 173 'email_template_enquiry_admin' => true,
163 174 'email_template_enquiry_response' => true,
164 - 'email_template_review_request' => true,
175 + // Off by default, unlike the other templates. A review request is the
176 + // one transactional email that is not a response to something the
177 + // customer just did, and several jurisdictions treat it as advertising
178 + // rather than service mail — in Germany the BGH (VI ZR 225/17) holds it
179 + // needs prior consent, and the existing-customer exemption in
180 + // §7 Abs. 3 UWG does not cover it. Shipping it on would have every new
181 + // site mailing customers for consent it has not collected, so the
182 + // operator turns it on once they have decided how they collect it.
183 + // Sites that already have it on are untouched.
184 + 'email_template_review_request' => false,
165 185 'email_template_abandoned_booking_recovery_first' => true,
166 186 'email_template_abandoned_booking_recovery_second' => true,
167 187 'email_template_abandoned_booking_recovery_final' => true,
168 188 // Customer-registration gate (AuthController::register reads
@@ -187,8 +207,12 @@
187 207 'search_show_destination' => true,
188 208 'search_show_activities' => true,
189 209 'search_show_duration' => true,
190 210 'search_show_budget' => true,
211 + // Opt-in (default false): show a date field that filters trips to those
212 + // with a departure on the selected date. Off by default so existing
213 + // search bars are unchanged on update.
214 + 'search_show_date' => false,
191 215 // Collapse the listing filter sidebar sections on mobile. Default false
192 216 // = today's behaviour (all sections expanded on every viewport), so an
193 217 // existing site sees no change on update until the owner opts in.
194 218 'collapse_filters_on_mobile' => false,
@@ -203,9 +227,13 @@
203 227 'require_booking_to_review' => false,
204 228 'auto_approve_reviews' => false,
205 229 'enable_review_moderation' => true,
206 230 'minimum_rating' => 1,
207 - 'review_reminder_days' => 7,
231 + 'review_reminder_days' => 3,
232 + // Never ask about a trip that ended longer ago than this. The
233 + // reminder is anchored to the tour's end date, so a backlog of
234 + // bookings completed late is skipped rather than mailed in bulk.
235 + 'review_reminder_max_age_days' => 14,
208 236
209 237 // Tax
210 238 'enable_tax' => false,
211 239 'tax_rate' => 0,
@@ -229,8 +257,15 @@
229 257 'trip_category_base' => 'trip-category',
230 258
231 259 // SEO
232 260 'enable_sitemap' => true,
261 + // Which Yatra content types appear in /yatra-sitemap.xml. Defaults to
262 + // every type, so a site that never touches this keeps today's sitemap.
263 + 'sitemap_types' => ['archive', 'trip', 'destination', 'activity', 'category'],
264 + // Opt-in, and deliberately separate from the list above: dropping a type
265 + // from the sitemap is housekeeping, while noindex de-indexes pages that
266 + // may currently rank. That should never happen as a side effect.
267 + 'sitemap_noindex_excluded' => false,
233 268
234 269 // Advanced
235 270 'enable_debug_mode' => false,
236 271 'delete_data_on_uninstall' => false,
@@ -314,12 +349,17 @@
314 349 }
315 350
316 351 /**
317 352 * Get booking form configuration (merged with defaults)
318 - *
353 + *
354 + * @param int|null $tripId Trip being booked. When given, Pro's Dynamic Form
355 + * Field module resolves each section's per-trip
356 + * conditions for that trip (title, description and
357 + * field list); without it the full config is
358 + * returned, conditions included (the Settings editor).
319 359 * @return array
320 360 */
321 - public static function getBookingFormConfig(): array
361 + public static function getBookingFormConfig(?int $tripId = null): array
322 362 {
323 363 $saved_config = self::get('booking_form_config', []);
324 364 $default_config = self::getDefaultBookingFormConfig();
325 365
@@ -324,9 +364,9 @@
324 364 $default_config = self::getDefaultBookingFormConfig();
325 365
326 366 // If no saved config, return defaults (Pro may filter)
327 367 if (empty($saved_config)) {
328 - return apply_filters('yatra_booking_form_config', $default_config);
368 + return apply_filters('yatra_booking_form_config', $default_config, $tripId);
329 369 }
330 370
331 371 // Merge saved over defaults. IMPORTANT: `fields` is a positional list,
332 372 // so a naive array_replace_recursive() merges field-by-INDEX — which
@@ -416,9 +456,9 @@
416 456 $merged[$form_type] = $saved_section;
417 457 }
418 458 }
419 459
420 - return apply_filters('yatra_booking_form_config', $merged);
460 + return apply_filters('yatra_booking_form_config', $merged, $tripId);
421 461 }
422 462
423 463 private static function isEmailIdentityKey(string $key): bool
424 464 {
@@ -1053,8 +1093,16 @@
1053 1093 'scheduled_payment_days' => 15,
1054 1094 'scheduled_payment_installments' => 1,
1055 1095 'scheduled_payment_interval' => 30,
1056 1096 'scheduled_payment_reminder_days' => 3,
1097 + // Anchor for the remaining-balance schedule:
1098 + // 'booking' (default, backward-compatible) → balance charged
1099 + // scheduled_payment_days after the deposit.
1100 + // 'tour' → balance charged/collected balance_due_days BEFORE the
1101 + // tour start date, and bookings made within that window
1102 + // must pay in full up front.
1103 + 'balance_anchor' => 'booking',
1104 + 'balance_due_days' => 14,
1057 1105 ];
1058 1106 }
1059 1107
1060 1108 private static function isScheduledPaymentSetting(string $key): bool