Yatra — Complete Changelog ========================== The most recent releases are shown in the plugin readme (readme.txt). This file is the complete version history. = 3.0.13 — 21 July 2026 = * **Star ratings now match the number shown:** a 4.9 average drew four-and-a-half stars beside the printed "4.9". Ratings round to the nearest half star everywhere — trip pages, the reviews block, listing cards and the booking confirmation all draw the same rating identically. * **Dashboard occupancy is no longer stuck at 0%:** the dashboard ignored the capacity figures the departures list actually returns, so every tour showed 0% occupied and available seats could read as a negative number, while the individual trip page calculated it correctly from the same departures. * **Departures honour the seats set on a time slot:** a private tour whose vehicle holds 9 passengers but sells a single booking unit per departure still showed 9 available. Capacity defined on a time slot is now used everywhere it applies, and where a date has several departure times each one uses its own seat count instead of the day's total. * **Sold-out dates no longer accept bookings:** a date marked sold out could still be booked, because the seat check looked past the sold-out record and fell back to the tour's overall capacity. Sold-out dates are now refused at checkout, or offered as a waitlist where the waitlist is enabled. * **Choose how sold-out dates appear:** a new *Show sold-out dates* option under Settings → Booking. Leave it on to keep them on the calendar marked "Sold out" (needed for the waitlist), or turn it off to hide them entirely, the way blocked dates are hidden. Existing sites are unchanged. * **Dates marked unavailable are hidden and unbookable:** an unavailable date stayed visible and could still be booked, unlike blocked, closed and cancelled dates. * **Manual payments recorded the wrong currency:** a payment added by hand was saved as USD regardless of the store currency, so a euro shop saw dollar amounts sitting beside correctly-formatted euro ones. Existing payment records are left as they are; new ones follow the store currency. * **Payment methods are labelled consistently:** the Payments list printed whatever each record happened to store, so gateway payments showed "paypal" while hand-entered ones showed "PayPal" or "Credit Card". Every row now shows the gateway's proper name. * **Changing the number of participants is saved:** editing the traveller count on an existing booking had no effect — the booking was saved with the original count, because the number was read from the traveller list rather than the field. Changing it now adds or removes traveller entries to match. * **Confirming a booking from the edit screen sends the confirmation email:** moving a booking to Confirmed from the booking editor saved the status but sent nothing and triggered no automation, while doing the same from the status action worked. Both routes now behave identically — and cancelling from the editor releases the seats, which it previously did not. * **Backend bookings reduce availability on tours with several departures a day:** a booking added from the admin never said *which* departure it was for, so on a tour running more than one departure a day it reserved no seats and the frontend still showed the date as free. The booking screen now asks for the departure time whenever the chosen date runs more than one, and the seats come off that departure. * **Invoices and vouchers show the complete business address:** only the street line was printed, so the town, postcode and country were missing from every document. All the address fields you have filled in are now included. * **The dashboard no longer goes blank:** a payment with no date threw an error that took the whole dashboard down with it. Dates that are missing or unreadable now simply render as "-" anywhere in the admin. * **Choosing a trigger event when creating an email template:** the template panel showed the event as a read-only badge with nothing to change it, directly beneath text asking you to pick one. It is now a working dropdown listing every available event. = 3.0.11 — 20 July 2026 = * **Departures now honour your recurring availability rule:** a tour with a 9-seat vehicle but a rule allowing only **1 booking per date** showed 9 under Departures. Overlapping rules were resolved in an arbitrary order (every rule carries the same priority), so the wrong one could win and the display fell back to the tour's passenger capacity. Rule matching is now deterministic — the most recently created rule wins a tie — and rules created in the editor are read correctly everywhere. * **Departures can be deleted again:** deletion always failed with *"Manual departures or departures with bookings cannot be deleted"*, even for an empty, auto-created departure. The check required an internal value the plugin never actually stores, so **no** departure was ever deletable. A departure can now be removed once no bookings remain — checked against the real booking records rather than a counter that can drift — and departures with bookings are still protected. * **Dashboard occupancy is no longer 0%:** the dashboard counted only departures inside the selected date range, which excluded the upcoming departures the figure is about, while individual trip pages calculated it correctly. * **Guest selector on sold-out dates:** the traveller selector stayed usable on a fully booked departure and allowed more guests than the tour's capacity. A sold-out date now starts at 0 with the controls disabled, and the maximum always reflects the seats actually left. * **Bulk actions no longer report the wrong thing:** choosing departures and pressing Apply without picking an action said *"Please select departures and a bulk action first"*, pointing at the selection rather than the missing action. Each message now names the input that is actually missing (also fixed on Rules, Items, Item Types, Itinerary and Email Templates). * **Star ratings on the booking confirmation:** half stars never appeared, so a 4.5 rating rendered as 4 solid stars next to the text "4.5". Trip pages and the confirmation page now round identically. * **Administrators can change a customer's email address:** editable from the customer screen. If the customer can sign in, a confirmation link is sent to the new address and the change applies once confirmed (matching WordPress); customers without an account are updated immediately. * **Invoices show full addresses:** the customer's postal address is included, and a multi-line company address keeps its line breaks instead of collapsing onto one line. * **Invoices respect your number and currency settings:** amounts previously always printed as `$1,234.56`, ignoring the configured decimal separator, thousands separator, decimal places and symbol position. Vouchers and itineraries were corrected too. * **Invoices reflect the payment status:** after an offline payment the invoice stayed *Payment Pending* with nothing paid and the full amount due. Marking a booking paid now settles the amounts and records the payment, so the invoice reads Paid with a zero balance. * **Customised admin emails are used again:** when a payment arrived the customer received their customised template but the administrator still got the built-in default. Every core email type can now be overridden. * **Bank transfer details on invoices are translatable:** they reuse the same translations as the booking confirmation page, so translating once covers both. * **Bank details on the booking confirmation are aligned** with every other row. * **Payment status can be changed from the bookings list:** an Actions entry for Paid, Partially Paid, Pending and Refunded — useful for bank transfers and other payments received by hand. Marking a booking paid also records it in Payments, so a later payment cannot overwrite it. * **Always-BCC and per-template CC/BCC:** archive or monitor outgoing mail with a site-wide blind copy, plus optional CC/BCC on any individual template. Nothing is copied until you enter an address. * **Country flags in every country selector**, including a search box, on checkout and in the admin. * **Invoice, voucher and itinerary branding:** the White Label module can now supply a company logo and header colour for generated documents. * **Separate "Partial Payment Received" email:** an optional template with its own wording and remaining-balance details, used only when deposits or partial payments are enabled and the template is switched on. * Fixed several smaller issues: hidden PHP notices on the departures and customers screens, hardcoded `$` in discount labels and deposit messages, a To address with several recipients being silently mangled, team invitations bypassing SMTP settings, and an admin bundle that could never be cached by the browser. = 3.0.10 — 15 July 2026 = * **Tour review structured data (SEO) — fixed the Google Search Console errors:** GSC reported *"Invalid object type for field <parent_node>"*, *"Missing field author"* and *"Missing field itemReviewed"* on tour pages. The cause was the review Microdata — the AggregateRating was nested in a `TouristTrip` (a type Google doesn't support for review snippets), and the whole reviews section was marked as one `Review` with no author/itemReviewed. Microdata can't express this correctly here (the rating is in the hero, the reviews are a separate section, so they can't share one valid parent node), so review structured data is now emitted as **JSON-LD** — Google's recommended format — centrally for every tour page: a `Product` with the tour name, `aggregateRating`, and a `review[]` array where each review carries `author` (Person), `reviewRating`, `reviewBody`, `datePublished` and the review title. The broken Microdata was removed. Tours without reviews keep their previous schema (no incomplete-Product markup). The JSON-LD is `\u`-escaped so review text can never break out of the `