| @@ -3,8 +3,51 @@ | ||
| 3 | 3 | |
| 4 | 4 | The most recent releases are shown in the plugin readme (readme.txt). |
| 5 | 5 | This file is the complete version history. |
| 6 | 6 | |
| 7 | += 3.0.16 — 24 September 2026 = | |
| 8 | + | |
| 9 | +**Please read if you use reCAPTCHA.** With reCAPTCHA switched on for the booking form, checkout could not be completed on Stripe, Square or Authorize.net — the card form showed "reCAPTCHA verification failed. Please try again." and the payment never went through. Lowering the score threshold did not help, because no token was being sent at all. This release fixes that; if you turned reCAPTCHA off to take payments, you can turn it back on. | |
| 10 | + | |
| 11 | +**New** | |
| 12 | +* **Download a booking's invoice from the dashboard.** Bookings → ⋮ → *Download invoice*, and a *Download invoice* button on the booking detail, produce a PDF for the whole booking rather than for a single payment. Available to anyone who can view bookings. | |
| 13 | +* **Exclude a whole period from a recurring rule.** Trip → Availability → Recurring Rules gains **Excluded Periods**: give a first and last day and the rule skips everything in between, instead of adding a business vacation one day at a time. The existing single-date exclusions are unchanged and the two can be mixed. | |
| 14 | +* **Choose what goes in the sitemap.** Settings → SEO → *Content in the sitemap* lets you publish only the types you want — trips, destinations, activities, trip categories, listing pages. Leaving a type out of the sitemap does not stop search engines indexing it, so there is a separate, deliberately opt-in **Also add noindex to excluded types**. It is off by default, because switching it on removes those pages from search results. | |
| 15 | +* **Google Calendar controls** (with Yatra Pro). The Google Calendar screen gains *Resync Everything*, which walks every booking in batches and repairs the calendar in one click; an **Event reminders** editor so the 7/3/1-day reminders are no longer fixed; **Add customers as guests**, which keeps the customer's address off the event entirely so Google sends them no reminders or cancellations; and **One event per departure**, which puts every booking on the same departure into a single event with each booking's details in the description. The last one is off by default. | |
| 16 | + | |
| 17 | +**Fixed** | |
| 18 | +* **reCAPTCHA blocked checkout.** Gateways that handle the card themselves (Stripe here, Square and Authorize.net in Pro) submit the booking directly, so they never attached a reCAPTCHA token and the server rejected every attempt. Each now sends its own fresh token. The account-registration form on the booking page had the same gap and is fixed too. | |
| 19 | +* **Excluded dates were still bookable.** A date excluded from a recurring rule disappeared from the calendar but could still be booked by posting that date directly, because the resolver fell through to the trip's default availability. Excluded dates are now refused at checkout. An explicit availability row for that date, or another rule that generates it, still opens it as before. | |
| 20 | +* **Availability times were demanded for tours that have none.** Adding or editing an availability date on a single-day tour insisted on a start and end time even when the tour has no time slots configured, so the date could not be saved. Times are now required only for day tours that actually use time slots, arrival time is always optional, and every field says whether it is required. The capacity field also stops overwriting a value you have already typed, and its help text names the tour's own maximum. | |
| 21 | +* **Invoices and emails named the gateway, not its title.** Payment details showed the internal gateway id (`bank_transfer`) instead of the title your customers see at checkout ("Bank Transfer"). The payment invoice, the booking invoice, payment emails and the booking confirmation page now all use the checkout title, falling back to a readable version of the id for a gateway that no longer exists. | |
| 22 | +* The sitemap is rebuilt as soon as you change what it contains, instead of waiting up to an hour for its cache to expire. | |
| 23 | + | |
| 24 | += 3.0.15 — 7 September 2026 = | |
| 25 | +_With thanks to [Vista-Tours](https://vista-tours.de) for detailed testing and feedback._ | |
| 26 | + | |
| 27 | +**Please read before updating — three things start happening that did not before:** | |
| 28 | +* **Pre-trip reminder emails send again.** The reminder sweep was never scheduled and had no handler, and its booking query referenced a database column that does not exist, so no reminder has gone out. Both are fixed. Check the *Trip Reminder* template under Settings → Emails, or set *Booking Reminder (days)* to `0` to keep it off. | |
| 29 | +* **Unpaid bookings are cancelled automatically** after *Settings → Booking → Booking Expiry (hours)* (default 24) — that setting previously did nothing at all. Only bookings created after you update are ever expired, so your existing pending bookings are never cancelled retroactively. Expiring a booking now also releases its departure seat. Set the hours to `0` to disable. | |
| 30 | +* **Cancelling a booking now notifies your integrations.** `yatra_booking_cancelled` was never fired in-app, so Google Calendar kept cancelled bookings on the calendar and WhatsApp / webhook cancellation events never ran. Review those templates first. | |
| 31 | + | |
| 32 | +**New** | |
| 33 | +* **Day trips show hours.** A single-day tour with a duration in hours now reads "8 hours" instead of "1 Day" everywhere — trip cards, hero, quick facts, availability dates, checkout, the confirmation page and email, saved trips, and the voucher / itinerary PDF. | |
| 34 | +* **Configurable booking horizon.** *Settings → Booking → Booking horizon (months)* controls how far ahead customers can book (1–36, default 12); it was hard-coded to 12. | |
| 35 | +* **Quick status changes for enquiries.** The Enquiries list's ⋮ menu gains Mark as Completed / Closed / Spam, so an enquiry can be handled without opening it. | |
| 36 | +* **Auto-Confirm Bookings becomes a three-way choice** — don't auto-confirm, online payments only, or all. | |
| 37 | +* **Compact listing card layout** for trip archives, shortcodes and the Trip block. | |
| 38 | + | |
| 39 | +**Fixed** | |
| 40 | +* **Duration (Hours) can now be saved.** The trip form showed the field for single-day tours but never included it in the save request, so the value was dropped and the field reloaded empty — the new hours display could not be used. Switching a trip back to multi-day now clears any stored hours rather than leaving a stale value. | |
| 41 | +* Departures: *Upcoming* no longer hides sold-out departures; capacity is a separate **Availability** filter; the list is genuinely paginated and its search box works. | |
| 42 | +* Enquiries: the status tabs showed `0` for every count; the bulk *Mark as Completed* action silently did nothing; a submission containing a `subject` field returned a server error. | |
| 43 | +* The confirmation email is sent when a gateway payment auto-confirms a booking, and *Resend → Booking confirmation* resends the right template. | |
| 44 | +* Gateways honour the Auto-Confirm setting instead of always confirming. | |
| 45 | +* The "Payment not completed" notice can now be translated. | |
| 46 | + | |
| 47 | += 3.0.14.2 — 31 August 2026 = | |
| 48 | +* **Fresh installs now create the trips table correctly:** a semicolon inside a column comment broke the `wp_yatra_trips` table creation during dbDelta, so a brand-new install could end up without the trips table — the tour list and sample-data import then failed. Existing sites were unaffected; updating recreates the table automatically. | |
| 49 | + | |
| 7 | 50 | = 3.0.14.1 — 31 August 2026 = |
| 8 | 51 | * Declared compatibility with WordPress 7.1. |
| 9 | 52 | |
| 10 | 53 | = 3.0.14 — 31 August 2026 = |