=== Abientot ===
Contributors: absoludev, freemius
Tags: booking, appointments, scheduling, reservations, calendar
Requires at least: 6.4
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 1.1.3
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

A local-first booking plugin for services, appointments, customers, calendars, and solo business scheduling.

== Description ==

Abientot helps service businesses accept and manage appointments from WordPress without relying on remote booking services by default.

The free plugin includes:

* Service, staff profile, and location setup for a solo business.
* Server-side availability with schedules, breaks, exceptions, buffers, minimum notice, booking windows, and double-booking prevention.
* Admin booking management with lifecycle statuses, internal notes, activity history, manual pay-on-site status, and CSV export.
* Calendar, customer database, dashboard reports, and local chart summaries.
* A public booking shortcode and block.
* Customer email notifications through WordPress mail.
* A local calendar download after booking, with tentative status while approval is pending.
* Editable cancellation and rescheduling contact instructions in customer confirmation emails.
* Privacy tools, CSV exports, settings export/import, system status, and opt-in uninstall cleanup.

Abientot does not load remote scripts, styles, fonts, images, tracking pixels, or payment gateway SDKs by default. Customer self-service cancellation/rescheduling, online payment gateways, multi-staff management, multi-location management, SMS, calendar sync, and other advanced integrations are not included in this free plugin.


Abientot targets single-site WordPress. Multisite is not supported.

== Installation ==

1. Upload the `abientot` folder to `/wp-content/plugins/`.
2. Activate Abientot from the WordPress Plugins screen.
3. Open Abientot in the WordPress admin and complete the setup checklist.
4. Add the `[abientot_booking_form]` shortcode to a page, or insert the Abientot Booking Form block.

== Frequently Asked Questions ==

= Does Abientot send booking data to a remote service? =

Abientot stores booking data in your WordPress database and sends email through the site's configured WordPress mail system. Freemius licensing does not receive customer appointment records from Abientot. Optional booking integrations contact their configured providers.

= Does the free plugin include online payments? =

No. The free plugin supports manual pay-on-site status and instructions only.

= Can I manage multiple staff members or multiple locations? =

The free plugin manages one staff profile and one location profile. The database is structured for future add-ons, but multiple-staff and multiple-location interfaces are not part of this free plugin.

= Can customers cancel or reschedule online in the free plugin? =

No. The free plugin can show your business phone and email in confirmation emails so customers know how to contact you. Dedicated customer cancellation and rescheduling pages are not included in the free plugin.

= What happens when I deactivate the plugin? =

Deactivation does not delete booking data.

= What happens when I uninstall the plugin? =

Uninstall removes Abientot data only when the delete-data-on-uninstall setting has been explicitly enabled before uninstall.

== Screenshots ==

1. Dashboard with booking, revenue, setup, and upcoming appointment summaries.
2. Bookings admin list with filters, lifecycle actions, and booking details.
3. Calendar day, week, and month planning views.
4. Customer profile with booking history and customer statistics.
5. Services, staff profile, and location setup screens.
6. Public booking form service, time, details, review, and confirmation steps.
7. Communication, payment methods, privacy, data export, and system tools.

== Privacy ==

Abientot stores appointment booking data submitted through this site, including customer names, email addresses, phone numbers, booking notes, administrator-configured booking form field answers, selected services, appointment times, payment status for manual pay-on-site records, and booking activity needed to operate the service.

Abientot uses this data to manage appointments, send booking emails through the site's WordPress mail system, and show business contact information for cancellation or rescheduling requests when enabled. Abientot does not contact external services, load remote tracking assets, or send booking data to a remote provider by default.

Site administrators can export customer, service, appointment, and settings data from the WordPress admin. WordPress personal data tools cover current canonical customer identity and shared retained SMS/staff data. Historical email changes, phone-only customers, attendees, dependants and staff-managed calendars may need the administrator’s verified manual route. Identity removal clears contact details, answers, notes, activity content, payment references and private tokens while retaining potentially linkable booking IDs, times, relationships and financial amounts. This is not a guarantee of irreversible anonymization. Unused customer records can be deleted. Uninstall removes Abientot data only when the delete-data-on-uninstall setting is explicitly enabled before uninstall.

Abientot uses a signed first-party cookie, abientot_availability_session, for one hour to keep availability request limits separate between browsers. It contains a random identifier and is not used for advertising or cross-site tracking.

== Optional compatibility reports ==

In Settings > Privacy & Data, unsupported booking-plugin exports can be analyzed locally in your browser. CSV/JSON analysis is bounded; other file families are identified without parsing. This does not import records. The report excludes file contents, customer values, raw headers/keys, filenames, arbitrary metadata and attachments. It contains only fixed format/type enums, anonymous column details, coarse counts, presence flags and optional fixed-enum source/edition hints.

Only after you review the complete report and explicitly consent, Abientot sends that report to contact@abientot.app through your site's WordPress mail configuration to assess format support. No automatic transmission occurs. WordPress mail sender and routing metadata mean this email is not anonymous; mail providers and the recipient may retain it. Transport acceptance does not prove inbox delivery. Sending attempts are limited and never automatically retried.

Supported competitor contact imports are a separate workflow: selected export files are uploaded, read from PHP's private temporary location and removed. Encrypted, actor-bound browser previews may contain the original supported export for up to 20 minutes. Only the selected contact fields and import ledger facts are saved when you confirm. Current verified formats are LatePoint English customer CSV and Simply Schedule Appointments Free-compatible appointments JSON (contacts only), capped at 100 input records and 256 KiB per import.

== Optional support contact ==

On Abientot admin pages, Help opens a contact form with a topic, your email address, message and up to three optional files. Supported files are PDF, JPEG, PNG, GIF, WebP and plain UTF-8 CSV, each up to 3 MB. Your hosting or mail provider can impose lower limits. Files are checked on the server and held in private temporary storage only while sending, then removed; they are not added to the media library.

Only after your explicit consent and submission, your message, email address and chosen attachments are sent to contact@abientot.app using your site's WordPress mail configuration, with subject Contact request. Your validated email address is used as Reply-To. The recipient and mail providers may retain the request and files. Avoid passwords, licence keys and unnecessary customer data. Nothing is sent automatically. Sending attempts are limited and never automatically retried. Mail transport acceptance does not confirm inbox delivery. Migration compatibility reports use subject Migration report and still have no attachments.

Abientot support privacy policy (support contact and compatibility reports): https://abientot.app/privacy.html
Infomaniak (support mailbox provider) privacy policy: https://www.infomaniak.com/en/legal/confidentiality-policy

== Privacy configuration and retention ==

Each booking business must complete and publish its own privacy notice, lawful purposes, rights contact, retention and configured recipients/transfers. The public form displays privacy information independently of booking terms. An enabled terms checkbox records the current server terms version, text and acceptance time. Optional maps use an external link; no map iframe loads automatically.

Settings > Privacy & Data includes independently verified record-ID export/erasure and disabled-by-default retention cleanup. A saved policy does not run cleanup. Preview and explicit confirmation protect legal/financial holds, recent/future bookings, active credits/waitlists, unresolved SMS and disabled/recent activity. Cleanup preserves linkable operational/financial history; review shared media, email copies, providers and backups separately. Transactional notifications are not permission for marketing or sensitive-data processing.

Abientot support is operated by AbsoluDev, the brand name of Adrien Deflinne, Empresário em Nome Individual (ENI), Portugal, Avenida Norton de Matos 79 2B, 2975-312 Quinta do Conde, Portugal, with public contact contact@abientot.app. Its in-dialog privacy notice explains requested-support processing, delivery to an Infomaniak mailbox, rights/CNPD contact and a normal 90-day post-resolution deletion policy with documented legal holds/provider residuals. The operator must apply the mailbox procedure; the plugin attaches verified uploads directly and keeps no copy. Attachments require a confirmation that identifying customer data, sensitive information and secrets were removed. This is not automatic redaction. Completed interface translations and privacy tools do not certify every site's legal compliance.

== Freemius licensing service ==

Abientot includes the Freemius WordPress SDK for optional account connection, Pro licence activation, licence verification, checkout and updates. Free booking functionality does not require an account or a paid licence.

After activation, an opt-in screen asks whether you want to connect the site to Freemius. Nothing is sent unless an administrator explicitly opts in. Choosing "Skip" keeps every free feature available, and the SDK then makes no remote requests. You can opt in or out later from the plugin's account menu. If you opt in, the site/account information needed for the service is shared, and the SDK synchronizes licence/account information and updates. No appointment records or customer booking exports are passed to Freemius by Abientot.

Freemius terms: https://freemius.com/terms/
Freemius privacy policy: https://freemius.com/privacy/

== Changelog ==

= 1.1.3 =
* Security: every form, action link and AJAX request verifies its nonce with a fixed action first, then checks the user's capability, before any request value is read.
* Security: result messages shown after a redirect are signed with a nonce, so a crafted link cannot display them.
* Admin: the import screen requires the import capability; navigation parameters go through a single validated reader.
* Code: readable formatting (one statement per line) with no change in behaviour.
* Readme: source links point to the Freemius repositories, with the tag and path given in the text.

= 1.1.2 =
* Database: every query that uses a variable value is prepared where it runs, with identifiers and value lists bound as placeholders.
* Output: admin cards, form controls and table cells are escaped at the point of output with explicit allowed-HTML lists.
* Requests: form and query values are read field by field with the matching WordPress sanitizer instead of as whole arrays.
* Bundled phone-number library: removed a checksum file that is not needed at runtime; its licence file is now license.txt.
* Privacy export: JSON is written with the standard WordPress encoder settings.

= 1.1.1 =
* Request handling keeps valid values exactly as sent (only tags and invalid characters are removed), so recurring-booking retries compare the same values that are saved.
* Privacy & Data: each preview or cleanup result is shown only on the page it was meant for.
* Booking form: the Serif, Mono and Rounded font choices apply again (their font names were escaped as HTML inside CSS).
* Edition comparison: next-available-time search is no longer listed as Pro-only; it is part of the free plugin.

= 1.1.0 =
* WordPress.org review: the free plugin now gets its translations from translate.wordpress.org; Pro keeps its bundled translations.
* Freemius: the free plugin shows the standard opt-in screen. Nothing is sent unless an administrator opts in, and "Skip" keeps every feature.
* Emails: the "Powered by Abientot" line is off by default. Turn it on under Settings, Communication, "Credit in emails". Templates saved earlier no longer carry the line unless you turn it on.
* Free and Pro no longer deactivate each other. If both are active, Pro runs and the Plugins screen suggests deactivating Abientot.
* Security: every request handler now checks its nonce and permission before reading the request, and passes only sanitized data to extensions.
* Privacy & Data: preview and cleanup results now open in the Privacy & Data tab.
* Code: the booking form editor script and styles are loaded through WordPress, and all JavaScript and CSS files are formatted as readable source.

= 1.0.5 =
* Header: your business name is shown larger and styled. Choose its font, style, size and colour under Settings, General; the header previews the change while you edit.
* Header: Help now sits in the top bar next to "Go to…" instead of floating in the corner.
* Services: category images are shown as square thumbnails, and removing an image uses a clear trash badge on the image itself, separate from deleting the category.
* Calendar: the service, staff and status filters line up with the other toolbar controls and no longer cut their text.
* Translations: the new texts are translated in all 21 bundled languages.

= 1.0.4 =
* Reports: one new Reports page replaces Booking activity. Cards can be collapsed and switched to a table, charts compare with the previous period, and quick buttons pick today, 7, 30 or 90 days, this or last month, or this year.
* Reports cards: key figures with trends, bookings over time, booking health, top services, busiest times, how far ahead and through which channel customers book, new and returning customers, the next 7 days and setup progress.
* Pro: payments and balances, team performance and who is free right now, resource status and usage, locations, a detailed financial breakdown with CSV export, and sharing chosen report cards with team members who have a login.
* Reports: occupancy measures team time. Overlapping bookings count once, only working hours count, and table or room bookings are left out, so it never exceeds 100 %. Team performance also shows time booked outside working hours.
* Calendar: table and room bookings appear as compact circles showing the number of guests, grouped by resource category, with details on hover and the booking editor on click.
* Calendar: short bookings show their time, service and customer on one line with a details card on hover, and the new-booking marker fills only free time slots, so existing bookings stay easy to click.
* Payments: a table or room without a set price (for example a restaurant table paid on what is consumed) is no longer marked "Not required". Only an explicit price of 0 makes it free.
* Translations: the new texts are translated in all 21 bundled languages.

= 1.0.3 =
* Translations: all 21 bundled languages are complete again, including every string added in 1.0.2.
* Dates and times follow the chosen plugin language when it differs from the site language; headings and calendar month titles use each language's own date order.
* Reports: the period date fields show the full date.

= 1.0.2 =
* WordPress.org review: every admin request handler verifies its nonce visibly and sanitizes each request value where it is read.
* Internal Freemius accessor renamed to abientot_fs() (prefixing); Free and Pro still switch safely with older installed copies.
* Uninstall now also removes the privacy retention setting when data deletion is enabled.
* Licence statements aligned on GPLv3 or later; readme documents compiled SDK sources and support privacy links.

= 1.0.1 =
* WordPress.org review: database queries use prepared identifiers, bundled phone-library files block direct access, and file handling uses WordPress functions.
* Support contact attachments are sent from the verified upload without a temporary copy.
* Publisher shown as AbsoluDev.
* Clearer outage notice wording.

= 1.0.0 =
First public release.

= 0.5.0 =
Improved retained booking metadata compatibility, privacy exports and private-link contact help across edition changes. Hardened notification outcomes and shared booking guards.

= 0.2.0 =
* Redesigned admin workspace with a neutral admin palette, clearer dashboard, command search, responsive tables, and compact schedule editing.
* Added booking quick views, full list pagination, service search, and copying hours to other working days.
* Polished the customer journey with searchable services, a weekly date strip, next-available search, persistent appointment summary, and editable review.
* Added Forest, Ink, and Ocean form presets with live preview; existing saved branding is preserved.
* Made main admin booking saves transactional and isolated mail failures from successful saves.
* Separated reporting currencies and preserved original booking source and payment timestamps.
* Completed French translations and added public submission, transaction, and customer journey regressions.

= 0.1.8 =
* Improved booking keyboard access, native date selection, complete review details, and recovery from unavailable times.
* Added local calendar downloads and clear pending/confirmed messaging.
* Unified public/admin booking locks, protected existing appointment buffers, and checked conflicts when restoring cancelled bookings.
* Preserved existing appointment durations and rejected invalid dates.
* Removed unavailable payment controls and Loyalty placeholders from the free interface.
* Updated French translations and added focused regression checks.

= 0.1.7 =
* Added a straightforward automatic-confirmation or manual-approval choice under Booking Rules.
* Added a customizable customer booking-confirmed email for bookings approved by an administrator.

= 0.1.6 =
* Replaced free customer cancellation/rescheduling self-service links with optional contact instructions and marked Pro-only features with a consistent badge.
* Scoped public confirmation typography so theme heading styles cannot enlarge the booking confirmation message.

= 0.1.5 =
* Made Form page sections and style subsections collapsed accordions.
* Added field style controls for text color, background color, border color, border width, and border radius.

= 0.1.4 =
* Reorganized the Form page into General, Fields, Style, and Policies sections with Style subsections.
* Added configurable public booking detail fields and per-booking submitted field snapshots.

= 0.1.3 =
* Fixed Form preview category background color updates.
* Added a Form setting for hours availability border radius.

= 0.1.2 =
* Refined grouped service categories so expanded services render as nested selectable rows inside the category container in the Form preview and public booking form.
* Bumped the plugin asset version so updated booking form styles load instead of cached older CSS.

= 0.1.0 =
* Initial release candidate with booking management, public booking form, availability, customer records, calendar, dashboard, email notifications, customer contact instructions, manual payment status, privacy tools, and WordPress.org readiness polish.

== Upgrade Notice ==

= 1.1.3 =
Security hardening of request handling for the WordPress.org review. No database changes.

= 1.1.2 =
Code-quality release for the WordPress.org review: prepared queries, escaped output and per-field request handling. No database changes.

= 1.1.1 =
Fixes from a second review of 1.1.0: recurring-booking retries, Privacy & Data messages, form fonts. No database changes.

= 1.1.0 =
WordPress.org compliance release: opt-in for Freemius and for the email credit, translations from translate.wordpress.org for the free plugin. No database changes.

= 1.0.5 =
Admin polish: customisable business name in the header, Help in the top bar, square category images. No database changes.

= 1.0.4 =
New Reports page with interactive cards. No database changes.

= 1.0.3 =
Translation and date-format update. No settings or data changes.

= 1.0.2 =
WordPress.org review and maintenance release. No settings or data changes.

= 1.0.1 =
WordPress.org compliance and maintenance release. No settings or data changes.

= 0.1.7 =
Adds configurable booking approval and a customizable customer approval email.

= 0.1.6 =
Refreshes public booking form confirmation styling.

= 0.1.5 =
Refreshes Form editor accordions and public field styling controls.

= 0.1.4 =
Adds configurable public form fields and stores submitted field snapshots with bookings.

= 0.1.3 =
Refreshes booking form appearance controls and frontend styles.

= 0.1.2 =
Refreshes booking form styling for grouped service categories.

= 0.1.0 =
Initial release candidate.

== Source code ==

All Abientot JavaScript and CSS files in this plugin are the readable source files. There is no build step and no minified or compiled Abientot code. The only compiled files belong to the bundled Freemius SDK and are documented below.

== Third-party code ==

Local phone-number parsing includes a scoped libphonenumber-for-php 8.13.55 bundle under Apache-2.0. Copyright notices, license and modifications are included in includes/ThirdParty/PhoneNumber/. Abientot-authored code is licensed GPLv3-or-later, which is compatible with Apache-2.0. No phone data is sent to an external service.

== Third-party JavaScript source and notices ==

The Freemius SDK 2.13.4 includes a compiled pricing application declared as version 1.4.1. Its readable upstream source and build instructions are in the Freemius pricing-page repository, tag 1.4.1, entry point src/index.js:
https://github.com/Freemius/pricing-page

This is a version-matched upstream reference; byte-for-byte reproducibility of the supplied bundle has not been verified. The pricing app MIT licence, dependency licence texts and provenance are included in includes/ThirdParty/FreemiusNotices/. Original SDK root/API licences and assets/js/pricing/freemius-pricing.js.LICENSE.txt are preserved under vendor/freemius/.

The Freemius SDK 2.13.4 also ships compressed stylesheets and one compressed script. Their readable sources are in the Freemius WordPress SDK repository, tag 2.13.4: the SCSS sources of vendor/freemius/assets/css/ are in assets/scss/ (compiled by the repository gulpfile.js), and the source of vendor/freemius/assets/js/postmessage.js is assets/scripts/postmessage.js:
https://github.com/Freemius/wordpress-sdk
