=== FlexiRes Booking Integration ===
Contributors: kaukosiren
Tags: booking, reservations, scheduling, api, calendar
Requires at least: 6.5
Tested up to: 7.2
Requires PHP: 8.2
Stable tag: 1.62.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

A flexible API-driven booking system integration for WordPress.

== Description ==

FlexiRes Booking Integration is a powerful, API-first reservation and scheduling system designed for complex needs, such as managing resources (vehicles, rooms, staff) across multiple locations. 

This plugin acts as a lightweight frontend and management dashboard that connects directly to your dedicated FlexiRes FastAPI backend.

### Features
* **Single Page Application (SPA) Dashboard:** Manage bookings, resources, services, and availability directly from the WordPress admin without page reloads.
* **Frontend Booking Calendar:** A fast, responsive booking calendar embedded via shortcode `[flexires_booking]`.
* **My Bookings Portal:** Customers can view, reschedule, or cancel their own bookings using the `[flexires_my_bookings]` shortcode.
* **Webhook Support:** Automatically sends confirmation, reschedule, and reminder emails to customers via WordPress `wp_mail()`.
* **Advanced Resource Management:** Support for capacity limits, minimum/maximum participants, dynamic availability, and buffer times.
* **Custom Booking Fields & Schema Builder:** Define custom fields per service/slot with full multi-language translations (fi, en, sv, es, et, de).
* **Event Roster & CSV Export:** View detailed participant list directly from the admin calendar/dashboard and export custom fields data as CSV.
* **Tenant Switcher:** Switch between multiple locations/tenants seamlessly from the sidebar with a single user account.

== Installation ==

1. Upload the `flexires-wp` plugin to the `/wp-content/plugins/` directory, or install the generated `.zip` file through the WordPress plugins screen.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Navigate to **FlexiRes -> Settings** in the admin menu.
4. Enter your FlexiRes FastAPI Base URL and your API Key.
5. Save changes.
6. Use the `[flexires_booking]` shortcode on any page or post to display the booking calendar.

== Frequently Asked Questions ==

= Do I need a separate backend? =
Yes. This plugin requires a running instance of the FlexiRes FastAPI backend to function. It does not store booking data in the WordPress database.

= How do emails get sent? =
The FlexiRes backend triggers webhooks to this plugin, which then uses the standard WordPress `wp_mail()` function to send emails. It is highly recommended to use an SMTP plugin (like WP Mail SMTP or FluentSMTP) for reliable email delivery.

== Screenshots ==

1. The SPA Management Dashboard in WordPress Admin.
2. The frontend booking calendar.

== Changelog ==

= 1.60.5 =
* Uutta: Suora viestien lähetys valituille varauksille ja osallistujille (Bulk Actions: Lähetä viesti).
* Uutta: Tuki viestien personointikentille ({customer_name}, {service_name}, {start_time}) ja toimitus WordPress-sähköpostilokiin (Email Log).

= 1.60.4 =
* Uutta: Olemassa olevan varauksen hallinnassa ([flexires_my_bookings] sähköpostilinkillä / fr_token) lisäkenttien tiedot ovat suoraan katseltavissa ja muokattavissa.
* Uutta: Lisäpalveluiden hallinta varauksenhallinnassa: paikan päällä maksettaville varauksille lisäpalveluita voi vapaasti lisätä, vähentää tai poistaa. Verkkomaksulla maksetuille varauksille voi lisätä lisäpalveluita ja maksaa ne suoraan verkossa checkout-ohjauksella; jo maksettuja lisäpalveluita ei voi itsepalveluna vähentää tai poistaa.
* Uutta: Lisäpalveluiden hallinta WordPress-hallintapaneelissa (Services / Lisämyynti).

= 1.57.0 =
* Uutta: Viron (et) ja saksan (de_DE) käännökset; de_AT-, de_CH-, de_DE_formal- ja sv_FI-sivustot käyttävät saman kielen käännöstä.
* Korjaus: Noin 300 suomenkielistä lähdetekstiä vaihdettu englanniksi — englanninkielisillä sivustoilla ohjatut toiminnot, lahjakortin saldotarkistus, vuokrauslomake ja kategoriat näkyivät suomeksi.
* Korjaus: 96 puuttunutta merkkijonoa lisätty kaikkiin kieliin; 22 väärää suomennosta korjattu (mm. toistuva varaus).
* Korjaus: Hallinnan viikkonäkymä kaatui sivustoilla, joiden kieli sisältää alaviivan (sv_SE, es_ES, en_US, de_DE).
* Parannus: Sähköpostien päivämäärät sivuston kielellä; sähköpostipohjat myös virolle ja saksalle.
* Kehitys: build_wp_plugin.sh keskeyttää buildin, jos koodin merkkijono puuttuu käännöstiedostosta.
* Huom: Viron ja saksan valitseminen palvelujen sisältökieliksi vaatii backendin version 1.57.0 tai uudemman.

= 1.56.0 =
* Uutta: Toimialakohtaiset palvelukategoriat (liikunta, elämykset, vuokraus, tilat, majoitus, hyvinvointi, ajoneuvot, lemmikit, asiantuntijat jne.) ja julkisen palveluhakemiston tuki.
* Uutta: Takuu- ja panttimaksut (Security Deposits) — palvelukohtainen pantti, varausten panttien tilaseuranta ja pika-toiminnot (palautus / pidätys perusteluineen).
* Uutta: Matkamittarin ja käyttötuntien seuranta (Odometer & Engine Hours) — resurssien nykyiset mittarilukemat ja varausten alku-/loppulukemat automaattisella resurssin päivityksellä.
* Uutta: Palveluvelhon (Service Wizard) tuki uusille kentille (kategoria, panttimaksu, hakemistonäkyvyys).
* Uutta: Yritystietojen (Tenant) hakemistoasetukset: päätoimiala, kuvaus, varausosoite ja hakemistonäkyvyys.
* Huom: Vaatii backendin version 1.56.0 tai uudemman.

= 1.54.0 =
* Uutta: Älylukot & kulunvalvonta — ovikoodi ja kulkuohjeet välitetään automaattisesti vahvistussähköposteihin (`{access_code}`-paikkamerkki).
* Uutta: Liikuntaetujen palvelukohtainen kelpoisuus (TVL 69 §) — varauskassa näyttää maksutapoina vain palvelulle erikseen sallitut henkilöstöetutyypit (Liikunta, Kulttuuri, Hyvinvointi, Työmatka).
* Uutta: Hallintapohjien modulaarinen arkkitehtuuri (admin view templates) ylläpidettävyyden tehostamiseksi.
* Parannus: Yhteensopivuus varmistettu WordPress 7.2 saakka.
* Huom: Vaatii backendin version 1.54.0 tai uudemman.

= 1.53.0 =
* Uutta: Lisämyynti ja lisävarusteet (Add-ons & Extras) varauslomakkeella määrä- ja kertavalintoina monikantaisella ALV-erittelyllä.
* Uutta: Liikunta- ja henkilöstöetujen tuki (Epassi, Smartum, Edenred) paikan päällä kuitattavana maksutapana.

= 1.52.0 =
* Uutta: Sisäänrakennettu automaattinen päivitystarkistus ja ilmoituspalkki suoraan WordPressin hallinnassa flexires.fi-jakelukanavan kautta.
* Uutta: Monikielinen päivitysilmoitus (fi, en, sv, es).
* Parannus: Päivitetty viralliset tukilinkit osoitteeseen https://flexires.fi.

= 1.51.0 =
* Uutta: Lahjakorttimaksujen tuki varaus- ja vuokralomakkeilla (koodin tarkistus, reaaliaikainen saldon vähennys ja saldoerittely).
* Uutta: Uusi lyhytkoodi [flexires_gift_card_check] lahjakorttien saldon ja voimassaolon julkiseen tarkistukseen.
* Uutta: Kanta-asiakasohjelman ja palkintojen tuki: asiakkaan tasomerkki (Pronssi, Hopea, Kulta), saldo ja kertyvien pisteiden esikatselu sähköpostiosoitteen perusteella sekä palkintojen lunastus varausvaiheessa.
* Uutta: Reaaliaikainen verottoman nettohinnan ja ALV-osuuden laskenta sekä erittely varauslomakkeilla, vuokralomakkeella ja Omista varauksista.
* Huom: Vaatii backendin version 1.51.0 tai uudemman.

= 1.48.1 =
* Korjaus: [flexires_next_available] välittää asetukset nyt suoraan elementin data-na-opts-attribuutissa ja upotetussa skriptissä, mikä korjaa asetusten katoamisen ja "Aseta shortcodeen vähintään resource_id tai location_id" -virheen sivupohjissa ja välimuistia käyttävillä sivustoilla.

= 1.48.0 =
* Uutta: Moniresurssinäkymän visualisointi ja resurssikohtaiset pillerit viikkokalenterissa ([flexires_week_calendar]).
* Uutta: Viikkokalenterin dynaaminen palvelu- ja resurssisuodatinpalkki.
* Uutta: Tuki hour_person-hinnoitteluyksikölle (/ tunti / hlö).

= 1.47.0 =
* Uutta: Hintaportaiden hallinta WP-hallinnan palvelulomakkeessa (Kausihinnoittelu-osion perässä). Portaat luodaan, muokataan ja poistetaan suoraan lomakkeesta; tyypit muutos euroina (±€), muutos prosentteina (±%) ja kiinteä hinta (€). Monikielisessä tilassa portaan nimelle kielivälilehdet. Vain slot-palveluille ja tallennetulle palvelulle.
* Uutta: Hinnan esikatselu palvelulomakkeessa — ajankohta, kesto, osallistujat ja porras → erittely vaihe vaiheelta (perushinta, kausihinta säännön nimellä, tapahtumahinta, yksikkö, hintaporras) samasta laskennasta kuin asiakkaan varauksessa.
* Korjaus: Välimuistin tyhjennys (REST /flush-cache ja hallinnan painike) tyhjentää nyt myös sijaintilistan. Aiemmin varauslomakkeen sijaintivalikko näytti poistettuja sijainteja jopa 12 tuntia.
* Vaatii backendin 1.48.0 (API-avaimella toimivat porras- ja erittelyreitit).

= 1.46.1 =
* Korjaus: Välimuistin tyhjennys siirretty asetussivun valintaruudusta Debug-sivulle omaksi painikkeeksi (FlexiRes → Debug). Aiemmin WP ei laukaissut tallennushookia jos käyttäjä ruksitti pelkän välimuistiruudun eikä muuttanut mitään muuta kenttää, jolloin käyttöliittymä ilmoitti "Settings saved" mutta välimuisti ei tyhjentynyt. Uusi painike tyhjentää välimuistin aina, riippumatta asetusten tallennuksesta.

= 1.46.0 =
* Uutta: Varauslomakkeeseen lisätty hintaportaan valitsin, kun palvelulla on määriteltynä hintaportaita (esim. Jäsen / Ei-jäsen). Oletusporras on esivalittuna, ja hinta päivittyy lomakkeeseen valinnan mukaan.
* Portaaton palvelu ei näytä valitsinta lainkaan — lomake ja hinta pysyvät ennallaan.
* Valittu hintaporras näkyy varausvahvistuksessa.
* Käytösmuutos (backend 1.47.0): Kausihinnat vaikuttivat aiemmin vain vuokrakalenterin näytettyihin päivähintoihin, ei koskaan itse veloitukseen. Tästä versiosta lähtien kausihinnat vaikuttavat sekä aikaslotti- että vuokravarausten laskutettuun hintaan; vuokrauksessa kokonaishinta lasketaan päiväkohtaisten kausihintojen summana. Jos tenantilla on kausihinnat käytössä, laskutettavat summat muuttuvat — tarkista omat säännöt.
* Huom: Tämä versio vaatii backendin version 1.47.0 tai uudemman (hintaportaat, kausihinnoittelun korjaus veloitukseen).

= 1.45.0 =
* Uutta: Sähköpostiloki hallintapaneeliin (FlexiRes → Email Log). Jokainen lähetetty sähköposti kirjataan lokiin — asiakkaan ja omistajan viestit erikseen, lähetysajalla, varaus-ID:llä ja tilalla (Sent/Failed). Loki näyttää viimeiset 400 riviä, vanhimmat karsiutuvat automaattisesti. Epäonnistuneet lähetykset voi suodattaa näkyviin.
* Uutta: Omistajalle menneen varausilmoituksen voi lähettää uudelleen suoraan lokista yhdellä napilla, ilman että alkuperäinen lokirivi muuttuu — uudelleenlähetys luo aina uuden rivin.
* Korjaus: Omistajan "Uusi varaus" -ilmoitus ei enää jää lähettämättä, kun palvelulla on käytössä mukautettu asiakassähköpostipohja. Omistajailmoitus lähetettiin ennen vain oletuspohjan haarassa, joten mukautettua pohjaa käyttävien palvelujen omistajat eivät saaneet ilmoitusta lainkaan.
* Huom: Tämä versio vaatii backendin version 1.46.7 tai uudemman (webhook-payloadiin lisätty booking_id).

= 1.44.8 =
* Korjaus: Kilpailutapahtumavelho varoittaa nyt, jos kilpailu luodaan normaalille resurssille jonka aukioloaika kattaa kilpailun. Resurssia ei voi estää itseltään, joten normaali varaaminen jää auki: asiakkaat voivat varata radan kilpailun päälle eikä viikkokalenterissa näy kilpailusta mitään. Ratkaisu on luoda kilpailulle oma resurssi ja estää normaali resurssi.
* Huom: Tämä versio vaatii backendin version 1.44.13 tai uudemman.

= 1.44.7 =
* Uutta: Kilpailutapahtumavelhon vaiheessa 2 voit valita, estetäänkö normaalien resurssien käyttö vain kilpailun ajaksi vai koko kilpailupäiväksi. Koko päivän esto kattaa paikallisen vuorokauden keskiyöstä keskiyöhön — oikea valinta kun rata on poissa käytöstä myös rakentamisen ja purun ajan.
* Uutta: Velhon varoitukset noudattavat valittua kestoa. Koko päivän estolla listalle tulevat myös kilpailun ulkopuoliset saman päivän varaukset, jotka esto sulkisi.
* Huom: Tämä versio vaatii backendin version 1.44.12 tai uudemman.

= 1.44.6 =
* Uutta: Kilpailutapahtumavelhon vaihe 2 kattaa nyt resurssin valinnan. Voit luoda kilpailulle oman resurssin (sallii samanaikaiset ilmoittautumiset automaattisesti) tai käyttää olemassa olevaa. Samalla voit estää valittujen resurssien normaalin käytön kilpailun ajaksi.
* Uutta: Velho varoittaa jos valittu resurssi ei salli samanaikaisia varauksia tai sen kapasiteetti ei riitä osallistujamäärään — molempiin tarjotaan korjausta painikkeella. Varoittaa myös estettävän resurssin olemassa olevista varauksista ja samaan aikaan osuvasta toisesta kilpailusta.
* Korjaus: Käyttöohjeesta puuttui kokonaan resurssin valinnan merkitys. Osallistujarajat eivät yksin riitä: yhtäaikaisten ilmoittautujien määrää ohjaa resurssin kapasiteetti, ja vain jos resurssille on sallittu samanaikaiset varaukset.
* Huom: Tämä versio vaatii backendin version 1.44.11 tai uudemman.

= 1.44.5 =
* Korjaus: Ohjesivun kuvaus ennakkoaikojen ankkurivarauksesta vastaa nyt todellista toimintaa. Ohje väitti, että mikä tahansa varaus ennakkoaikaikkunan sisällä lyhentää ennakkoaikaa. Todellisuudessa ankkuri toimii saman päivän sisällä ja vapauttaa vain itseään myöhemmät ajat — maanantain varaus ei vaikuta tiistain ennakkoaikaan. Lisätty myös vinkki ajoittaa ankkurivaraus päivän alkuun.

= 1.44.4 =
* Parannus: Ohjesivun (FlexiRes → Help & Guide) tapahtumawidget-osio dokumentoi nyt kaikki `[flexires_event]`-parametrit, `start_time`-muodon aikavyöhykkeen offsetilla sekä `event_only`-vaihtoehdon. Mukana myös huomautus siitä, että ilman rajausta widget näyttää resurssin kaikki vapaat ajat, ja ohje vanhojen sivujen korjaamiseen.

= 1.44.3 =
* Korjaus: Kilpailutapahtumavelhon luoma sivu listasi kaikki resurssin vapaat ajat 60 päivän ajalta yhden kilpailun sijaan. Saatavuus lasketaan resurssin ja sijainnin kaikista aukiolosäännöistä, ei vain velhon luomasta rivistä, joten uusi kilpailupalvelu peri resurssin koko viikkoaikataulun. Velho lisää nyt shortcodeen ajankohdan, jolloin sivu näyttää täsmälleen sen kilpailun.
* Uutta: `[flexires_event]` sai parametrit `start_time` (rajaa yhteen ajankohtaan) ja `event_only` (näyttää vain ne ajankohdat joille on luotu kilpailutapahtuma — esim. cup-sarjan osakilpailut yhdellä sivulla). Ilman kumpaakaan widget toimii kuten ennen.
* Korjaus: Neljässä käännöksessä sama lause oli kahdentunut, jolloin osa viestistä näkyi raakana "%s"-merkintöineen.
* Huom: Tämä versio vaatii backendin version 1.44.10 tai uudemman (`include_events`-parametri).

= 1.44.2 =
* Korjaus (Important, korjauskierros 3): velho laski aikavyöhykkeen offsetin WP-sivuston asetuksista (`timezone_string`), mutta backend tulkitsee tapahtuman saatavuusrivin toimipisteen (tenantin) aikavyöhykkeessä. Jos sivusto ja toimipiste ovat eri vyöhykkeillä, tapahtuman hinta ja lisäkentät katoaisivat hiljaa täsmälleen samalla kuviolla kuin 1.44.1:n korjaama N1-regressio. Velho lukee vyöhykkeen nyt toimipisteeltä (`GET /tenant/me`, välimuistitettu 12 h `FlexiRes_API_Client::get_tenant()`illa), sivuston oma vyöhyke on vain varajärjestely jos haku epäonnistuu.

= 1.44.1 =
* Korjaus (Critical, korjauskierros 2): velhon lähettämä aika johti tilanteeseen jossa julkinen ilmoittautumislomake ei koskaan löytänyt tapahtuman pakollisia lisäkenttiä ja varaus hylättiin 422:lla — kilpailuun jolla oli pakollinen lisäkenttä ei voinut ilmoittautua lainkaan. Juurisyy oli backendissä (ks. backendin CHANGELOG, korjattu samalla), mutta korjauskierros varmisti myös että velho lähettää ajan aina aikavyöhykkeen kanssa, jotta sama merkkijono ei voi enää tarkoittaa kahta eri hetkeä eri päätepisteille.
* Muutos: velhon `start_time`/`end_time` sisältävät nyt aina UTC-offsetin (esim. `+03:00`), laskettuna sivuston aikavyöhykkeelle (`get_option('timezone_string')`) tapahtuman omalle päivälle — DST huomioitu. `frEwiz.timezone` (poistettu käyttämättömänä 1.44.0:ssa) on palautettu ja on nyt oikeasti käytössä.

= 1.44.0 =
* Korjaus: Kilpailutapahtumavelho — vaiheiden 3–5 edistymispalkin otsikot vastasivat vääriä vaiheita ("3. Hinnoittelu" näytettiin osallistujarajojen kohdalla jne.). Korjattu vastaamaan todellista järjestystä (3. Osallistujarajat, 4. Hinnoittelu, 5. Ilmoittautumiskentät).
* Korjaus: `[flexires_event]` ei koskaan renderöinyt tapahtuman ilmoittautumiskenttiä, vaikka velhon vaihe 5 tallensi ne — julkinen lomake kysyi vain nimeä, sähköpostia, puhelinta ja osallistujamäärää. Kentät haetaan ja renderöidään nyt samalla `flexires_get_effective_fields`-kutsulla kuin `[flexires_booking]`-lomake käyttää.
* Korjaus: uuden kilpailun kesto oletti aina kiinteän arvon riippumatta valitusta aikaikkunasta, jolloin saatavuus saattoi pilkkoutua useaksi ajankohdaksi. Kesto johdetaan nyt aina velhon aikaikkunasta (loppuaika − alkuaika); kestokenttä poistettu vaiheesta 1. Olemassa olevalla palvelulla ikkunan on nyt vastattava palvelun kestoa, ja velho estää etenemisen ennen lähetystä jos ei vastaa.
* Korjaus: uuden kilpailun väripohja (`<input type="color">`) ei koskaan käyttänyt backendin `#0073aa`-oletusta, koska selain antaa tyhjälle värikentälle aina `#000000`. Kentälle asetettu oletusarvo.
* Korjaus: osallistujia vähintään -kentän tyhjä arvo lähetettiin backendille nollana (`min_participants: 0`), jolloin backend palautti 422:n suoraan ilman selkeää virhettä. Kentän minimi ja tyhjän arvon fallback ovat nyt 1.
* Uutta: velhon tulosnäkymään lisätty linkki lisäosan omaan varausnäkymään ("Näytä varaukset"), jotta luodun tapahtuman varaukset löytyvät luonnin jälkeen ilman erillistä navigointia.
* Siivous: käyttämätön `frEwiz.timezone`-muuttuja poistettu velhon skriptistä.
* Huom: Tämä versio vaatii backendin version 1.44.8 tai uudemman (velhon aikavyöhyke- ja aikaikkunakorjaukset).

= 1.43.0 =
* Uutta: Kilpailutapahtumavelho viimeistelty — velho luo palvelun, resurssilinkin, saatavuuden ja tapahtumakonfiguraation yhdellä backend-kutsulla (`POST /events/wizard`) ja voi luoda samalla WordPress-sivun, jonka sisältönä on tapahtuman shortcode. Jos sivun luonti epäonnistuu tapahtuman luonnin jälkeen, velho näyttää onnistumisen varoituksen kera ja shortcoden kopioitavaksi käsin — näin käyttäjä ei yritä ajaa velhoa uudelleen samalle ajankohdalle (mikä palauttaisi virheen).
* Huom: Tämä versio vaatii backendin version 1.44.7 tai uudemman (`/events/wizard`-rajapinta).

= 1.42.0 =
* Muutos: Tilastot-välilehden luvut laskettiin selaimessa 500 uusimmasta varauksesta koko historian ajalta, ja Tuotto-summaan kelpuutettiin kaikki paitsi perutut — myös odottavat, no-show:t ja tulevat varaukset. Luku poikkesi siksi merkittävästi hallintaportaalin luvusta. Koko välilehti hakee luvut nyt backendistä samalla laskennalla kuin portaali: kuluva vuosi 1.1. → tänään, tuotto vain vahvistetuista ja valmiista varauksista. 500 varauksen katto poistui ja käytetty aikaväli näkyy välilehden yläreunassa.
* Muutos: Viikonpäiväkaavio alkaa maanantaista (aiemmin sunnuntaista) ja kuukausikaavio näyttää kuluvan vuoden (aiemmin 12 kk taaksepäin).
* Uutta: Varauslistan oletusjärjestys on nyt tulevat varaukset nousevassa aikajärjestyksessä — seuraavaksi alkava ensimmäisenä. Listan yläpuolelta voi valita aikajakson (tulevat / menneet / kaikki), palvelun ja järjestyksen. Valinnat säilyvät istunnon ajan.
* Huom: Tämä versio vaatii backendin version 1.44.2 tai uudemman (Tilastot-välilehti ja varauslistan aikajaksosuodatin käyttävät uusia rajapintaparametreja).

= 1.41.15 =
* Korjaus: Osallistujamäärä palautuu palvelun minimiin, kun varauslomakkeella vaihdetaan palvelua.

= 1.41.14 =
* Uusi: Varauksen lisäkentät tuettu myös hallintapaneelin kautta tehtävissä varauksissa.
* Korjaus: Viikkonäkymän aikavyöhyke- ja parametrivirheet.
* Parannus: Viikkonäkymän vieritys ja käytettävyys mobiilissa.

= 1.41.13 =
* Ylläpito: Lisäosan uudelleenpaketointi.

= 1.41.12 =
* Korjaus: Ohjeet-sivun markdown-muunnin korvasi tavallisen luvun (esim. "noin 35 minuutissa") virheellisesti tekstillä "undefined" — koodinpätkien paikkamerkki törmäsi tavallisiin, välilyönnein ympäröityihin lukuihin. Korjattu käyttämään törmäämätöntä paikkamerkkiä.

= 1.41.11 =
* Korjaus: FlexiRes → Ohjeet -sivulta puuttui kokonaan verkkomaksuja koskeva osio (Stripe/Paytrail/Klarna/Visma Pay/PayPal) — lisätty uusi "8c. Verkkomaksut" -osio.

= 1.41.10 =
* Korjaus: paluu-URL-siivous laajennettu kattamaan myös Visma Payn varaamat paluuparametrit (RETURN_CODE, ORDER_NUMBER, AUTHCODE, SETTLED, INCIDENT_ID, CONTACT_ID) — sama korjaus kuin PayPalille ja Klarnalle aiemmin.

= 1.41.9 =
* Parannus: paluu-URL-siivous laajennettu kattamaan myös PayPalin ja Klarnan varaamat paluuparametrit (token, PayerID, klarna_order_id) — sama korjaus kuin Paytrailille aiemmin.

= 1.41.8 =
* Parannus: peruutuksen hyvitysilmoitukseen (sähköposti ja sivu) lisätty maininta, että jos asiakas saa erillisen sähköpostin maksunvälittäjältä, hänen tulee seurata sen ohjeita hyvityksen loppuunsaattamiseksi (Paytrailin sähköpostitse toimitettava hyvitys ei ole muuten ilmeinen asiakkaalle).

= 1.41.7 =
* Korjaus: peruutuksen jälkeen näkyi virheellisesti "Booking successful!" hallintalinkin (sähköposti) kautta peruttaessa — käytti väärää käännösavainta. Todellinen syy siihen ettei hyvitystä näkynyt lainkaan (varsinainen Paytrail-hyvitys epäonnistui hiljaisesti) korjattu backendissä.

= 1.41.6 =
* Korjaus: Omat varaukset -sivulta (my-bookings) tehty peruutus ei kertonut asiakkaalle maksun hyvityksestä — ei sivulla eikä sähköpostissa. Hyvitetty summa välittyy nyt admin-peruutuksen webhookista sähköpostiin ja sivulla näytetään "Hyvitys X € on palautettu alkuperäiselle maksutavalle" -ilmoitus.

= 1.41.5 =
* Korjaus: Paytrailin paluuparametrit siivotaan paluu-URLista ja selaimen osoiteriviltä.

= 1.41.4 =
* Ylläpito: Maksuihin liittyvät tekstit yleistetty maksunvälittäjäriippumattomiksi.

= 1.41.3 =
* Uusi: Hyvitys näkyy asiakkaalle peruutuksen yhteydessä.

= 1.41.2 =
* Korjaus: Maksupolku toimii kaikissa varauswidgeteissä.

= 1.41.1 =
* Korjaus: Tapahtumawidgetin vahvistuskynnyksen luku näkyy aina ajantasaisena.

= 1.41.0 =
* Uusi: Stripe Checkout -maksuvirta varauslomakkeisiin.

= 1.39.0 =
* Uusi: FlexiRes → Help & Guide -ohjesivu WordPressin hallintapaneeliin.

= 1.38.0 =
* Korjaus: Viikkokalenterin korjauksia.
* Uusi: Admin-kenttä varauslomakkeella.

= 1.37.0 =
* Uusi: Ankkurivaraus — "ensimmäisen varauksen ennakkoaika" (`first_booking_advance_minutes`). Kun resurssilla ei ole varauksia lähiaikoina, uusilta varauksilta vaaditaan pidempi ennakkoaika; heti kun ankkurivaraus löytyy, riittää normaali lyhyempi ennakkoaika.

= 1.36.7 =
* Uusi: Varauksen lisätietokentät (booking fields) näkyvät nyt vahvistussähköpostissa.

= 1.36.6 =
* Lisätty: Ennakkovarausikkunan yhteenvetotekstit käännetty fi, sv, es -kielille (.po-tiedostot).

= 1.36.5 =
* Korjaus: Ennakkovarausikkunan yhteenvetopalkki ei näkynyt — virheellinen lomakkeen ID (fr-service-form → form-add-service).

= 1.36.4 =
* Parannus: Ennakkovarausikkunan yhteenvetotekstit lokalisoitu frAdminI18n-objektin kautta (fi/en).

= 1.36.3 =
* Uusi: Palvelun muokkausmodaliin live-yhteenveto ennakkovarausikkunasta — näyttää varattavissa olevan aikaikkunan ja varoittaa jos asetukset ovat ristiriitaiset.
* Uusi: Tallennus estetään jos ennakkovarausaika ylittää max. ennakkovarausajan (ei varausikkunaa).

= 1.36.2 =
* Korjaus: Viikkokalenterin varausmodal saattoi lähettää virheellisen osallistujamäärän jos sama modal oli aiemmin käytetty eri palvelulle (arvo ei klampannut maxP-rajaan).
* Korjaus: [flexires_booking] -shortcode lähetti participants-parametrin väärällä nimellä (participants → participants_count).

= 1.36.1 =
* Uusi: Varauksen lisäkentät (booking fields) tuettu myös [flexires_next_available] ja [flexires_rental] -shortcodeissa.
* Parannus: Viikkokalenterin varausmodalin lisäkenttien label-tekstit erottuvat nyt selkeästi tummemmalla värillä.

= 1.36.0 =
* Uusi: Tenant switcher -tuki — ylläpitäjä voi nyt vaihtaa toimipisteiden (tenanttien) välillä yhdellä tunnuksella.
* Uusi: Superadmin-näkymän parannukset (Webhook-virheiden seuranta ja Webhook-osoitteen suora muokkaus).
* Uusi: Varauksen lisäkentät (booking fields) tuettu nyt myös [flexires_week_calendar] -shortcodessa — kentät näytetään varausmodalissa ja arvot lähetetään backendiin.
* Korjaus: Superadmin paneelikäyttäjien tenant-kytkentöjen määritys ja listauksen virhekorjaukset.
* Parannus: Varauksen lisäkenttien ja rosterin (osallistujalistan) parempi tuki ja dokumentointi.
* Parannus: Admin-portaalin tumman tilan (dark mode) tekstikontrastin parannukset ja dynaamiset help-painikkeet (?) kenttien selitteille.


= 1.35.1 =
* Korjaus: Varauslomakkeen lisäkenttien labelit näkyivät "undefined":na kun sivun kieli oli "fi-FI"-muodossa (esim. suomenkieliset WP-asennukset). `_frPageLang` normalisoitu aina 2-kirjaimiseksi koodiksi.

= 1.35.0 =
* Uusi: Varauksen lisäkenttien hallinta (Schema Builder) palvelun muokkausnäkymässä ylläpito-SPA:ssa.

= 1.34.0 =
* Uusi: Lisätiedot ja erikoiskentät (Custom Booking Fields) karting- ja kilpailutoimintoja varten.
* Parannus: Yhteensopivuus ja automaattinen synkronointi aikaslottikohtaisten lisätietokenttien kanssa.

= 1.33.0 =
* Parannus: Empty state -näkymän uudet saatavuuspainikkeet ja service card -info.

= 1.28.0 =
* Uusi: [flexires_event] -shortcode — yksinkertainen ilmoittautumiswidget kertataphtumille ja toistuvaisille tapahtumille
* Korjaus: [flexires_booking] näyttää nyt alku- ja lopetusajan jokaisessa aikaslotissa
* Korjaus: service ja resource -valinnat piilotetaan automaattisesti kun ne on annettu shortcoden parametreissa

= 1.27.0 =
* Korjaus: Lisätty puuttuva Saatavuus-vaihe wizardiin — wizard luo nyt myös Availability-säännön backendiin, jolloin kalenteri näyttää vapaat ajat.
* Korjaus: Uuden varaussivun shortcode sisältää nyt palvelun, resurssin ja sijainnin ID:t.
* Korjaus: FlexiRes_Service_Wizard instantioidaan oikein kerran flexires-wp.php:ssä.

= 1.26.0 =
* Uusi: Palvelun luonti -velho (Lisää palvelu) — ohjattu vaiheistus sijainnin, resurssin ja palvelun luontiin sekä WordPress-sivujen automaattiseen luontiin.

= 1.0.0 =
* Initial release. Features include booking calendar, admin management SPA, webhooks, and i18n support.