=== Vollstart Appointment Desk ===
Contributors: sasonikolov
Tags: appointment booking, booking system, scheduling, queue management, walk-in queue
Requires at least: 6.2
Tested up to: 7.0
Stable tag: 1.0.8
Requires PHP: 7.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Stop losing money to empty slots and no-shows. Appointment booking + walk-in queue for salons, clinics, consultants, and repair shops.

== Description ==

**Every empty chair costs you money.** Vollstart Appointment Desk turns no-shows and empty slots into booked revenue for hair salons, dental and medical practices, consulting firms, and repair shops. Customers book in 30 seconds. Walk-ins pull a queue number at the door. Native WooCommerce checkout for paid appointments — no third-party connector, no per-extension upsell.

https://www.youtube.com/watch?v=qBe6n6e66BQ

**No double bookings.** Slot holds reserve the time slot while the customer fills out the form. Other booking plugins let two customers book the same slot simultaneously — Appointment Desk prevents this.

**No per-extension upsells.** One plugin, one price. No surprise add-on costs for basic features like email notifications or calendar views.

**GDPR-friendly by design.** All customer data stays in your WordPress database. No external tracking, no third-party data sharing. Your data, your server.

= Perfect for =

* **Hair salons & barbershops** — online booking + walk-in queue for busy days
* **Medical & dental practices** — patient scheduling with check-in kiosk
* **Consulting firms** — client appointment booking with calendar sync
* **Government offices & citizen services** — queue numbers + TV display for waiting rooms
* **Fitness studios & yoga** — class booking with capacity management
* **Repair shops & workshops** — appointment slots with custom fields
* **Coworking spaces** — room and desk booking
* **Any service business** that handles both scheduled and walk-in customers

= Free Features =

* 1 calendar, 1 service, 1 team with 1 staff member — up to 100 customers and 50 appointments per month
* Mobile-friendly online booking form (Shortcode + dedicated booking page)
* Multi-column booking layout — services, calendar, and form side by side
* Inline month calendar in multi-column view
* Live price display in booking form (updates on service/extras selection)
* Email confirmations for new, cancelled, rescheduled, and declined bookings
* ICS calendar file attached to confirmation emails
* Day and week view in admin
* 2 custom fields per booking
* Auto-confirm or manual approval workflow
* Double Opt-In — email confirmation before booking is active
* Customer self-service: cancellation and reschedule via email links
* Slot holds — prevents double bookings while customer fills out the form
* Walk-in queue system: queue numbers, kiosk page, live TV display
* QR code check-in and check-out
* Customer CRM with full appointment history
* Appointment change history — audit log of status changes, reschedules, and file uploads/deletes
* GDPR customer management — export data as JSON, import from CSV/JSON, delete all data with double confirmation
* Rating system — customers rate their experience after the visit
* Blocked times for breaks, holidays, and closures
* Reception cockpit — live front desk overview, no WordPress login needed

https://www.youtube.com/watch?v=eXM1meN4CnA

= Premium Features =

One upgrade, everything included. Premium adds, on top of Free:

* Unlimited calendars, services, and staff members
* Unlimited custom fields
* Team management — assign staff to calendars and services
* Service Extras — optional add-ons per service with price and duration
* Special Days — override business hours for specific dates
* Buffer times for preparation and cleanup between appointments
* Min. advance time / Max. booking window per calendar
* File Upload in booking form — customers attach files with secure storage
* Double Opt-In per-calendar override (global/enabled/disabled)
* WooCommerce integration for paid appointments
* ICS feed — subscribe with Google Calendar, Outlook, or Apple Calendar
* Google Calendar Sync — two-way sync (push bookings, read busy times to prevent double bookings), OAuth2 flow, per-calendar assignment
* Unlimited cockpit auth tokens for staff access
* Staff service desk page for multi-desk setups
* Custom email attachments per email type
* Custom HTML email templates — full control over email content
* Rating email — automatic feedback request after appointments
* Queue themes: Light, Dark, and custom CSS upload
* Customer Self-Service Page — customers view, cancel, and manage their appointment via a secure token link
* Per-calendar override for self-service permissions (cancel, file edit)
* Customer File Management — files attached directly to customer records (allergies, medical records, contracts). Persists across all appointments.
* Remove branding

= Why Appointment Desk? =

Most booking plugins only handle online appointments. But real businesses also have walk-in customers, a reception desk, and a waiting room. Appointment Desk handles all of it:

1. **Book** — Customers self-book online. Slot holds prevent double bookings.
2. **Queue** — Walk-ins pull a number. TV display shows who is next.
3. **Done** — Staff manage everything from one cockpit. No spreadsheets, no chaos.

Built by the team behind [Event Tickets with Ticket Scanner](https://wordpress.org/plugins/event-tickets-with-ticket-scanner/).

= Languages =

Vollstart Appointment Desk is translated into 20 languages:

* English (default), German (DE/AT/CH), French, Spanish, Italian, Dutch, Portuguese (PT/BR), Hungarian, Polish, Czech, Swedish, Danish, Finnish, Greek, Romanian, Bulgarian, Chinese (Simplified), Japanese

All translations are included in the plugin. Community contributions welcome via the WordPress.org translation platform.

= Links =

* [Premium](https://vollstart.com/shop/appointment-desk-pro-business/)
* [Support](mailto:support@vollstart.com)

= Third-Party Libraries =

This plugin includes the following third-party libraries:

* **FullCalendar** v6.1.15 — [fullcalendar.io](https://fullcalendar.io/) — MIT License — [Source](https://github.com/fullcalendar/fullcalendar)
* **DataTables** v2.3.7 — [datatables.net](https://datatables.net/) — MIT License — [Source](https://github.com/DataTables/DataTablesSrc)
* **html5-qrcode** v2.3.8 — QR code scanning — MIT License — [Source](https://github.com/mebjas/html5-qrcode)
* **chillerlan/php-qrcode** v4.4.2 — QR code generation — MIT License — [Source](https://github.com/chillerlan/php-qrcode)

All libraries are included locally within the plugin. No external CDN calls are made.

== External Services ==

This plugin does not connect to any third-party or external services. All data is stored locally in your WordPress database. No customer data leaves your server.

The optional Premium add-on plugin (sold separately at [vollstart.com](https://vollstart.com/)) connects to vollstart.com for license validation and update checks. The free plugin hosted on WordPress.org does not make any external connections.

The Premium add-on offers optional Google Calendar Sync. When enabled by the site administrator, appointment data (customer name, email, service, date/time, location) is sent to the Google Calendar API ([https://developers.google.com/calendar](https://developers.google.com/calendar)) to create, update, and delete calendar events. Busy times are read from Google Calendar to prevent double bookings. This requires the administrator to create OAuth 2.0 credentials in the Google Cloud Console and authorize the connection. Google's privacy policy: [https://policies.google.com/privacy](https://policies.google.com/privacy).

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/` or install directly via the WordPress plugin search.
2. Activate through the "Plugins" menu in WordPress.
3. Go to "Appointment Desk" in the admin menu.
4. Create a team and add staff members (Teams tab).
5. Create a calendar and assign your team (Calendars tab).
6. Add a service to the calendar.
7. Add the `[vollstart-appointment-desk]` shortcode to any page — or use the auto-generated booking page.

== Frequently Asked Questions ==

= What about no-shows? =

Empty chairs cost money. Appointment Desk reduces no-shows with double opt-in (verifies the email is real before the booking is confirmed), instant email confirmations with one-click reschedule links, and SMS reminders (Premium) sent before each appointment — reaching customers where they actually read messages, not buried in email.

= Does it work with WooCommerce? =

Yes — natively. Pair Appointment Desk with WooCommerce to charge for appointments through the standard WooCommerce checkout. Customers see slot availability in real time, pick a time, and pay in the same flow. No third-party connector needed. (Premium.)

= Can I sync with Google Calendar? =

Yes. Premium includes an ICS feed staff can subscribe to from Google Calendar, Outlook, or Apple Calendar, plus two-way Google Calendar sync — appointments are pushed to your team's calendars and busy times are read back to prevent double bookings.

= How many bookings can I have in the free version? =

The free version includes 1 calendar, 1 service, 1 team with 1 staff member, up to 100 customers and 50 appointments per month. Upgrade to Premium for unlimited everything.

= Is the booking form mobile-friendly? =

Yes. The booking form is fully responsive and works on all devices and screen sizes. Add it to any page via shortcode or use the auto-generated booking page.

= Do customers need an account to book? =

No. Customers book without registering. They receive an email confirmation with links to cancel or reschedule on their own.

= Can I use this for walk-in customers without an appointment? =

Yes. The queue system lets walk-in customers take a number via a kiosk page. A separate TV display shows the current queue status in real time. Staff call the next customer from the cockpit.

= How does the plugin prevent double bookings? =

Slot holds reserve a time slot the moment a customer starts filling out the booking form. If another customer tries to book the same slot, it shows as unavailable. This prevents the overbooking issues common with other booking plugins.

= Can my receptionist use the cockpit without a WordPress account? =

Yes. The reception cockpit is a standalone page protected by an auth token. Share the URL with staff — no WordPress login needed. The free version includes 1 auth token. Premium includes unlimited tokens.

= Can I accept payments for appointments? =

Yes, with Premium. WooCommerce integration lets you charge for appointments through the standard WooCommerce checkout. The free version handles free bookings only.

= Does the plugin require WooCommerce? =

No. Appointment Desk works fully standalone. WooCommerce integration is available in Premium for paid appointments.

= Does it work with Elementor, Gutenberg, and other page builders? =

Yes. The booking form is added via shortcode `[vollstart-appointment-desk]`, which works in any page builder, theme, the block editor, or the classic editor.

= Does the plugin send appointment reminders? =

Yes. The free version sends email confirmations, cancellations, and reschedule notifications. Premium adds SMS reminders before each appointment — the most effective way to cut no-shows.

= Is all customer data stored on my own server? =

Yes. All data is stored in your WordPress database. No external services are used for core functionality. The plugin is GDPR-friendly by design — no customer data leaves your server.

= Can my staff subscribe to their schedule in Google Calendar? =

Yes. Premium includes an ICS feed that staff can subscribe to from Google Calendar, Outlook, or Apple Calendar. Appointments sync automatically.

= How is this different from Bookly or Amelia? =

Vollstart Appointment Desk combines online booking with a walk-in queue system and a reception cockpit. Most booking plugins focus only on online scheduling. Also: one price, no per-extension upsells, no separate tiers — every Premium feature is included in a single upgrade.

= Can I export bookings? =

Yes. The admin interface includes CSV export for appointments and customer data.

= How do I get support? =

Email us at support@vollstart.com. We respond within 1 business day.

== Screenshots ==

1. See every appointment at a glance. Confirm, reschedule, never miss one — reception cockpit, no WordPress login needed.
2. Customers book in 30 seconds. Mobile, fast, no friction — frontend booking form with live price display.
3. Walk-ins pull a queue number at the door — kiosk page on any tablet, no staff intervention.
4. Live queue display for waiting rooms — TV screen in portrait or landscape, customizable themes (Premium).
5. Your calendar, fully booked. No empty slots, no lost revenue — admin week view across all staff and services.
6. Customer CRM — full appointment history, ratings, and notes per customer.
7. Settings — business hours, license, and general configuration. SMS reminders, Google Calendar sync, and CAPTCHA available in Premium.

== Changelog ==

= 1.0.8 - 2026-06-18 =
* Fix: Walk-in queue cockpit — the reception/staff panel read API fields that the server never sent (ticket status, ticket number, staff name, served count). As a result, after calling the first customer the desk card stayed on "Next" instead of "Here/Done/Skip/Decline" and ticket numbers showed blank. The panel now uses the correct fields, so calling, serving and completing customers works from the first ticket on.
* New: Per-calendar "Refresh interval (seconds)" setting — controls how often the cockpit, service desk and display screens poll for live updates (default 5s, range 3–300). Previously the polling rate was fixed and not configurable.
* New: 5-star rating prompt in the admin — a small block linking to the WordPress.org review page (matches Event Tickets and Serial Codes).
* Docs: readme reworked for the single paid tier — Free + Premium (the former Pro and Business feature lists are merged into one "Premium Features" section), wording updated throughout.

= 1.0.7 - 2026-04-27 =
* Fix: "Update available" badge stayed visible after auto-upgrade of the Pro plugin — the `update_plugins` site transient was not cleared after the upgrade, so WordPress kept showing the stale notice until the next WP-Cron run (12h). Transient is now cleared + re-checked after upgrade completes.
* New: "First Activated" date in Support Info — shows when the plugin was first activated, included in the copyable support text. Marked as "(estimate)" for installs predating this version.
* Internal: First-activation timestamp is sent to the license server with the next license check (Pro plugin) for free-to-paid analytics.
* New: SMS notification infrastructure — hooks for SMS sending on appointment create, cancel, reschedule, decline
* New: SMS log table for tracking sent messages
* New: Options filter hook (vollstart_adesk_options) for Pro plugin to register additional settings
* Internal: makeOption() now public for extensibility

= 1.0.6 - 2026-04-20 =
* New: vollstart.com branding footer in admin
* New: Pro onboarding banner with license key focus when Pro installed but not licensed
* New: Pro JS dynamic loading — adeskButton, adeskModal buttons array, beforeRender/afterRender hooks, getHelpers API

= 1.0.5 - 2026-04-16 =
* New: Auto-upgrade Pro plugin after valid license key is saved — no more manual "Update" click needed
* New: CAPTCHA / Anti-Spam for booking form (Pro) — Honeypot field, minimum form time, and Google reCAPTCHA v3. User can enable any combination. All checks run server-side with generic error messages that do not reveal which check failed.
* New: Honeypot anti-spam — hidden field that bots fill in but humans cannot see. No external service, GDPR-compliant, zero configuration.
* New: Minimum form time — reject bookings submitted faster than a configurable threshold. Bots submit instantly, humans need a few seconds.
* New: Google reCAPTCHA v3 — invisible score-based CAPTCHA. Configurable threshold (default 0.5). Requires free Google API keys. Note in options: sends visitor IP to Google.
* Improvement: Option descriptions now shown below the input field (was below the label). Matches POS Desk layout.
* Improvement: Option key shown on its own line below the label (was inline next to label).
* Improvement: Pro badge on CAPTCHA section heading and all CAPTCHA option labels
* Fix: Options sections after File Upload (CAPTCHA, Google Calendar, Advanced) rendered outside the card — caused by Purge button breaking the div nesting
* New: Phasen-Tracking feature planned for POS Desk Gastronomie tier (roadmap)
* New: "More Plugins by Vollstart" submenu page — discover other free plugins from the same team
* New: Queue TV display — option to show ticket number on the left and service desk name on the right (reversed layout for portrait orientation)
* New: Print button for queue tickets — backend queue table, plus optional print button and auto-print on kiosk after ticket pull (two new global options)
* Fix: Queue auto-skip timezone bug — cutoff was calculated with wrong timezone offset, either never firing or firing immediately. Now uses MySQL DATE_SUB for timezone-safe comparison.
* Fix: Queue number restart bug — numbers restarted from 001 after ticket deletions because COUNT(*) was used instead of MAX(queue_number)
* Fix: Queue table status column — when a staff is serving a ticket, the table now shows the correct status from the staff card as source of truth

= 1.0.4 - 2026-04-11 =
* Fix: German translations not loading — loadTextDomain() was empty, load_plugin_textdomain() now called correctly
* Fix: 262 untranslated strings in de_DE, de_AT, de_CH now translated
* Fix: POT file regenerated from current source (1241 strings)
* Fix: de_CH uses "ss" instead of "ß" throughout (Swiss German standard)

= 1.0.3 - 2026-04-11 =
* New: Google Calendar Sync (Business tier) — push bookings to Google Calendar, read busy times to prevent double bookings
* New: Per-calendar Google Calendar assignment in calendar settings
* New: OAuth2 connect/disconnect/test UI in Options
* New: Appointment::updateMeta() for extensible appointment metadata
* New: Admin AJAX extension filter for Pro/Business plugin actions
* New: Pro/Business tier badges on options — shows which license tier each feature requires
* New: Customer Files section in customer detail view with upgrade teaser — actual implementation in Pro plugin (Business tier)
* New: Customer Files section in Files admin tab with upgrade teaser — lists all customer files across the site (Business tier, Pro plugin)
* New: vollstart_adesk_customer_delete_all_data action hook for Pro/Business cleanup during GDPR delete
* New: vollstart_adesk_customer_pdf_after_notes filter hook — Pro/Business can inject content (e.g. customer files) into customer PDF
* New: Appointment change history — audit log of status changes, reschedules, and file uploads/deletes. Shown in appointment detail view.
* New: Delete button per file in appointment detail view
* New: Bulk customer export — download all customers as JSON (basic fields, compatible with import)
* New: Customer PDF / profile print — printable customer profile with contact, overview stats, appointment history, and notes
* New: Professional PDF header with business info (name, address, phone, email) and WordPress custom logo fallback
* New: QR code embedded in appointment PDF header (check-in code, replaces previous inline version)
* New: Client-side file validation before upload — checks allowed extensions and max size from global settings
* New: CSV export for customer change history — download button inside the change history box
* New: Appointment ID shown in customer appointment history table and in customer PDF
* New: Central fmtDateTime() / fmtDate() helpers on Main class — single source of truth for WP-aware datetime formatting
* Improvement: Customer detail view redesigned — Contact + Overview cards side by side (50/50), appointment history full width below
* Improvement: Contact fields (email, phone, notes) shown even when empty
* Improvement: All DataTables action columns right-aligned consistently
* Improvement: PDF layout uses HTML table header, full-width body (no max-width), left-aligned table headers
* Improvement: Notes row always visible in customer PDF (— when empty)
* DB: new table appointment_history
* Rename: "File Manager" card is now "Appointment Files" (to distinguish from new Customer Files section)
* New: DEBUG badge in admin header when WP_DEBUG is active
* Fix: PDF download crashed due to undefined constant (VOLLSTART_ADESK_VERSION → VOLLSTART_ADESK_PLUGIN_VERSION)
* Fix: Same undefined constant bug on rating page stylesheet
* Fix: PDF generation crashed on appointments with array-valued custom fields (multi-select/checkbox)
* Fix: Auto-repair also catches "table doesn't exist" errors (not only "unknown column") so new tables are created automatically
* External Services: documented Google Calendar API usage in readme

= 1.0.2 - 2026-04-07 =
* Fix: Booking page button now uses current slug from options (not stale cached value)
* Fix: Rewrite rules registered correctly (direct call instead of nested init hook)
* Fix: Options loaded fresh on every tab switch — changes take effect immediately
* Fix: Queue badge polling skipped when not in cockpit or queue tab
* New: JS options framework (option_getVal, option_isActive) for reliable option access
* New: 20 language translations (DE/AT/CH, FR, ES, IT, NL, PT, PT-BR, HU, PL, CZ, SV, DA, FI, EL, RO, BG, ZH-CN, JA)
* New: Languages section in readme
* Fix: Free team limit corrected in documentation (1 member, not 2)
* Fix: Queue kiosk auto-resets to pull screen after timeout (was stuck on called notification)
* Fix: Customer rating click now works (was failing because empty name was sent with rating-only update)
* Fix: Customer name now shows in cockpit week view and next up box
* Fix: Serial shown in full in support info (no masking)
* Improvement: Appointment rating shown in cockpit detail view
* Improvement: Cockpit week view shows customer name + service name
* Improvement: Customer view button in cockpit appointment detail
* Improvement: Customer tables wrapped in card layout (consistent with Files tab)
* Improvement: Action buttons right-aligned in all tables
* Improvement: Search placeholder style in customer table
* Refactor: Single enrichAppointment() method replaces duplicate enrich blocks
* Refactor: Single card() function for consistent card layout (SRP)

= 1.0.1 - 2026-04-07 =
* Show Pro version in admin header and support info
* Minor fixes and improvements

= 1.0.0 - 2026-04-06 =
* Initial release
* Online appointment booking with calendar, services, and time slots
* Walk-in queue system with kiosk page, live TV display, and staff service desk PWA
* Reception cockpit — standalone front desk, no WordPress login needed
* Slot holds to prevent double bookings
* QR code check-in and check-out
* Email notifications: confirmation, cancellation, reschedule, declined
* ICS calendar file in confirmation emails
* ICS feed for Google Calendar / Outlook sync
* Customer CRM with appointment history and ratings
* Custom fields per booking (2 in free, unlimited in Pro)
* Blocked times for holidays, breaks, and closures
* Team management with virtual members (no WP account needed)
* Multi-desk queue with auto-assign and no-show timeout
* TV display: portrait (rows) and landscape (grid) orientation
* Multi-column booking layout — services, calendar, and form side by side
* Inline month calendar in multi-column view
* Admin: day view, week view, month view with CSV export and print
* WooCommerce integration for paid appointments (Pro)
* Buffer times for preparation and cleanup (Pro)
* Custom queue themes with CSS upload (Pro)
* "Delete data on uninstall" option (default off)
* GDPR-friendly: all data stored locally, no external tracking
