📋 Changelog

Historique des mises à jour

Suivez l'évolution de nos plugins et découvrez les dernières améliorations.

← Tous les plugins
💰

Paiement Préalable for Listeo

Dernière version: v1.8.1
v1.8.1 ✨ Dernière 📅 16 juin 2026
[1.8.1] - 2026-06-16

### 🔧 Corrections virement bancaire / Bank transfer fixes

---

#### 🇫🇷 Français

- **Plus de page « Processing… » qui traîne dans la modale LBP** : après avoir cliqué « J'ai effectué mon virement » (avec preuve), l'écran de succès natif LBP (« Thank you for your booking! ») s'affiche désormais **immédiatement**. La confirmation et l'upload de la preuve se font **en arrière-plan** (l'AJAX pouvait être lent, ex. envoi d'e-mails serveur), évitant l'écran intermédiaire de coordonnées qui semblait bloqué.
- **Preuve correctement enregistrée** : la preuve uploadée dans la modale est bien sauvegardée (`_bank_transfer_proof_url`) et le virement marqué confirmé, même si le client ferme la fenêtre rapidement.
- **Nouvelle page « ✅ Virements validés »** : historique filtrable (période, montant min/max, recherche réf./client/email/ID) avec KPI et exports **Excel (.xls), CSV, XML et PDF**.
- **Boutons Valider / Rejeter** de la page « Virements » redessinés (conteneur flex, icônes, plus de chevauchement ni de coupure en bord de colonne).
- **Référence & n° de réservation** corrigés dans « Virements à valider » : la colonne SQL `ID` n'était pas lue (`$booking->id` → 0), ce qui affichait « LPP-0 » et masquait la preuve. Le n° de réservation est désormais affiché sous la référence.
- **Lien « Je confirmerai plus tard »** masqué pendant le traitement (évite tout double-clic).
- **Traductions anglaises** complétées (message « preuve obligatoire », « Je confirmerai plus tard », formats acceptés, page virements validés et ses exports).

---

#### 🇬🇧 English

- **No more lingering "Processing…" page in the LBP modal**: after clicking "I've made the transfer" (with proof), the native LBP success screen ("Thank you for your booking!") now shows **immediately**. Confirmation and proof upload happen **in the background** (the AJAX could be slow, e.g. server email sending), removing the intermediate bank-details screen that looked stuck.
- **Proof correctly saved**: the proof uploaded in the modal is properly stored (`_bank_transfer_proof_url`) and the transfer marked as confirmed, even if the customer closes the window quickly.
- **New "✅ Validated transfers" page**: filterable history (date range, min/max amount, search by ref./client/email/ID) with KPIs and **Excel (.xls), CSV, XML and PDF exports**.
- **Validate / Reject buttons** on the "Transfers" page redesigned (flex container, icons, no more overlap or clipping at the column edge).
- **Reference & booking number** fixed on "Transfers to validate": the SQL column `ID` was not read (`$booking->id` → 0), showing "LPP-0" and hiding the proof. The booking number now appears under the reference.
- **"I'll confirm later" link** hidden during processing (prevents double-clicks).
- **English translations** completed ("proof required" message, "I'll confirm later", accepted formats, validated-transfers page and its exports).

---
v1.8.0 📅 16 juin 2026
[1.8.0] - 2026-06-16

### 🏦 Virement bancaire (paiement manuel) / Bank transfer (manual payment)

---

#### 🇫🇷 Français

##### Nouveau moyen de paiement : virement bancaire

- **Contexte** : plus de 50 % des entreprises règlent par virement. Ajout d'un moyen de paiement manuel complet, calqué sur le fonctionnement du paiement en espèces (« cash »).
- **Flux** : le client choisit « Virement bancaire », voit les coordonnées bancaires (IBAN, BIC, titulaire) et confirme. La **réservation** passe en statut `waiting` et la **commande WooCommerce** en `on-hold` (en attente). Les commissions vendeur sont créées mais restent en attente. **Aucun encaissement en ligne.**
- **Libellé normé** : chaque réservation reçoit une référence unique `LPP-{ID}` (ex. `LPP-42`) que le client doit indiquer dans son virement, pour permettre le rapprochement.
- **Validation manuelle** : nouveau menu **« 🏦 Virements »** pour valider/rejeter chaque virement reçu. La validation passe la réservation et la commande en `payé` et finalise les commissions.
- **E-mails automatiques** : envoi au client des coordonnées + libellé à la création, notifications admin (nouveau virement en attente, confirmation client), e-mail de validation/rejet au client.
- **Compatibilité Listeo Booking Plus (LBP)** : fonctionne dans la modale popup exactement comme le cash. LBP crée la réservation + la commande, que le plugin bascule en attente de validation (`capture_lbp_bank_transfer_order_id()` / `finalize_lbp_bank_transfer_order()`).

##### Rapports & Rapprochement bancaire

- Nouvelle page **« 📊 Rapports »** avec deux onglets :
- **Journal des ventes** : liste filtrable (méthode, statut, dates) de toutes les réservations + export CSV (mode de paiement, date, montant, référence, entreprise, statut OK/KO).
- **Rapprochement bancaire** : import du relevé bancaire au format CSV. Le système recherche la référence (ex. `LPP-42`), compare le montant, rapproche automatiquement les virements en attente, puis permet de les valider en masse.

##### Réglages & page de confirmation

- Nouvelle section de réglages **Virement Bancaire** : titulaire, banque, IBAN, BIC/SWIFT, informations, instructions, fichier RIB, option « exiger une preuve de virement », et sélection/création automatique de la page de confirmation (`[lpp_bank_transfer]`).
- Nouveau shortcode `[lpp_bank_transfer]` pour la page de confirmation/suivi côté client.

##### Design natif Listeo

- Toutes les sections front (formulaire de paiement, page de confirmation) utilisent désormais les **classes natives du thème Listeo** (`notification notice/success/warning`, `button fullwidth`, `button border`) au lieu de styles personnalisés, pour une intégration parfaite au thème et à la modale LBP.

##### Documentation

- Ajout d'une section complète « Virement Bancaire » dans la page de documentation du plugin.

##### Corrections virement bancaire (modale LBP & Wallet)

- **Confirmation dans le popup** : après création de la réservation par virement, les coordonnées bancaires, le libellé normé et l'upload de preuve s'affichent désormais directement dans l'**écran de succès** de la modale LBP (auparavant injectés dans l'étape masquée, donc invisibles).
- **Deux options client** : bouton « J'ai effectué mon virement » (preuve **obligatoire** si l'option est activée) et lien « Je confirmerai plus tard » — la réservation est créée dans tous les cas.
- **Bouton de confirmation a posteriori** : nouvelle section « Virement bancaire » dans la page **Mes Réservations** permettant au client ayant choisi « plus tard » de confirmer son virement (et d'uploader la preuve) ultérieurement.
- **Bug de jeton (nonce)** corrigé : le bouton de confirmation virement n'envoyait rien (mauvais nonce `lpp_nonce` au lieu de `lpp_payment_nonce`).
- **Indicateur de chargement** : le bouton reste en « Traitement… » pendant la création asynchrone de la réservation (virement et espèces).
- **Largeur** de la section de paiement alignée sur le champ « Message » de la modale (pleine largeur, à plat).
- **Upload du fichier RIB** dans les réglages corrigé (ajout de `enctype="multipart/form-data"` au formulaire admin).
- **Wallet** : la section Virement Bancaire s'affiche désormais **toujours** (que WiPay/2Checkout soient configurés ou non) ; l'admin peut toujours la masquer manuellement via l'option dédiée.
- **Multi-pays** : libellés des champs (IBAN/BIC, RIB, numéro de compte, etc.) adaptés au pays sélectionné dans la confirmation virement.
- **Nouvelle page « ✅ Virements validés »** : historique des virements validés avec **filtres** (période de validation, montant min/max, recherche réf./client/email/ID), KPI (nombre + total encaissé) et **exports Excel (.xls), CSV, XML et PDF** (PDF via vue imprimable du navigateur).
- **Boutons Valider / Rejeter** de la page « Virements » redessinés (conteneur flex, icônes, plus de chevauchement, plus de coupure en bord de colonne).
- **Référence & n° de réservation** corrigés dans la page « Virements à valider » : la colonne SQL `ID` (majuscules) n'était pas lue (`$booking->id` → 0), ce qui affichait « LPP-0 » et masquait la preuve. Le n° de réservation est désormais affiché sous la référence.
- **Lien « Je confirmerai plus tard »** masqué pendant le traitement (évite tout double-clic).
- **Traductions anglaises** complétées (message « preuve obligatoire », « Je confirmerai plus tard », formats acceptés, nouvelle page virements validés et ses exports).

---

#### 🇬🇧 English

##### New payment method: bank transfer

- **Context**: more than 50% of companies pay by bank transfer. Added a complete manual payment method, modeled on the cash payment flow.
- **Flow**: the customer chooses "Bank transfer", sees the bank details (IBAN, BIC, account holder) and confirms. The **booking** is set to `waiting` and the **WooCommerce order** to `on-hold` (pending). Vendor commissions are created but remain pending. **No online charge.**
- **Standardized reference**: each booking receives a unique reference `LPP-{ID}` (e.g. `LPP-42`) that the customer must include in their transfer, enabling reconciliation.
- **Manual validation**: new **"🏦 Transfers"** menu to validate/reject each received transfer. Validation marks the booking and order as `paid` and finalizes the commissions.
- **Automatic emails**: bank details + reference sent to the customer on creation, admin notifications (new pending transfer, customer confirmation), validation/rejection email to the customer.
- **Listeo Booking Plus (LBP) compatibility**: works inside the popup modal exactly like cash. LBP creates the booking + order, which the plugin switches to pending validation (`capture_lbp_bank_transfer_order_id()` / `finalize_lbp_bank_transfer_order()`).

##### Reports & Bank reconciliation

- New **"📊 Reports"** page with two tabs:
- **Sales journal**: filterable list (method, status, dates) of all bookings + CSV export (payment method, date, amount, reference, company, OK/KO status).
- **Bank reconciliation**: import the bank statement as CSV. The system looks for the reference (e.g. `LPP-42`), compares the amount, automatically reconciles pending transfers, then lets you validate them in bulk.

##### Settings & confirmation page

- New **Bank Transfer** settings section: account holder, bank, IBAN, BIC/SWIFT, info, instructions, RIB file, "require a proof of transfer" option, and selection/automatic creation of the confirmation page (`[lpp_bank_transfer]`).
- New `[lpp_bank_transfer]` shortcode for the customer-facing confirmation/tracking page.

##### Native Listeo design

- All front-end sections (payment form, confirmation page) now use the **native Listeo theme classes** (`notification notice/success/warning`, `button fullwidth`, `button border`) instead of custom styles, for seamless integration with the theme and the LBP modal.

##### Documentation

- Added a complete "Bank Transfer" section to the plugin documentation page.

##### Bank transfer fixes (LBP modal & Wallet)

- **In-popup confirmation**: after a bank-transfer booking is created, the bank details, standardized reference and proof upload now appear directly in the LBP modal's **success screen** (previously injected into the hidden step, so invisible).
- **Two customer options**: an "I've made the transfer" button (proof **required** when the option is enabled) and an "I'll confirm later" link — the booking is created in all cases.
- **Confirm-later button**: new "Bank transfer" section on the **My Bookings** page letting a customer who chose "later" confirm their transfer (and upload the proof) afterwards.
- **Nonce bug fixed**: the transfer confirmation button did nothing (wrong `lpp_nonce` instead of `lpp_payment_nonce`).
- **Loading indicator**: the button stays in "Processing…" during the asynchronous booking creation (bank transfer and cash).
- **Width** of the payment section aligned with the modal's "Message" field (full width, flush).
- **RIB file upload** in settings fixed (added `enctype="multipart/form-data"` to the admin form).
- **Wallet**: the Bank Transfer section now **always** shows (whether or not WiPay/2Checkout is configured); the admin can still hide it manually via the dedicated option.
- **Multi-country**: field labels (IBAN/BIC, account number, etc.) adapt to the selected country in the transfer confirmation.
- **New "✅ Validated transfers" page**: history of validated transfers with **filters** (validation date range, min/max amount, search by ref./client/email/ID), KPIs (count + total collected) and **Excel (.xls), CSV, XML and PDF exports** (PDF via the browser's printable view).
- **Validate / Reject buttons** on the "Transfers" page redesigned (flex container, icons, no more overlap or clipping at the column edge).
- **Reference & booking number** fixed on the "Transfers to validate" page: the SQL column `ID` (uppercase) was not read (`$booking->id` → 0), which displayed "LPP-0" and hid the proof. The booking number now appears under the reference.
- **"I'll confirm later" link** hidden during processing (prevents double-clicks).
- **English translations** completed ("proof required" message, "I'll confirm later", accepted formats, new validated-transfers page and its exports).

---
v1.7.21 📅 15 juin 2026
[1.7.21] - 2026-06-15

### ✨ Compatibilité Listeo Booking Plus (LBP) / Listeo Booking Plus compatibility

---

#### 🇫🇷 Français

##### Intégration de la modale LBP (paiement avant création)

- **Contexte** : Listeo Booking Plus remplace le widget de réservation et introduit une modale multi-étapes. Le formulaire de paiement LPP ne s'affichait plus et la commande/réservation était créée avant paiement.
- **Solution** : nouveau pont LBP (`includes/lbp-compat/class-lbp-modal-integration.php` + `assets/js/lpp-lbp-modal.js`). On intercepte la requête `lbp_submit_booking` : 1er clic → on réclame le paiement sans rien créer ; après encaissement LPP (Stripe / PayPal / Cash), un jeton vérifié re-déclenche LBP qui crée alors la réservation + la commande, immédiatement marquée payée. **Rien n'est créé tant que le paiement n'a pas réussi.** Aucune modification de LBP.
- **Méthodes à redirection** (WiPay, 2Checkout) masquées dans la modale et désactivées/grisées dans les réglages quand le mode Booking Popup est actif (incompatibles : la redirection détruit la modale).

##### Finalisation complète après paiement externe

- Nouvelle méthode publique `finalize_external_paid_order()` qui réplique tout le flux LPP standard pour les commandes créées via LBP : statut pré-autorisation (`on-hold`) vs paiement direct (`completed`), métadonnées Stripe (`_lpp_payment_intent_id`, `_stripe_payment_intent_id`, `_stripe_charge_id`, `_lpp_is_preauth`…), commissions, transferts Stripe Connect (immédiats ou différés), passerelles vendeur, et politique d'annulation. Garantit la compatibilité avec les plugins de remboursement/annulation.

##### Affichage

- **Mode par défaut = Intégré (inline)** : le formulaire s'affiche directement dans l'étape de confirmation de la modale (au lieu d'un popup superposé).
- **Popup corrigé** : le formulaire s'affichait « en deux morceaux » (un enfant `.col-md-12` en `float:left` effondrait la hauteur de la boîte) → conteneur en `flow-root` + `float:none`, boîte blanche unique et nette ; modale LBP totalement masquée derrière (plus de bouton « Back » fantôme).
- **Bloc acompte** désormais affiché sous le bouton « Book Now » de LBP sur la page annonce (bloc statique, l'ancien bloc dépendait du JS du widget Core absent) et en pleine largeur au-dessus du paiement dans la modale.
- **Politique d'annulation** affichée dans la modale (au-dessus de l'acompte), avec espacement correct.
- **Auto-défilement** vers la zone de paiement au clic sur « Payer et confirmer ».

##### Correctif redirection

- Après paiement, la page partait en 404 (`/undefined`) : LBP planifiait `window.location = data.redirect_url` et on supprimait `redirect_url` trop tard. On le retire maintenant **avant** le handler LBP → l'étape de succès de la modale s'affiche, sans redirection vers le checkout WooCommerce.

---

#### 🇬🇧 English

##### Listeo Booking Plus modal integration (pay before creating)

- **Context**: Listeo Booking Plus replaces the booking widget with a multi-step modal. The LPP payment form no longer appeared and the order/booking was created before payment.
- **Solution**: new LBP bridge (`includes/lbp-compat/class-lbp-modal-integration.php` + `assets/js/lpp-lbp-modal.js`). We intercept the `lbp_submit_booking` request: first click → request payment without creating anything; after LPP collects payment (Stripe / PayPal / Cash), a verified token re-fires LBP, which then creates the booking + order, immediately marked as paid. **Nothing is created until payment succeeds.** No changes to LBP.
- **Redirect gateways** (WiPay, 2Checkout) hidden in the modal and disabled/greyed out in settings while Booking Popup mode is active (incompatible: the redirect destroys the modal).

##### Full post-payment finalization

- New public method `finalize_external_paid_order()` replicating the standard LPP flow for LBP-created orders: pre-authorization status (`on-hold`) vs direct payment (`completed`), Stripe metadata (`_lpp_payment_intent_id`, `_stripe_payment_intent_id`, `_stripe_charge_id`, `_lpp_is_preauth`…), commissions, Stripe Connect transfers (immediate or deferred), vendor gateways, and cancellation policy. Ensures compatibility with refund/cancellation add-ons.

##### Display

- **Default mode = Inline** (within the confirmation step) instead of an overlay popup.
- **Popup fixed**: the form rendered "in two pieces" (a `float:left` `.col-md-12` child collapsed the box height) → `flow-root` container + `float:none`, single clean white card; LBP modal fully hidden behind (no ghost "Back" button).
- **Deposit block** now shown below LBP's "Book Now" button on the listing page (static block; the old block relied on the now-absent Core widget JS) and full width above payment in the modal.
- **Cancellation policy** shown in the modal (above the deposit), with proper spacing.
- **Auto-scroll** to the payment area when clicking "Pay and Confirm".

##### Redirect fix

- After payment the page went to a 404 (`/undefined`): LBP scheduled `window.location = data.redirect_url` and we removed `redirect_url` too late. It is now removed **before** the LBP handler → the modal success step shows, with no redirect to the WooCommerce checkout.
v1.7.8 📅 19 mai 2026
[1.7.8] - 2026-05-19

### 🐛 Bug Fix — PayPal : erreur lors du paiement / PayPal payment error

---

#### 🇫🇷 Français

##### Cause 1 — Secret PayPal manquant non détecté

- **Problème** : En mode WooCommerce PPCP, `is_paypal_available()` retournait `true` dès qu'un `client_id` était présent, même si le `client_secret` était vide. Les boutons PayPal s'affichaient, mais l'appel OAuth échouait immédiatement → **"Error"** rouge dans le formulaire.
- **Correction** : `is_paypal_available()` vérifie désormais que `paypal_client_id` **et** `paypal_secret` sont tous les deux non vides.
- **Fichier** : `listeo-paiement-prealable.php` — méthode `is_paypal_available()`

##### Cause 2 — Intent SDK/commande incohérent en mode Vendeur (pré-autorisation)

- **Problème** : En mode Passerelle Vendeur, le rechargement du SDK PayPal forçait `intent=capture` même quand la pré-autorisation était activée. PayPal rejetait la commande car l'intent du SDK (`capture`) ne correspondait pas à celui de la commande créée côté serveur (`AUTHORIZE`).
- **Correction** : Le SDK vendeur utilise désormais `lpp_vars.paypal_intent` (transmis par PHP) au lieu de la valeur codée en dur `capture`.
- **Fichier** : `assets/js/frontend.js` — fonction `initPayPal()`

##### Cause 3 — Capture/Autorisation avec les clés admin au lieu des clés vendeur

- **Problème** : `ajax_capture_paypal_order()` et `ajax_authorize_paypal_order()` utilisaient toujours les clés PayPal admin pour capturer/autoriser la commande, même si celle-ci avait été créée avec les clés du vendeur. PayPal retournait une erreur d'authentification.
- **Correction** : Les deux handlers résolvent désormais les clés vendeur depuis le `listing_id` contenu dans les données de réservation, exactement comme `ajax_create_paypal_order()`.
- **Fichiers** : `listeo-paiement-prealable.php` — méthodes `ajax_capture_paypal_order()`, `ajax_authorize_paypal_order()`

##### Cause 4 — Clé `sandbox` inexistante dans void pré-auth vendeur

- **Problème** : `void_paypal_preauth_on_reject()` lisait `$vendor_keys['sandbox']` alors que `get_vendor_paypal_keys()` retourne la clé `test_mode`. `$sandbox` valait `null` → API live utilisée pour des clés sandbox → void échouait silencieusement.
- **Correction** : `$vendor_keys['sandbox']` → `$vendor_keys['test_mode']`.
- **Fichier** : `listeo-paiement-prealable.php` — méthode `void_paypal_preauth_on_reject()`

##### Cause 5 — Capture pré-auth toujours avec clés admin

- **Problème** : `capture_paypal_preauth_on_accept()` ne vérifiait pas le meta `_lpp_vendor_gateway` et utilisait systématiquement les clés admin, même pour les commandes passées via la passerelle vendeur.
- **Correction** : Ajout de la même logique de résolution des clés vendeur que dans `void_paypal_preauth_on_reject()`.
- **Fichier** : `listeo-paiement-prealable.php` — méthode `capture_paypal_preauth_on_accept()`

---

#### 🇬🇧 English

##### Cause 1 — Missing PayPal secret not detected

- **Issue**: In WooCommerce PPCP mode, `is_paypal_available()` returned `true` as soon as a `client_id` was present, even when `client_secret` was empty. PayPal buttons would render, but the OAuth call would fail immediately → red **"Error"** in the payment form.
- **Fix**: `is_paypal_available()` now checks that both `paypal_client_id` **and** `paypal_secret` are non-empty.
- **File**: `listeo-paiement-prealable.php` — method `is_paypal_available()`

##### Cause 2 — SDK/order intent mismatch in Vendor Gateway mode (pre-auth)

- **Issue**: In Vendor Gateway mode, reloading the PayPal SDK hardcoded `intent=capture` even when pre-authorization was enabled. PayPal rejected the order because the SDK intent (`capture`) did not match the server-side order intent (`AUTHORIZE`).
- **Fix**: The vendor SDK now uses `lpp_vars.paypal_intent` (passed from PHP) instead of the hardcoded `capture` value.
- **File**: `assets/js/frontend.js` — function `initPayPal()`

##### Cause 3 — Capture/Authorize using admin keys instead of vendor keys

- **Issue**: `ajax_capture_paypal_order()` and `ajax_authorize_paypal_order()` always used the admin PayPal credentials to capture/authorize the order, even when it was created with vendor keys. PayPal returned an authentication error.
- **Fix**: Both handlers now resolve vendor keys from the `listing_id` in the booking data, exactly like `ajax_create_paypal_order()` does.
- **Files**: `listeo-paiement-prealable.php` — methods `ajax_capture_paypal_order()`, `ajax_authorize_paypal_order()`

##### Cause 4 — Non-existent `sandbox` key in vendor pre-auth void

- **Issue**: `void_paypal_preauth_on_reject()` read `$vendor_keys['sandbox']`, but `get_vendor_paypal_keys()` returns `test_mode`. `$sandbox` was `null` → live API used for sandbox credentials → void failed silently.
- **Fix**: `$vendor_keys['sandbox']` → `$vendor_keys['test_mode']`.
- **File**: `listeo-paiement-prealable.php` — method `void_paypal_preauth_on_reject()`

##### Cause 5 — Pre-auth capture always using admin keys

- **Issue**: `capture_paypal_preauth_on_accept()` did not check the `_lpp_vendor_gateway` meta and always used admin credentials, even for orders placed through a vendor gateway.
- **Fix**: Added the same vendor key resolution logic as in `void_paypal_preauth_on_reject()`.
- **File**: `listeo-paiement-prealable.php` — method `capture_paypal_preauth_on_accept()`

---
v1.7.7 📅 16 mars 2026
[1.7.7] - 2026-03-16

### 🐛 Bug Fix — Multi-Payout affiché hors Wallet quand la page Wallet est désactivée

---

#### 🇫🇷 Français

- **Problème** : La section *Payout Methods / MultiPayout* pouvait s'afficher sur des pages du dashboard même lorsque la page Wallet Listeo était configurée sur `--Disabled--`.
- **Cause** : La détection de page utilisait `is_page( $wallet_page_id )` sans vérifier explicitement si `listeo_wallet_page` était vide/0.
- **Correction** : Ajout d'un garde strict avec `absint()` et retour immédiat si `listeo_wallet_page <= 0` dans les deux points d'injection:
- `hide_original_payout_section()`
- `inject_multi_payout_in_wallet()`
- **Fichier** : `listeo-paiement-prealable.php`

---

#### 🇬🇧 English

- **Issue**: The *Payout Methods / MultiPayout* block could appear on dashboard pages even when the Listeo Wallet page was set to `--Disabled--`.
- **Cause**: Page detection used `is_page( $wallet_page_id )` without explicitly guarding against empty/0 `listeo_wallet_page`.
- **Fix**: Added a strict guard using `absint()` and early return when `listeo_wallet_page <= 0` in both injection points:
- `hide_original_payout_section()`
- `inject_multi_payout_in_wallet()`
- **File**: `listeo-paiement-prealable.php`

---
v1.7.6 📅 05 mars 2026
[1.7.6] - 2026-03-05

### 🐛 Bug Fix — Doublon d'email admin / Admin email duplicate

---

#### 🇫🇷 Français

##### Suppression du doublon de notification admin

- **Problème** : À chaque nouvelle réservation créée via paiement préalable, l'admin recevait **deux emails** : un email stylé HTML envoyé par le plugin *Listeo Email Template (LET)*, et un email plain-text généré directement par ce plugin (`[SITE_NAME] Nouvelle réservation #ID - Listing`).
- **Cause** : La méthode `send_booking_emails()` envoyait systématiquement un email plain-text à l'admin via `wp_mail()` sans vérifier si LET allait déjà gérer cette notification.
- **Correction** : L'email plain-text admin n'est désormais envoyé **que si** le plugin Listeo Email Template est absent ou désactivé (`let_enabled !== yes` ou `let_email_admin !== yes`). Si LET est actif, il prend en charge la notification admin avec son template stylé — LPP ne renvoie rien.
- **Fichier** : `listeo-paiement-prealable.php` — méthode `send_booking_emails()` (~ligne 15826)

---

#### 🇬🇧 English

##### Removed duplicate admin notification email

- **Problem**: On every new booking created via prepayment, the admin received **two emails**: a styled HTML email sent by the *Listeo Email Template (LET)* plugin, and a plain-text email generated directly by this plugin (`[SITE_NAME] New booking #ID - Listing`).
- **Cause**: The `send_booking_emails()` method was unconditionally sending a plain-text email to admin via `wp_mail()` without checking whether LET would already handle this notification.
- **Fix**: The plain-text admin email is now sent **only if** the Listeo Email Template plugin is absent or inactive (`let_enabled !== yes` or `let_email_admin !== yes`). When LET is active, it handles the admin notification with its styled template — LPP sends nothing.
- **File**: `listeo-paiement-prealable.php` — method `send_booking_emails()` (~line 15826)

---
v1.7.5 📅 02 mars 2026
[1.7.5] - 2026-03-02

### ✨ New Features — Wallet Payout Visibility Controls

---

#### 🇫🇷 Français

##### Contrôle de visibilité des méthodes de payout dans le Wallet

**PayPal — affichage conditionnel**
- La section PayPal dans le Wallet n'est désormais visible que si PayPal est réellement configuré et activé dans le plugin (`is_paypal_available()`)
- Avant : la section s'affichait dès que l'option Listeo Core `listeo_payout_options` contenait `'paypal'`, même si PayPal n'était pas configuré dans LPP
- **Fichier** : `templates/wallet-multi-payout.php`

**Virement Bancaire — affichage conditionnel automatique**
- La section Virement Bancaire dans le Wallet n'est désormais visible que si WiPay **ou** 2Checkout est configuré (`is_wipay_available() || is_2checkout_available()`)
- Si aucun de ces deux gateways n'est actif, la section est masquée automatiquement (elle n'est utile que pour leurs paiements qui n'ont pas de payout automatique)
- **Fichier** : `templates/wallet-multi-payout.php`

**Nouveau paramètre admin — Masquer Virement Bancaire**
- Ajout de l'option `lpp_hide_bank_transfer_wallet` dans la section *Vérification Payout Propriétaire* des paramètres admin
- Permet à l'administrateur de forcer le masquage du Virement Bancaire dans le Wallet, même si WiPay/2Checkout est configuré
- Un message d'information contextuel s'affiche si WiPay et 2Checkout ne sont pas configurés (masquage déjà automatique)
- **Fichiers** : `templates/admin-settings.php`, `listeo-paiement-prealable.php`

**Tableau de statut enrichi (section Vérification Payout Propriétaire)**
- Le tableau de statut des gateways affiche maintenant 4 indicateurs : Stripe Connect, PayPal, WiPay, 2Checkout
- Chaque indicateur est vert si configuré, rouge si absent (pour les gateways principaux), gris si optionnel et non configuré
- **Fichier** : `templates/admin-settings.php`

**Traductions anglaises**
- Ajout des 3 nouvelles chaînes dans `languages/listeo-paiement-prealable-en_US.po`
- **Fichier** : `languages/listeo-paiement-prealable-en_US.po`

---

#### 🇬🇧 English

##### Payout method visibility controls in Wallet

**PayPal — conditional display**
- The PayPal section in the Wallet is now only visible if PayPal is actually configured and enabled in the plugin (`is_paypal_available()`)
- Previously: the section appeared as soon as Listeo Core option `listeo_payout_options` contained `'paypal'`, even if PayPal was not configured in LPP

**Bank Transfer — automatic conditional display**
- The Bank Transfer section in the Wallet is now only visible if WiPay **or** 2Checkout is configured (`is_wipay_available() || is_2checkout_available()`)
- If neither gateway is active, the section is automatically hidden (it is only relevant for payments from these gateways which have no automatic payout)

**New admin setting — Hide Bank Transfer**
- Added `lpp_hide_bank_transfer_wallet` option in the *Owner Payout Verification* admin settings section
- Allows the administrator to force-hide the Bank Transfer section in the Wallet, even when WiPay/2Checkout is configured
- A contextual info message is shown if WiPay and 2Checkout are not configured (auto-hidden already applies)

**Enhanced gateway status dashboard**
- The gateway status table now shows 4 indicators: Stripe Connect, PayPal, WiPay, 2Checkout
- Each indicator is green if configured, red if missing (for main gateways), grey if optional and not configured
v1.7.4 📅 20 février 2026
[1.7.4] - 2026-02-20

### 🐛 Bug Fixes — Multi-Payout / Stripe Connect

---

#### 🇫🇷 Français

##### Problème 1 — Page Wallet cassée lors de l'activation de Multi-Payout (PHP Fatal Error)
- **Symptôme** : `Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, string given` dans `wallet-multi-payout.php` ligne 176
- **Cause** : `get_option('listeo_payout_options', ...)` retournait une chaîne vide `''` (option mal enregistrée en base) au lieu du tableau par défaut. PHP 8.x est strict sur le type du 2ème argument de `in_array()`
- **Correction** : Ajout d'une vérification `is_array()` après `get_option()` — si la valeur n'est pas un tableau, réinitialisation au tableau par défaut `['bank', 'paypal']`
- **Fichier** : `templates/wallet-multi-payout.php`

##### Problème 2 — Bouton "Connecter Stripe" inactif / scroll vers le haut
- **Symptôme** : Cliquer sur "Connecter Stripe" (mode Express) ne faisait rien (scroll en haut de page ou absence de réaction)
- **Cause** :
1. Le bouton utilisait la classe `listeo-create-stripe-express-link-account` — identique à celle écoutée par le `frontend.js` de Listeo Core. Les deux handlers se déclenchaient simultanément, créant deux comptes Express Stripe en parallèle et une redirection incohérente
2. Le script `multi-payout.js` n'était pas chargé sur la page wallet si la détection de page échouait (URL ou ID de page non reconnus)
3. La délégation d'événement JavaScript était conditionnelle (`if ($stripeBtn.length)`) — si le bouton n'était pas trouvé au moment du poll, le handler n'était jamais attaché
- **Corrections** :
1. Renommage de la classe du bouton : `listeo-create-stripe-express-link-account` → `lpp-create-stripe-express-link-account` (et `real-conntect-w-stripe-btn` → `lpp-real-connect-stripe-btn`) pour éviter tout conflit avec Listeo Core
2. `href="#"` remplacé par `href="javascript:void(0)"` sur le bouton — empêche le scroll-to-top natif même si le JS ne s'attache pas
3. La délégation d'événement est maintenant **inconditionnelle** et attachée immédiatement au `document.ready`, sans attendre le polling
4. Forçage du chargement de `multi-payout.js` directement dans `inject_multi_payout_in_wallet()` si le script n'est pas déjà enqueued
5. Ajout d'un **handler AJAX inline** complet directement dans le script d'injection — fonctionnel même si `multi-payout.js` n'est pas chargé
- **Fichiers modifiés** : `templates/wallet-multi-payout.php`, `assets/js/multi-payout.js`, `listeo-paiement-prealable.php`

##### Problème 3 — PHP Warning variable `$show_bank_warning` non définie
- **Symptôme** : `PHP Warning: Undefined variable $show_bank_warning` dans `wallet-multi-payout.php` ligne 271
- **Correction** : Variable définie avant la section Virement Bancaire — `true` si la méthode bancaire est activée mais sans coordonnées renseignées
- **Fichier** : `templates/wallet-multi-payout.php`

---

#### 🇬🇧 English

##### Issue 1 — Wallet page broken when Multi-Payout is activated (PHP Fatal Error)
- **Symptom**: `Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, string given` in `wallet-multi-payout.php` line 176
- **Root cause**: `get_option('listeo_payout_options', ...)` was returning an empty string `''` (option incorrectly saved in database) instead of the default array. PHP 8.x enforces strict type checking on `in_array()`'s second argument
- **Fix**: Added `is_array()` check after `get_option()` — if the value is not an array, it resets to the default `['bank', 'paypal']`
- **File**: `templates/wallet-multi-payout.php`

##### Issue 2 — "Connect Stripe" button inactive / page scrolling to top
- **Symptom**: Clicking "Connect Stripe" (Express mode) did nothing (page scrolled to top or no reaction at all)
- **Root cause**:
1. The button used the class `listeo-create-stripe-express-link-account` — the exact same class listened to by Listeo Core's `frontend.js`. Both handlers fired simultaneously, creating two Express Stripe accounts in parallel and causing an inconsistent redirect
2. The `multi-payout.js` script was not loaded on the wallet page if page detection failed (URL or page ID not recognized by `enqueue_wallet_assets()`)
3. JavaScript event delegation was conditional (`if ($stripeBtn.length)`) — if the button was not found during polling, the handler was never attached
- **Fixes**:
1. Button class renamed: `listeo-create-stripe-express-link-account` → `lpp-create-stripe-express-link-account` (and `real-conntect-w-stripe-btn` → `lpp-real-connect-stripe-btn`) to avoid any conflict with Listeo Core
2. `href="#"` replaced by `href="javascript:void(0)"` — prevents native scroll-to-top even if JS does not attach
3. Event delegation is now **unconditional** and attached immediately on `document.ready`, without waiting for polling
4. Force-loading of `multi-payout.js` directly inside `inject_multi_payout_in_wallet()` if the script is not already enqueued
5. Added a complete **inline AJAX handler** directly in the injection script — works even if `multi-payout.js` is not loaded
- **Files modified**: `templates/wallet-multi-payout.php`, `assets/js/multi-payout.js`, `listeo-paiement-prealable.php`

##### Issue 3 — PHP Warning undefined variable `$show_bank_warning`
- **Symptom**: `PHP Warning: Undefined variable $show_bank_warning` in `wallet-multi-payout.php` line 271
- **Fix**: Variable now defined before the Bank Transfer section — `true` if bank method is enabled but bank details are empty
- **File**: `templates/wallet-multi-payout.php`

---
v1.7.3 📅 08 février 2026
[1.7.3] - 2026-02-08

### 🐛 Correction critique : Prix détecté = 0 pour les services avec time picker

#### Problème
- Pour les annonces de type **service** avec "Enable Price per Hour" et "Enable End Hour time-picker" activés, la page de confirmation de réservation affichait : `LPP Debug: Prix détecté = 0. Le formulaire de paiement ne s'affiche pas pour les réservations gratuites.`
- Le formulaire de paiement Stripe/PayPal ne s'affichait pas, rendant la réservation impossible

#### Cause racine (bug Listeo Core)
- Quand l'utilisateur ne sélectionne pas d'heure de fin (ou que le champ end hour n'est pas affiché), la variable `$hour_end` reste **non initialisée** dans `booking_confirmation_form()`
- `calculate_price_per_hour()` reçoit `null` pour `$end_hour`, causant `strtotime(null) = false = 0`
- La différence d'heures devient astronomiquement négative (~-480 000 heures), le prix total devient un nombre négatif extrême
- LPP détecte `price
v1.7.2 📅 20 janvier 2026
[1.7.2] - 2026-01-20

### 🐛 Corrections de bugs

#### Correction erreur JavaScript avec traductions
- **Problème** : `Uncaught SyntaxError: missing ) after argument list` quand le site est dans une langue contenant des apostrophes (ex: français)
- **Cause** : Les chaînes traduites dans le JavaScript inline contenaient des apostrophes non échappées
- **Solution** : Utilisation de `esc_js()` pour toutes les traductions dans le contexte JavaScript
- **Fichier corrigé** : `templates/license-page.php` (7 instances corrigées)

### 🌐 Amélioration compatibilité Loco Translate

#### Recherche étendue des fichiers de traduction
- **Nouveau chemin** : `wp-content/languages/loco/plugins/` (chemin personnalisé Loco)
- **Ordre de priorité mis à jour** :
1. Loco Translate - Chemin personnalisé (`/loco/plugins/`)
2. Loco Translate - Dossier global standard (`/plugins/`)
3. Dossier languages du plugin
4. Loco Translate - Sous-dossier avec nom du plugin
5. Loco Translate - Chemin alternatif dans loco
- **Impact** : Les langues créées avec Loco dans un chemin personnalisé sont maintenant correctement détectées
v1.7.1 📅 17 janvier 2026
[1.7.1] - 2026-01-17

### 🌐 Compatibilité Loco Translate & Traductions

**📄 Fichier POT créé**
- Fichier template `languages/listeo-paiement-prealable.pot` généré avec 1962 chaînes de traduction
- Compatible avec Loco Translate et tous les outils de traduction standards

**🔍 Détection dynamique des langues**
- La liste des langues dans les paramètres scanne automatiquement les fichiers `.mo`
- Détection dans le dossier `languages/` du plugin
- Détection dans le dossier global WordPress (`wp-content/languages/plugins/`)
- Nouvelles langues ajoutées avec Loco Translate apparaissent automatiquement

**📂 Chargement multi-emplacements**
- Vérifie d'abord le dossier global Loco Translate
- Puis le dossier du plugin
- Puis le système WordPress standard

**📝 Documentation**
- Nouvelle section "Traductions & Loco Translate" ajoutée à la documentation (Section 15)
- Instructions détaillées pour ajouter de nouvelles langues
- Explication de la structure des fichiers de traduction
v1.7.0 📅 04 janvier 2026
[1.7.0] - 2026-01-04

### 🏪 Passerelles de Paiement Vendeur (Vendor Gateways)

#### Nouvelle fonctionnalité majeure
Les vendeurs peuvent désormais configurer leurs propres clés API de paiement pour recevoir les paiements directement, sans commission ni transfert via l'administrateur.

### ✨ Fonctionnalités

#### 💳 Configuration Vendeur Multi-Passerelles
- **4 passerelles supportées** : Stripe, PayPal, WiPay et 2Checkout
- **Menu "Mes Paiements"** : Nouvelle page dans le tableau de bord vendeur
- **Configuration indépendante** : Chaque vendeur peut activer/désactiver ses méthodes
- **Clés API personnelles** : Le vendeur saisit ses propres clés API
- **Mode test/production** : Support des deux modes pour chaque passerelle

#### 🔐 Contrôle d'Accès Sécurisé
- **Option admin globale** : "Enable Vendor Payment Gateways" dans les paramètres
- **Contrôle par package SFL** : Option "Allow custom gateways" dans les packages d'abonnement
- **Vérification triple** : Admin + Package + Activation vendeur
- **Protection abonnement expiré** : Fallback automatique vers clés admin si abonnement invalide

#### 💰 Paiement Direct au Vendeur
- **Sans commission** : Aucune commission créée pour les paiements via clés vendeur
- **Sans transfert Stripe Connect** : Pas de transfert, le paiement va directement au vendeur
- **Indicateur visuel** : "Vendor Direct Payment" affiché dans la section paiement
- **Méthodes dynamiques** : Seules les méthodes activées ET configurées par le vendeur sont affichées

#### 🔄 Intégration Système d'Acompte
- **Acompte + Passerelle Vendeur** : Le paiement de l'acompte utilise les clés vendeur
- **Solde automatique** : Le paiement du solde utilise automatiquement les mêmes clés vendeur
- **Page checkout solde** : Affiche uniquement les méthodes du vendeur original
- **Métadonnée persistante** : `_lpp_vendor_gateway` stockée sur la commande

#### 🔒 Pré-autorisation Vendeur
- **Capture via clés vendeur** : La capture utilise les clés de la réservation originale
- **Annulation via clés vendeur** : L'annulation de pré-auth utilise les clés originales
- **PayPal void** : Annulation PayPal avec les clés vendeur si applicable

#### ↩️ Remboursement Sécurisé
- **Utilisation clés originales** : Les remboursements utilisent les clés du paiement original
- **Paramètre `skip_auth_check`** : Ignore les vérifications d'abonnement pour les refunds
- **Protection post-désabonnement** : Fonctionne même si le vendeur s'est désabonné
- **Support 4 passerelles** : Remboursement Stripe, PayPal (manuel), WiPay (manuel), 2Checkout (API)

### 🔧 Améliorations techniques

#### Nouvelles fonctions
- **`get_vendor_stripe_keys($owner_id, $skip_auth_check)`** : Récupère les clés Stripe du vendeur
- **`get_vendor_paypal_keys($owner_id, $skip_auth_check)`** : Récupère les clés PayPal du vendeur
- **`get_vendor_wipay_keys($owner_id, $skip_auth_check)`** : Récupère les clés WiPay du vendeur
- **`get_vendor_2checkout_keys($owner_id, $skip_auth_check)`** : Récupère les clés 2Checkout du vendeur
- **`vendor_can_configure_gateways($user_id)`** : Vérifie si le vendeur peut configurer ses passerelles
- **`render_vendor_gateways_shortcode()`** : Affiche le formulaire de configuration vendeur

#### Métadonnées
- **`_lpp_vendor_gateway`** : 'yes'/'no' sur la commande WooCommerce
- **`using_vendor_gateway`** : Flag dans les métadonnées PaymentIntent et transients
- **User meta vendeur** : `lpp_vendor_gateway_enabled`, `lpp_vendor_stripe_*`, `lpp_vendor_paypal_*`, etc.

#### Modifications AJAX
- **`ajax_create_stripe_payment_intent()`** : Support clés vendeur + publishable key dynamique
- **`ajax_capture_paypal_order()`** / `ajax_authorize_paypal_order()` : Support clés vendeur
- **`ajax_create_wipay_checkout()`** / `ajax_create_2checkout_checkout()` : Support clés vendeur
- **Tous les handlers solde** : Support clés vendeur automatique

### 📚 Documentation
- **Nouvelle section 14** : "Passerelles de Paiement Vendeur" dans la documentation
- **Guide configuration** : Instructions pas à pas pour admin et vendeur
- **FAQ intégrée** : Questions fréquentes sur le système

### 🌐 Traductions
- **Français** : Toutes les nouvelles chaînes traduites
- **Anglais** : Traductions complètes en_US

---

## [1.6.1] - 2026-01-03

**✨ Nouvelle fonctionnalité : Contrôle d'Acompte via Packages de Souscription**

📦 Intégration Subscription for Listeo
- **Nouveau toggle admin** : "Contrôle via packages de souscription" (`lpp_deposit_subscription_control`) dans la section Acompte des paramètres
- **Vérification package** : Quand activé, le bouton "Acompte" sur la page Mes Annonces n'apparaît que pour les vendeurs dont le package de souscription autorise la personnalisation d'acompte
- **Détection automatique** : Le toggle affiche si le plugin Subscription for Listeo est installé ou non
- **Documentation intégrée** : Instructions de configuration affichées dans l'interface admin

🔧 Modifications techniques
- **`add_deposit_config_button()`** : Vérification du package via `SFL_Subscription_Manager::owner_allows_deposit()`
- **`inject_deposit_config_modal()`** : Même vérification pour le modal de configuration
- **Nouvelle option** : `lpp_deposit_subscription_control` sauvegardée dans les paramètres

📋 Comment ça fonctionne
1. Activez le système d'acompte dans Prealable → Réglages → Acompte
2. Activez "Permettre aux vendeurs de personnaliser l'acompte"
3. Activez "Contrôle via packages de souscription"
4. Dans Subscription for Listeo, éditez un package WooCommerce et cochez "Autoriser la personnalisation d'acompte"
5. Seuls les vendeurs avec ce package verront le bouton 💰 "Acompte" sur Mes Annonces

---

## [1.6.0] - 2026-01-03

**✨ Nouvelles fonctionnalités**

💰 Multi-Payout pour Vendeurs
- **Configuration multi-méthodes** : Les vendeurs peuvent maintenant configurer plusieurs méthodes de payout simultanément (Stripe Connect + PayPal + Virement bancaire)
- **Payout intelligent** : Le système détermine automatiquement la méthode de payout en fonction du mode de paiement utilisé par le client
- **Logique automatique** :
- Client paie par Stripe → Transfert automatique via Stripe Connect
- Client paie par PayPal → Payout automatique PayPal (si activé)
- Autres méthodes (WiPay, 2Checkout, Cash) → Virement bancaire manuel

🎨 Nouvelle interface Wallet
- **Section Multi-Payout** : Remplace la section "Payout Methods" de Listeo avec une interface moderne
- **Toggles individuels** : Activation/désactivation de chaque méthode de payout
- **Statuts visuels** : Badges "Connecté" / "Configuré" pour chaque méthode
- **Bouton Déconnecter** : Les vendeurs peuvent maintenant déconnecter leur compte Stripe Connect
- **Validation en temps réel** : Vérification des données saisies avant sauvegarde

⚙️ Paramètres Admin
- **Option activation** : Toggle pour activer/désactiver le Multi-Payout dans les paramètres
- **Configuration Bank Transfer** : Nouvelles options d'avertissement et de blocage pour les coordonnées bancaires
- **Documentation intégrée** : Explication du fonctionnement dans l'admin

🎯 Payout Manuel Intelligent (Admin)
- **Remplacement du bouton "Make Payout"** : Le bouton standard de Listeo est remplacé par un bouton intelligent
- **Modal de payout** : Popup moderne affichant toutes les informations du vendeur
- **Aperçu des méthodes** : Visualisation des méthodes configurées par le vendeur (Stripe/PayPal/Bank)
- **Sélection de méthode** : L'admin choisit via quelle méthode effectuer le payout manuel
- **Détails du payout** : Affichage des coordonnées PayPal ou bancaires du vendeur
- **Référence de transaction** : Champ pour noter le numéro de transaction (PayPal ID, etc.)
- **Notes internes** : Champ de notes pour l'admin
- **Liste des commissions** : Tableau des commissions qui seront marquées comme payées
- **Historique complet** : Payout enregistré avec toutes les informations dans l'historique Listeo

**🔧 Améliorations techniques**

- **`LPP_Multi_Payout`** : Nouvelle classe dédiée à la gestion multi-payout
- **`get_vendor_payout_methods()`** : Récupère toutes les méthodes configurées par un vendeur
- **`determine_payout_method()`** : Logique intelligente de sélection de payout
- **`ajax_get_vendor_payout_info()`** : Endpoint AJAX pour récupérer les infos payout d'un vendeur
- **`ajax_process_manual_payout()`** : Endpoint AJAX pour traiter le payout manuel
- **`render_admin_payout_modal()`** : Génère le HTML du modal admin
- **Injection JavaScript** : Override propre de la section wallet sans modifier Listeo Core
- **Override bouton admin** : Remplacement dynamique du bouton "Make Payout" par JavaScript
- **Compatibilité legacy** : Mise à jour du `listeo_core_payment_type` pour compatibilité

**📚 Documentation**

- **Section Multi-Payout** : Documentation complète du nouveau système
- **Section Payout Manuel** : Documentation du système de payout admin
- **Traductions** : Nouvelles chaînes traduites en français et anglais

---

## [1.5.1] - 2026-01-03

**✨ Nouvelles fonctionnalités**

🔄 Souscriptions WiPay & 2Checkout
- **Intégration WiPay Subscriptions** : Préparation du support des abonnements récurrents via WiPay (Caraïbes)
- **Intégration 2Checkout Subscriptions** : Préparation du support des abonnements récurrents via 2Checkout (Verifone)
- **Architecture identique PayPal** : Les deux passerelles suivent exactement le même modèle d'intégration que PayPal
- **Mode Direct/WooCommerce** : Support des deux modes pour Stripe, PayPal et 2Checkout
- **Mode Direct uniquement** : WiPay reste en mode direct (pas de plugin WooCommerce)

🛡️ Vérification d'activation améliorée
- **`payment_enabled`** : Nouvelle vérification qui empêche d'activer les souscriptions si la méthode de paiement principale n'est pas activée
- **Messages conditionnels** : Affichage de messages d'erreur clairs si les clés ne sont pas configurées ou si la méthode n'est pas activée
- **Toggle désactivé** : Le toggle de souscription est grisé si les conditions ne sont pas remplies

🏷️ Badges de mode
- **Badge Direct/WooCommerce** : Affichage du mode de configuration pour chaque passerelle
- **Badge code pays** : Affichage du code pays pour WiPay (TT, JM, BB, etc.)
- **Badge Verifone** : Indication de la marque Verifone pour 2Checkout

**🔧 Améliorations techniques**

- **`LPP_Subscription_Manager`** : Nouvelles méthodes `get_wipay_keys()`, `get_2checkout_keys()`, `get_stripe_mode()`
- **Statut complet** : `get_status()` retourne maintenant `payment_enabled` et `mode` pour chaque passerelle
- **Webhooks URLs** : URLs de webhook générées pour WiPay et 2Checkout
- **Sauvegarde options** : Support de `lpp_subscription_wipay_enabled` et `lpp_subscription_2checkout_enabled`

**📚 Documentation**

- **Section mise à jour** : Documentation des 4 passerelles de souscription (Stripe, PayPal, WiPay, 2Checkout)
- **Traductions** : Nouvelles chaînes traduites en français et anglais

---

## [1.5.0] - 2026-01-03

**✨ Nouvelles fonctionnalités**

🛒 Intégration 2Checkout (Verifone)
- **Support complet 2Checkout** : Nouvelle méthode de paiement internationale (200+ pays)
- **Double mode** : Mode direct (clés API) ou mode plugin WooCommerce 2Checkout Gateway
- **Paiement direct** : Paiement sécurisé via redirect vers 2Checkout
- **Système d'acompte** : Support complet du dépôt avec 2Checkout
- **Paiement du solde** : Paiement du solde via lien avec 2Checkout
- **Remboursement API** : Remboursement automatique via l'API REST 2Checkout
- **IPN Handler** : Traitement des notifications serveur 2Checkout

🚫 Blocage Global
- **Option 2Checkout** : Ajout de 2Checkout dans les options de blocage global des méthodes de paiement

**🔧 Améliorations**

- **Interface admin** : Section complète de configuration 2Checkout avec mode test/production
- **Frontend** : Bouton de paiement 2Checkout avec design cohérent
- **JavaScript** : Handler 2Checkout dans frontend.js

**📚 Documentation**

- **Section 2Checkout** : Fonctionnalités et limitations documentées
- **Traductions** : Toutes les chaînes 2Checkout traduites en anglais

---

## [1.4.0] - 2026-01-03

**✨ Nouvelles fonctionnalités**

💳 Intégration WiPay
- **Support complet WiPay** : Nouvelle méthode de paiement pour les Caraïbes (Trinidad, Jamaïque, Barbade)
- **Paiement direct** : Paiement sécurisé via l'API WiPay
- **Gestion des callbacks** : Traitement automatique des notifications WiPay
- **Commission automatique** : Création des commissions pour payout manuel

📧 Rappels automatiques améliorés
- **Correction critique** : Correction de la requête SQL pour récupérer les réservations avec solde en attente
- **Parsing JSON correct** : Lecture du champ `comment` JSON dans `bookings_calendar` pour le statut du solde

⚡ Auto-charge amélioré
- **Correction requête SQL** : Récupération correcte des métadonnées depuis les commandes WooCommerce
- **Vérification annulation** : Vérifie `_lpp_auto_charge_cancelled` et `_lpp_balance_cancelled` avant le prélèvement
- **Métadonnées cohérentes** : Marquage cohérent des annulations dans les métadonnées de commande

**🔧 Système de Payout intelligent**

💰 Stripe Connect
- **Transfert immédiat solde** : Si Paiement Différé inactif, transfert Stripe Connect immédiat pour le solde payé
- **Notes de commande** : Indication du Transfer ID dans les notes de commande

💸 PayPal Payout
- **Détection automatique** : Vérifie si `listeo_payout_activation` = 'yes' et vendeur a `paypal_payout` configuré
- **Notes intelligentes** : Indique si le payout sera automatique ou manuel selon la configuration
- **Intégration Listeo Core** : Compatible avec le système PayPal Payout automatique de Listeo

🏦 WiPay Payout
- **Payout manuel** : Commission créée en `unpaid` pour payout manuel via Admin → Payouts

**🐛 Corrections de bugs**

- **Bouton "Mark as Paid"** : N'apparaît que si le paiement cash est la SEULE option (pas si online + cash)
- **Annulation auto-charge** : `cancel_auto_charge_for_balance()` appelé correctement après annulation/rejet
- **Métadonnées cohérentes** : `_lpp_auto_charge_cancelled` et `_lpp_auto_charge_cancelled_reason` ajoutés systématiquement

**📚 Documentation**

- **Section WiPay** : Nouvelle section complète pour l'intégration WiPay
- **Comparatif méthodes** : Tableau comparatif Stripe vs PayPal vs WiPay
- **Flux de paiement** : Diagrammes de flux pour chaque méthode

---

## [1.3.0] - 2025-12-30

**✨ Nouvelles fonctionnalités**

💵 Paiement en espèces (Cash)
- **Intégration Subscription for Listeo** : Support du paiement en espèces via les forfaits vendeurs
- **Bouton Mark as Paid** : Permet au vendeur de marquer le solde comme payé en espèces
- **Pas de commission** : Aucune commission créée pour les paiements en espèces

🚫 Blocage global des méthodes
- **Contrôle administrateur** : Bloquer complètement Stripe et/ou PayPal globalement
- **Indépendant du payout** : Le blocage global est différent de la vérification payout propriétaire

⚡ Prélèvement automatique du solde
- **Auto-charge Stripe** : Prélèvement automatique sur la carte enregistrée à la date d'échéance
- **Email d'avertissement** : Email envoyé 3 jours avant le prélèvement
- **Fallback manuel** : Lien de paiement envoyé en cas d'échec

**🐛 Corrections**

- **Compatibilité Listeo 2.x** : Corrections pour la nouvelle version de Listeo Core
- **Emails multilingues** : Support complet des traductions dans les emails

---

## [1.2.0] - 2025-12-24

**✨ Nouvelles fonctionnalités**

💳 Pré-autorisation PayPal
- **Réservation de fonds** : Pour les réservations non instantanées, le montant est réservé sur le compte PayPal du client
- **Capture automatique** : Capture automatique via le plugin "Reject Refund for Listeo" lors de l'acceptation du vendeur
- **Annulation automatique** : Libération automatique des fonds lors du rejet par le vendeur
- **Délai de 29 jours** : Support des autorisations PayPal jusqu'à 29 jours (recommandé : 5 jours comme Stripe)
- **Intégration identique à Stripe** : Même flux et même expérience utilisateur que la pré-autorisation Stripe
- **Configuration unifiée** : Utilise les mêmes clés API PayPal configurées dans le plugin

🔄 Préparation Souscriptions Stripe & PayPal
- **Nouvelle architecture** : Classe `LPP_Subscription_Manager` séparée pour gérer les souscriptions
- **Réutilisation des clés** : Les souscriptions utilisent les mêmes clés Stripe/PayPal que le plugin principal
- **Interface admin** : Nouvelle section "Souscriptions Stripe & PayPal" dans les paramètres
- **Configuration webhooks** : URLs et secrets pour les webhooks Stripe/PayPal subscriptions
- **Options d'abonnement** : Annulation en fin de période
- **Préparation plugin externe** : Infrastructure prête pour le plugin "Subscription for Listeo"

🔄 Compatibilité WooCommerce PayPal Payments v3.x
- **Nouvelle structure de données** : Support de la nouvelle façon de stocker les identifiants PayPal dans WooCommerce PayPal Payments v3.x (`woocommerce-ppcp-data-common`)
- **Rétrocompatibilité** : Fonctionne toujours avec les anciennes versions (v2.x) de WooCommerce PayPal Payments
- **Affichage amélioré** : Affichage du Merchant ID et de l'email du compte PayPal connecté dans les paramètres

🛡️ Vérification Payout par Méthode de Paiement
- **Configuration granulaire** : Options séparées pour Stripe et PayPal quand les deux sont activés
- **Avertissement par méthode** : Possibilité d'avertir le vendeur pour chaque méthode non configurée individuellement
- **Blocage par méthode** : Possibilité de bloquer uniquement la méthode non configurée (l'autre reste disponible)
- **Mode de blocage flexible** :
- "Bloquer uniquement la méthode" : Si Stripe OK mais pas PayPal → seul PayPal est bloqué
- "Bloquer tous les paiements" : Si une méthode requise manque → tout est bloqué

🚫 Blocage du bouton "Book Now"
- **Page détail listing** : Si le payout du propriétaire n'est pas configuré et le blocage est activé, le bouton "Book Now" affiche "Réservation indisponible pour le moment"
- **Message explicatif** : Un message clair indique aux clients que le service n'est pas disponible
- **Hook Listeo** : Utilisation du hook `listeo_before_booking_form` pour une intégration propre

💬 Messages Wallet améliorés
- **Messages spécifiques par méthode** : Sur la page Wallet, le vendeur voit des messages distincts pour Stripe et PayPal
- **Instructions claires** : Chaque méthode non configurée affiche des instructions pour la configurer
- **Indication du blocage** : Si le blocage est actif, le message avertit que les réservations sont bloquées

🎯 Stripe et PayPal indépendants
- **PayPal sans Stripe** : PayPal peut fonctionner même si Stripe n'est pas configuré
- **Stripe sans PayPal** : Stripe peut fonctionner même si PayPal n'est pas configuré
- **Formulaire adaptatif** : Le formulaire de paiement affiche uniquement les méthodes configurées

**🐛 Corrections de bugs

🔧 PayPal Mode Direct - Correction AJAX
- **Problème** : Les fonctions AJAX PayPal cherchaient toujours les clés dans WooCommerce, même en mode "Direct"
- **Correction** : Les fonctions AJAX utilisent maintenant les clés chargées selon le mode configuré
- **Impact** : Le message "PayPal not properly configured" n'apparaît plus quand PayPal est configuré en mode Direct

🔓 Suppression dépendance obligatoire WooCommerce Stripe Gateway
- **Problème** : Le plugin bloquait l'accès aux paramètres si WooCommerce Stripe Gateway n'était pas installé
- **Correction** : L'erreur WooCommerce Stripe Gateway est maintenant un avertissement (non bloquant)
- **Impact** : L'admin peut utiliser le plugin avec Stripe en mode Direct ou PayPal seul

✅ Activation plugin avec une seule méthode
- **Problème** : Le plugin se désactivait automatiquement si Stripe n'était pas configuré, même si PayPal était disponible
- **Correction** : Le plugin reste actif si AU MOINS UNE méthode de paiement est configurée (Stripe OU PayPal)
- **Nouvelle logique** :
- Stripe configuré + PayPal non → ✅ Plugin actif
- Stripe non + PayPal configuré → ✅ Plugin actif
- Stripe configuré + PayPal configuré → ✅ Plugin actif
- Stripe non + PayPal non → ❌ Plugin désactivé

🔧 Correction nom option PayPal
- **Problème** : La fonction de vérification PayPal cherchait `lpp_paypal_direct_enabled` au lieu de `lpp_paypal_enabled`
- **Correction** : Utilisation du bon nom d'option
- **Impact** : PayPal en mode Direct est maintenant correctement détecté

**📋 Améliorations interface admin

- **Avertissements non-critiques** : Les erreurs Stripe s'affichent en jaune/orange sans bloquer l'accès
- **Erreurs critiques** : Seules les erreurs Listeo Core et WooCommerce bloquent l'accès
- **Messages adaptatifs** : Le message "Votre carte sera débitée" est adapté selon la méthode disponible

---

## [1.1.0] - 2025-12-20

**✨ Nouvelles fonctionnalités

- Configuration directe des clés Stripe (sans WooCommerce Stripe Gateway)
- Configuration directe des clés PayPal (sans WooCommerce PayPal Payments)
- Test de connexion Stripe et PayPal depuis l'interface admin
- Mode Test/Production pour Stripe et PayPal en mode direct

---

## [1.0.0] - 2025-12-15

**🚀 Version initiale

- Paiement Stripe avant réservation
- Intégration PayPal comme méthode de paiement alternative
- Pré-autorisation bancaire pour les réservations non-instantanées
- Intégration avec Listeo Core et WooCommerce
- Gestion automatique des commandes WooCommerce
- Badge "Paid" pour les réservations payées

📖 Légende des changements

✨ Nouvelles fonctionnalités 🐛 Corrections de bugs 🚀 Améliorations 🔐 Sécurité 🗑️ Suppressions