=== Robina ===
Contributors: igor800
Tags: booking, appointments, calendar, scheduling, reservations
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 8.0
Stable tag: 1.1.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Free, open-source booking and appointments for WordPress: services, staff, locations, capacity-aware availability and optional payments.

== Description ==

Robina is a free, open-source booking and appointment plugin for WordPress, built for service businesses that want a capable booking system without subscription fees. It is service- and resource-centric: the bookable unit is a service with its own availability, while staff, locations and resources are optional layers you add only if you need them.

= Highlights =

* **Front-end booking widget (Vue 3).** A clean multi-step wizard — Service, Date & time, Details, Confirm — added to any page with the `[robina_booking_form]` shortcode, or as a popup button with `[robina_booking_button]`.
* **Capacity-aware availability.** Slots are computed from your business hours, slot step and buffers. Assign staff to a service and each one adds a parallel slot; a staff member booked anywhere counts as busy. With no staff, a service has a single capacity per location.
* **Group classes.** Give a service a capacity above 1 (say 20 or 40 — there is no upper limit) and several customers can book the same session until it fills up — ideal for classes, workshops and large group sessions.
* **Staff (optional).** Tag the people who provide a service, pin them to one or more locations, and give them their own weekly hours. When a customer picks a location, only the staff who work there are offered.
* **Locations (optional).** Offices or branches with their own optional weekly hours; each service declares where it is available.
* **Native WordPress admin.** A branded Catalog (services, categories, resources), a Month/Week/Day Calendar with in-place booking creation, plus Bookings, Customers, Staff and Locations screens — all in plain WordPress UI.
* **Email notifications** to the owner and the customer on every new booking.
* **Optional online payments** — Pay on site, WooCommerce, Stripe or PayPal (see "External services" below). Leave them all off for free bookings.
* **Self-contained and private.** No external CDNs and no trackers; the phone-input flags and every front-end asset ship inside the plugin. Uninstalling removes Robina's tables and options.

= Service-centric by design =

Robina deliberately keeps availability on the *service*, not on a mandatory "employee". Staff, locations and resources are optional capacity and scope layers, so Robina also suits non-staff models such as equipment rental or table booking.

== External services ==

By default Robina works entirely on your own site and contacts no third party. It only talks to an external service when **you, the admin, enable and configure a payment gateway**, and only when a customer actually chooses to pay with it. No data is sent anywhere otherwise — Robina has no "home" server and sends no telemetry or analytics.

**Stripe** — used only when you enable "Stripe" and enter your API keys. When a customer pays by card, Robina creates a Stripe Checkout Session and redirects the customer to Stripe's hosted payment page, and it receives Stripe webhooks to confirm payment. Data sent to Stripe: the booking amount, currency, a short description and the customer's email. Card details are entered on Stripe's site, never on yours.
Terms: https://stripe.com/legal — Privacy: https://stripe.com/privacy

**PayPal** — used only when you enable "PayPal" and enter your client ID and secret. When a customer pays with PayPal, Robina creates a PayPal order, redirects the customer to PayPal to approve it, then captures it on return. Data sent to PayPal: the booking amount, currency and a reference id.
Terms: https://www.paypal.com/legalhub/home — Privacy: https://www.paypal.com/legalhub/privacy-full

**WooCommerce** (optional, local) — if you enable WooCommerce checkout and WooCommerce is installed, Robina creates a pending WooCommerce order and hands payment off to WooCommerce. Robina makes no external call itself; any outbound requests are made by WooCommerce and its own gateways under their policies.

**Map link** — a location's address is turned into a plain "view on map" link to Google Maps (https://www.google.com/maps/search/...). It is only a link: nothing is transmitted and no map is loaded unless a visitor clicks it.

== Source code ==

Robina is fully open source (GPLv2+). The front-end widget is compiled with Vite from the Vue source that ships inside the plugin under `/resources`. The build files (`package.json`, `package-lock.json`, `vite.config.js`) are bundled too, so the compiled assets in `/assets/dist` can be regenerated from source with:

`npm install && npm run build`

Bundled third-party libraries (installed via npm, both MIT-licensed):

* Vue 3 (^3.4) — https://github.com/vuejs/core
* intl-tel-input (^29.0) — https://github.com/jackocnr/intl-tel-input

== Installation ==

1. Install the ZIP via Plugins → Add New → Upload Plugin, or upload the `robina` folder to `/wp-content/plugins/`.
2. Activate Robina through the Plugins screen.
3. Open **Robina → Settings** to set your business hours, timezone, currency, slot step and (optionally) payment methods.
4. Add services under **Robina → Catalog**. Add Locations and Staff too if you need them.
5. Put `[robina_booking_form]` on any page, or use `[robina_booking_button]` for a popup button.

== Frequently Asked Questions ==

= Do I have to add staff or locations? =
No. A service works on its own with a single capacity and your global business hours. Staff, locations and resources are optional.

= How does availability with several staff work? =
Each staff member assigned to a service adds one parallel slot. A staff member booked on any service at that time is treated as busy. When a customer picks a location, only the staff who work at that location are offered.

= Is payment required? =
No. With no payment method enabled, bookings are free. You can turn on Pay on site, WooCommerce, Stripe and/or PayPal at any time.

= Does Robina send my data anywhere? =
No telemetry, ever. The only outbound calls are to the payment gateway you choose to enable, at checkout — see "External services".

= Will it match my theme? =
Yes. The admin uses native WordPress UI, and the front-end widget inherits your theme font by default; colours and fonts are configurable.

== Screenshots ==

1. The front-end booking wizard — choosing a service.
2. Picking a date and a specialist, with live available times.
3. The admin Catalog — services and categories.
4. The admin Calendar — month view of bookings.
5. Settings — business hours, payments and form appearance.

== Changelog ==

= 1.1.1 =
* Fix: the booking wizard now formats the chosen date using your site's language (English by default) instead of the visitor's browser locale.

= 1.1.0 =
* New: per-service **capacity** (seats per session). Set it above 1 to turn a service into a group/class where several customers can book the same time until it is full; 1 keeps the usual one-on-one appointment behaviour.

= 1.0.0 =
* First public release.
* Front-end Vue booking wizard (`[robina_booking_form]`) and popup button (`[robina_booking_button]`).
* Capacity-aware availability engine: business hours, slot step and buffers; staff as parallel capacity (a free one is auto-assigned); a single per-location capacity when no staff is configured.
* Optional Staff with location eligibility and optional per-staff weekly hours; optional Locations with their own weekly hours; the engine resolves hours as staff, then location, then global.
* Native admin: Dashboard, Catalog (services, categories, resources), Calendar (Month/Week/Day with create, edit and delete), Bookings, Customers, Staff, Locations and Settings.
* Optional payments: Pay on site, WooCommerce, Stripe (hosted Checkout + signed webhook) and PayPal (Orders v2).
* Email notifications on new bookings. Self-contained assets (no CDN). Clean uninstall.

== Upgrade Notice ==

= 1.1.1 =
Booking-wizard dates now follow your site language (English by default).

= 1.1.0 =
Adds optional group/class capacity (seats per session) on each service.

= 1.0.0 =
First public release of Robina.
