417
edits
m (Eldy moved page Stancer to Module Stancer) |
Eric.seigne (talk | contribs) (full presentation - stancer module) Tag: 2017 source edit |
||
| Line 11: | Line 11: | ||
|webbuy={{LinkToPluginDownloadDoliStore|keyword=stancer}} | |webbuy={{LinkToPluginDownloadDoliStore|keyword=stancer}} | ||
|status=stable | |status=stable | ||
|prerequisites= | |prerequisites=PHP 7.4 minimum | ||
|minversion= | |minversion=15.0.0 | ||
|note= Utilisez Stancer comme prestataire de paiement | |note= Utilisez Stancer comme prestataire de paiement | ||
}} | }} | ||
| Line 19: | Line 19: | ||
=Qu'est-ce que le module Stancer pour Dolibarr ?= | =Qu'est-ce que le module Stancer pour Dolibarr ?= | ||
Le module Stancer | Plus de documentation sur le site de l'éditeur : https://doc.cap-rel.fr/projet_stancer/accueil | ||
Le module '''Stancer''' est un module d'intégration de la passerelle de paiement [https://www.stancer.com Stancer] dans l'ERP [https://www.dolibarr.org Dolibarr]. Il permet d'encaisser des paiements par '''carte bancaire''' (avec 3D Secure) et par '''prélèvement SEPA''', directement depuis les objets métier de Dolibarr (factures, commandes, devis, dons, cotisations d'adhérents). | |||
'''Langues supportées :''' Français, Anglais, Allemand, Espagnol, Italien, Néerlandais | |||
== Architecture technique == | |||
=== Tables de base de données === | |||
Le module crée trois tables principales dans la base de données Dolibarr : | |||
==== llx_stancer_stancer_payments ==== | |||
Stocke l'historique de tous les paiements (CB et SEPA). | |||
{| class="wikitable" | |||
! Champ !! Type !! Description | |||
|- | |||
| <code>rowid</code> || INTEGER (PK) || Identifiant interne auto-incrémenté | |||
|- | |||
| <code>stancer_id</code> || VARCHAR(30) NOT NULL || Identifiant unique du paiement chez Stancer | |||
|- | |||
| <code>amount</code> || INTEGER || Montant en centimes | |||
|- | |||
| <code>fee</code> || INTEGER || Frais de transaction en centimes | |||
|- | |||
| <code>currency</code> || VARCHAR(4) || Code devise (EUR, USD, etc.) | |||
|- | |||
| <code>description</code> || VARCHAR(64) || Description du paiement | |||
|- | |||
| <code>order_id</code> || VARCHAR(36) || Référence de commande du marchand | |||
|- | |||
| <code>unique_id</code> || VARCHAR(36) UNIQUE || Identifiant unique / clé d'idempotence (TAG) | |||
|- | |||
| <code>method</code> || VARCHAR(4) || Méthode de paiement (<code>card</code> ou <code>sepa</code>) | |||
|- | |||
| <code>card</code> || VARCHAR(30) || Identifiant de la carte si paiement CB | |||
|- | |||
| <code>sepa</code> || VARCHAR(30) || Identifiant SEPA si prélèvement | |||
|- | |||
| <code>customer</code> || VARCHAR(30) || Identifiant client Stancer | |||
|- | |||
| <code>refunds</code> || TEXT || Tableau JSON des remboursements associés | |||
|- | |||
| <code>response</code> || VARCHAR(4) || Code de réponse bancaire | |||
|- | |||
| <code>capture</code> || BOOLEAN || Capture immédiate (oui/non) | |||
|- | |||
| <code>created</code> || DATETIME || Date de création chez Stancer | |||
|- | |||
| <code>date_bank</code> || TIMESTAMP || Date de traitement bancaire | |||
|- | |||
| <code>live_mode</code> || BOOLEAN || Mode production (1) ou test (0) | |||
|- | |||
| <code>fk_soc</code> || INTEGER || Clé étrangère vers le tiers Dolibarr | |||
|- | |||
| <code>status</code> || INTEGER NOT NULL || Code de statut du paiement | |||
|- | |||
| <code>entity</code> || INTEGER || Support multi-entité | |||
|- | |||
| <code>date_creation</code> || DATETIME NOT NULL || Date de création locale | |||
|- | |||
| <code>tms</code> || TIMESTAMP || Date de dernière modification | |||
|- | |||
| <code>fk_user_creat</code> || INTEGER (FK → llx_user) || Utilisateur créateur | |||
|- | |||
| <code>fk_user_modif</code> || INTEGER || Utilisateur modificateur | |||
|} | |||
'''Index :''' stancer_id, fk_soc, status | |||
==== llx_stancer_stancer_payouts ==== | |||
Stocke les reversements (virements de Stancer vers le compte bancaire du marchand). | |||
{| class="wikitable" | |||
! Champ !! Type !! Description | |||
|- | |||
| <code>rowid</code> || INTEGER (PK) || Identifiant interne | |||
|- | |||
| <code>payout_id</code> || VARCHAR(30) NOT NULL || Identifiant unique du reversement chez Stancer | |||
|- | |||
| <code>amount</code> || INTEGER || Montant total en centimes | |||
|- | |||
| <code>fees</code> || INTEGER || Frais de traitement en centimes | |||
|- | |||
| <code>amount_net</code> || INTEGER || Montant net (montant - frais) | |||
|- | |||
| <code>currency</code> || VARCHAR(4) || Code devise | |||
|- | |||
| <code>date_paym</code> || DATETIME || Date des transactions incluses | |||
|- | |||
| <code>date_bank</code> || DATETIME || Date de virement effectif | |||
|- | |||
| <code>details</code> || TEXT || Détails complémentaires (JSON) | |||
|- | |||
| <code>payments</code> || TEXT || JSON des paiements inclus dans ce reversement | |||
|- | |||
| <code>refunds</code> || TEXT || JSON des remboursements inclus | |||
|- | |||
| <code>disputes</code> || TEXT || JSON des litiges inclus | |||
|- | |||
| <code>statement_description</code> || TEXT || Libellé du relevé bancaire | |||
|- | |||
| <code>status</code> || INTEGER NOT NULL || Statut du reversement | |||
|- | |||
| <code>entity</code> || INTEGER || Support multi-entité | |||
|- | |||
| <code>tms</code> || TIMESTAMP || Date de dernière modification | |||
|} | |||
'''Index :''' payout_id, status | |||
==== llx_stancer_stancer_refunds ==== | |||
Stocke les remboursements émis vers les clients. | |||
{| class="wikitable" | |||
! Champ !! Type !! Description | |||
|- | |||
| <code>rowid</code> || INTEGER (PK) || Identifiant interne | |||
|- | |||
| <code>refund_id</code> || VARCHAR(30) NOT NULL || Identifiant unique du remboursement chez Stancer | |||
|- | |||
| <code>payment_id</code> || VARCHAR(30) NOT NULL || Identifiant du paiement d'origine | |||
|- | |||
| <code>amount</code> || INTEGER || Montant remboursé en centimes | |||
|- | |||
| <code>currency</code> || VARCHAR(4) || Code devise | |||
|- | |||
| <code>status</code> || INTEGER NOT NULL || Statut du remboursement | |||
|- | |||
| <code>created</code> || DATETIME || Date de création chez Stancer | |||
|- | |||
| <code>date_refund</code> || TIMESTAMP || Date de traitement du remboursement | |||
|- | |||
| <code>date_bank</code> || TIMESTAMP || Date de crédit bancaire | |||
|- | |||
| <code>live_mode</code> || BOOLEAN || Mode production ou test | |||
|- | |||
| <code>fk_soc</code> || INTEGER || Clé étrangère vers le tiers | |||
|- | |||
| <code>entity</code> || INTEGER || Support multi-entité | |||
|- | |||
| <code>date_creation</code> || DATETIME NOT NULL || Date de création locale | |||
|- | |||
| <code>tms</code> || TIMESTAMP || Date de dernière modification | |||
|- | |||
| <code>fk_user_creat</code> || INTEGER (FK → llx_user) || Utilisateur créateur | |||
|- | |||
| <code>fk_user_modif</code> || INTEGER || Utilisateur modificateur | |||
|} | |||
'''Index :''' refund_id, payment_id, status, fk_soc | |||
== Fonctionnalités == | |||
=== 1. Paiement par carte bancaire (CB) === | |||
==== 1.1 Flux de paiement CB ==== | |||
Le paiement par carte bancaire suit le flux suivant : | |||
# L'utilisateur Dolibarr clique sur le bouton "Payer avec Stancer" depuis la fiche d'une facture, commande, devis, don ou cotisation | |||
# Le module valide l'objet (statut, montant restant dû, etc.) | |||
# Un paiement est créé via l'API Stancer (<code>POST /checkout/</code>) | |||
# L'enregistrement est sauvegardé dans <code>llx_stancer_stancer_payments</code> | |||
# Le client est redirigé vers la page hébergée Stancer : <code>https://payment.stancer.com/{pubkey}/{paymentId}</code> | |||
# Le client saisit ses informations de carte et confirme (avec 3D Secure si nécessaire) | |||
# Stancer rappelle la page de retour : <code>/public/paymentback.php</code> | |||
# La page de retour vérifie le statut du paiement via l'API | |||
# Si le paiement est confirmé : enregistrement du paiement dans Dolibarr, mise à jour de la facture, envoi d'email de confirmation | |||
==== 1.2 Page publique CB ==== | |||
La page <code>public/cb.php</code> permet aux clients d'enregistrer une carte bancaire pour des paiements ultérieurs (sans effectuer de transaction immédiate). | |||
'''Champs du formulaire :''' | |||
* Nom de la société (lecture seule) | |||
* Nom du titulaire de la carte | |||
* Numéro de carte (masqué avec auto-formatage) | |||
* Date d'expiration (format MM/AAAA) | |||
* CVC/CVV | |||
'''Sécurité :''' | |||
* Protection CSRF via jeton | |||
* Clé sécurisée : <code>hash("CB-{socid}-{nom_société}-{PAYMENT_SECURITY_TOKEN}")</code> | |||
* Détection de rechargement de page pour prévenir les doublons | |||
* Support de la pré-autorisation 3DS (<code>action=preauth</code>) | |||
==== 1.3 Configuration CB ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_ENABLE_CB</code> || Activer/désactiver les paiements CB | |||
|- | |||
| <code>STANCER_PUBLIC_CB_PAGE</code> || Activer la page publique d'enregistrement de carte | |||
|- | |||
| <code>STANCER_CB_ORDER_PARTIAL_PAY</code> || Pourcentage d'acompte pour les commandes (0 = totalité) | |||
|- | |||
| <code>STANCER_CB_PROPAL_PARTIAL_PAY</code> || Pourcentage d'acompte pour les devis | |||
|- | |||
| <code>STANCER_AUTO_MAIL_ORDER_CB</code> || Envoi automatique d'email lors de l'initiation d'un paiement CB | |||
|- | |||
| <code>STANCER_AUTO_MAIL_INVOICES_CB</code> || Envoi automatique d'email CB pour les factures | |||
|- | |||
| <code>STANCER_AUTO_MAIL_INVOICES_CB_MAILTYPE</code> || Modèle d'email à utiliser pour les notifications CB | |||
|} | |||
==== 1.4 Acomptes et paiements partiels ==== | |||
Le module supporte les acomptes sur les commandes et les devis : | |||
* Configurable via <code>STANCER_CB_ORDER_PARTIAL_PAY</code> (pourcentage de 1 à 100) | |||
* Configurable via <code>STANCER_CB_PROPAL_PARTIAL_PAY</code> pour les devis | |||
* Le montant de l'acompte est calculé automatiquement : <code>total_ttc × pourcentage / 100</code> | |||
* Les paiements partiels sont marqués avec un flag <code>partialPayment=1</code> | |||
* Suivi des paiements multiples via un séquenceur (<code>SEQ={compteur}</code> dans le TAG) | |||
=== 2. Paiement par prélèvement SEPA === | |||
==== 2.1 Création de mandat SEPA ==== | |||
La page publique <code>public/sepa-iban.php</code> permet aux clients de saisir leur IBAN pour créer un mandat SEPA. | |||
'''Champs du formulaire :''' | |||
* Nom de la société (lecture seule) | |||
* Nom du titulaire du compte | |||
* Nom de la banque | |||
* IBAN (avec auto-espacement) | |||
* BIC (optionnel, récupéré automatiquement depuis Stancer si absent) | |||
'''Processus de création :''' | |||
# Validation de l'IBAN via la bibliothèque <code>PHP_IBAN</code> | |||
# Création du compte client Stancer si nécessaire | |||
# Création/mise à jour de l'enregistrement <code>societe_rib</code> dans Dolibarr : | |||
#* Label : <code>stancer-sepa-tst</code> (test) ou <code>stancer-sepa</code> (production) | |||
#* RUM auto-généré via <code>BonPrelevement::buildRumNumber()</code> | |||
#* Type FRST/RECUR (premier/récurrent) | |||
# Enregistrement de l'IBAN chez Stancer via <code>stancerAddSEPAIfNeeded()</code> | |||
# Génération optionnelle du PDF de mandat SEPA (si <code>STANCER_MANDATE_AUTO</code> activé) | |||
# Signature électronique optionnelle via UpToSign (si <code>STANCER_MANDATE_AUTO_UPTOSIGN</code> activé) | |||
==== 2.2 Flux de paiement SEPA ==== | |||
# Le système (ou l'utilisateur) déclenche un prélèvement SEPA via <code>stancerSEPAstartPay()</code> | |||
# Validation du délai SEPA (configurable, par défaut 5 jours avant l'échéance) | |||
# Vérification du montant maximum autorisé (<code>STANCER_SWITCH_SEPA_AMOUNT_MAX</code>) | |||
# Validation de la date de paiement de la facture | |||
# Création du paiement via l'API Stancer | |||
# Sauvegarde dans <code>llx_stancer_stancer_payments</code> | |||
==== 2.3 Configuration SEPA ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_PUBLIC_IBAN_PAGE</code> || Activer la page publique de saisie IBAN | |||
|- | |||
| <code>STANCER_PUBLIC_IBAN_PAGE_FORCE</code> || Forcer l'affichage de la page IBAN | |||
|- | |||
| <code>STANCER_MANDATE_AUTO</code> || Générer automatiquement le PDF du mandat SEPA | |||
|- | |||
| <code>STANCER_MANDATE_AUTO_UPTOSIGN</code> || Intégration signature électronique UpToSign | |||
|- | |||
| <code>STANCER_MANDATE_AUTO_UPTOSIGN_NOCLICK</code> || Redirection automatique vers la signature | |||
|- | |||
| <code>STANCER_DELAY_SEPA</code> || Délai en jours avant prélèvement (défaut : 5) | |||
|- | |||
| <code>STANCER_DELAY_SEPA_UPDATE_INVOICES</code> || Mettre à jour les dates de factures selon le délai | |||
|- | |||
| <code>STANCER_SWITCH_SEPA_AMOUNT_MAX</code> || Montant maximum pour un prélèvement SEPA | |||
|- | |||
| <code>STANCER_SWITCH_SEPA_TO_OTHER_BANK</code> || Basculer vers un autre compte bancaire au-delà du seuil | |||
|- | |||
| <code>STANCER_AUTO_MAIL_INVOICES_SEPA</code> || Email automatique pour les prélèvements SEPA | |||
|- | |||
| <code>STANCER_AUTO_MAIL_INVOICES_SEPA_MAILTYPE</code> || Modèle d'email SEPA | |||
|- | |||
| <code>STANCER_EMAIL_DPO</code> || Email du Délégué à la Protection des Données (RGPD) | |||
|- | |||
| <code>PRELEVEMENT_ICS</code> || Identifiant Créancier SEPA (ICS) | |||
|} | |||
==== 2.4 Génération de mandat PDF ==== | |||
Le module inclut un générateur PDF spécifique (<code>pdf_sepamandate_stancer</code>) qui produit : | |||
* La Référence Unique de Mandat (RUM) | |||
* L'Identifiant Créancier SEPA (ICS) | |||
* Les coordonnées du créancier (nom, adresse complète) | |||
* Le formulaire débiteur (nom, adresse, IBAN, BIC) | |||
* La case à cocher FRST/RECUR | |||
* Les textes légaux SEPA relatifs au traitement des données et aux droits | |||
* Les informations du DPO (Délégué à la Protection des Données) | |||
* L'espace de signature (avec support UpToSign pour signature électronique) | |||
=== 3. Gestion des remboursements === | |||
==== 3.1 Fonctionnalités ==== | |||
* Création de remboursements via l'API Stancer (<code>POST /refunds/</code>) | |||
* Suivi des remboursements dans la table <code>llx_stancer_stancer_refunds</code> | |||
* Liaison avec le paiement d'origine via <code>payment_id</code> | |||
* Statuts : Brouillon (0), Validé (1), Annulé (9) | |||
* Page de liste dédiée avec filtres et recherche (<code>stancer_refunds_list.php</code>) | |||
* Détection des remboursements déjà effectués pour éviter les doublons | |||
==== 3.2 Statuts de remboursement ==== | |||
{| class="wikitable" | |||
! Code !! Statut !! Description | |||
|- | |||
| 0 || Brouillon || Remboursement en attente de traitement | |||
|- | |||
| 1 || Validé || Remboursement effectué | |||
|- | |||
| 9 || Annulé || Remboursement annulé | |||
|} | |||
=== 4. Gestion des reversements (Payouts) === | |||
==== 4.1 Fonctionnalités ==== | |||
Les reversements représentent les virements effectués par Stancer vers le compte bancaire du marchand. | |||
* Synchronisation des reversements depuis l'API Stancer (<code>GET /payouts/</code>) | |||
* Détail des reversements : paiements inclus, remboursements, litiges | |||
* Calcul du montant net (montant brut - frais) | |||
* '''Disponible uniquement en mode production''' (les reversements n'existent pas en mode test) | |||
==== 4.2 Statuts des reversements ==== | |||
{| class="wikitable" | |||
! Code !! Statut !! Description | |||
|- | |||
| -10 || Erreur || Erreur de traitement | |||
|- | |||
| 0 || Brouillon || En attente | |||
|- | |||
| 1 || En attente || Traitement en cours | |||
|- | |||
| 2 || À payer || Programmé pour paiement | |||
|- | |||
| 3 || Envoyé || Envoyé à la banque | |||
|- | |||
| 4 || Payé || Crédité sur le compte | |||
|- | |||
| 5 || Échoué || Échec du virement | |||
|- | |||
| 9 || Annulé || Reversement annulé | |||
|- | |||
| 10 || Validé || Validé dans le système | |||
|} | |||
==== 4.3 Import de relevés de reversement ==== | |||
La page <code>stancer_import_check_reversements.php</code> permet d'importer et vérifier les relevés mensuels de Stancer au format CSV. | |||
'''Processus d'import :''' | |||
# Téléversement du fichier CSV avec le numéro de relevé | |||
# Analyse automatique des en-têtes et mapping des colonnes | |||
# Pour chaque opération (paiement, remboursement, litige) : | |||
#* Vérification de l'existence de l'opération en banque (champ <code>num_chq</code>) | |||
#* Validation des montants | |||
#* Mise à jour du <code>num_releve</code> | |||
# Pour chaque reversement : | |||
#* Création d'une écriture VIR (virement) vers le compte principal | |||
#* Création d'une écriture PRE (prélèvement) pour les frais | |||
# Vérification croisée : détection des écritures bancaires absentes du fichier d'import | |||
# Totalisation des crédits et débits avec comparaison | |||
=== 5. Statuts des paiements === | |||
{| class="wikitable" | |||
! Code !! Statut !! Description | |||
|- | |||
| -10 || Erreur || Erreur technique lors du paiement | |||
|- | |||
| -1 || Masqué || Paiement masqué dans l'interface | |||
|- | |||
| 0 || Brouillon || Paiement initialisé, en attente | |||
|- | |||
| 1 || Autorisé || Autorisé par la banque, pas encore capturé | |||
|- | |||
| 2 || Capturé || Montant crédité sur le compte | |||
|- | |||
| 3 || Capture envoyée || Capture en cours de traitement | |||
|- | |||
| 4 || Contesté || Le client a contesté le paiement (litige) | |||
|- | |||
| 5 || Expiré || Paiement expiré | |||
|- | |||
| 6 || Échoué || Paiement échoué | |||
|- | |||
| 7 || Refusé || Paiement refusé par la banque | |||
|- | |||
| 8 || À capturer || Sera traité dans la journée | |||
|- | |||
| 9 || Annulé || Paiement annulé | |||
|- | |||
| 10 || Validé || Paiement validé dans le système | |||
|} | |||
=== 6. Pages de liste et de gestion === | |||
==== 6.1 Liste des paiements (<code>stancer_payments_list.php</code>) ==== | |||
'''Colonnes affichées :''' | |||
* Identifiant interne (rowid) | |||
* Identifiant Stancer (stancer_id) — lien cliquable vers le dashboard Stancer | |||
* Montant (converti de centimes en devise) | |||
* Devise | |||
* Description | |||
* Référence commande (order_id) — lien vers la facture/commande Dolibarr | |||
* Identifiant unique (TAG) | |||
* Méthode (card/sepa) | |||
* Identifiant carte / SEPA | |||
* Identifiant client Stancer | |||
* Remboursements associés | |||
* Statut (avec badge coloré) | |||
* Code réponse bancaire | |||
* Statut de capture | |||
* Date de création | |||
* Mode (test/production) | |||
* Tiers (avec résolution automatique depuis le TAG si absent) | |||
'''Fonctionnalités :''' | |||
* Filtres individuels par colonne | |||
* Recherche globale | |||
* Tri par colonne | |||
* Pagination configurable | |||
* '''Bouton Rafraîchir''' : synchronisation manuelle avec l'API Stancer (déclenche <code>stancerRefreshAllPayments()</code>, <code>stancerRefreshAllPaymentsFromDolibarr()</code> et <code>stancerRemoveOldDraftPayments()</code>) | |||
* Basculement vue liste / vue Kanban | |||
* Suppression en masse (si permissions) | |||
* Champs supplémentaires (extrafields) dynamiques | |||
* Résolution automatique du tiers (fk_soc) depuis le TAG si absent | |||
==== 6.2 Liste des reversements (<code>stancer_payouts_list.php</code>) ==== | |||
'''Colonnes affichées :''' | |||
* Identifiant interne et Stancer | |||
* Montant brut, frais, montant net (calculé automatiquement) | |||
* Devise | |||
* Description et libellé relevé | |||
* Dates (paiement et virement bancaire) | |||
* Nombre de paiements, remboursements, litiges inclus | |||
* Statut | |||
* Mode (test/production) | |||
'''Particularités :''' | |||
* '''Le rafraîchissement n'est disponible qu'en mode production''' (message d'avertissement en mode test) | |||
* Bouton "Nouveau" pour créer un enregistrement manuellement (tests) | |||
==== 6.3 Liste des remboursements (<code>stancer_refunds_list.php</code>) ==== | |||
Interface standard de liste Dolibarr avec : | |||
* Colonnes triables et filtrables | |||
* Vue liste et Kanban | |||
* Actions en masse (suppression, email) | |||
* Support des champs supplémentaires (extrafields) | |||
=== 7. Page de retour de paiement (<code>public/paymentback.php</code>) === | |||
Page publique appelée par Stancer après que le client a complété son paiement. Aucune authentification requise. | |||
==== 7.1 Flux de traitement ==== | |||
# '''Décodage des paramètres''' : déchiffrement Base64 du paramètre <code>s</code> contenant tag, source, ref, securekey, entity | |||
# '''Récupération du paiement''' depuis la table Stancer par UUID ou session | |||
# '''Vérification du statut''' via l'API Stancer (<code>GET /checkout/{id}</code>) | |||
# '''Traitement carte bancaire''' : extraction des données de carte (marque, 4 derniers chiffres, nom, pays), création/mise à jour du mode de paiement | |||
# '''Détection de doublons''' : recherche dans <code>llx_paiement</code> par <code>ext_payment_id</code> — affiche "Rechargement détecté" si doublon | |||
# '''Mise à jour de l'enregistrement''' local via <code>fillDataFromApi()</code> | |||
# '''Actions post-paiement''' : attribution de permissions temporaires, enregistrement du paiement sur l'objet Dolibarr | |||
==== 7.2 Sécurité ==== | |||
* Pas d'authentification requise (page publique) | |||
* CSRF désactivé (callback externe) | |||
* Paramètres encodés en Base64 dans l'URL | |||
* Support multi-entité via le paramètre entity | |||
=== 8. Onglet Tiers (<code>stancer_thirdparty.php</code>) === | |||
Ajoute un onglet "Stancer" sur la fiche des tiers dans Dolibarr. | |||
'''Sections affichées :''' | |||
* '''Compte Stancer''' : nom, date de création, identifiant (lien vers manage.stancer.com), action de suppression | |||
* '''Mandats SEPA''' (si compte existant) : tableau avec label, banque, IBAN, BIC, identifiant Stancer, RUM, date RUM, mode de prélèvement, actions (créer/supprimer sur Stancer) | |||
* '''Cartes bancaires''' (si carte existante) : tableau avec label, type, numéro masqué, titulaire, expiration, type de carte, pays, actions | |||
* '''Lien de paiement du solde''' : bouton "Payer le solde [€X.XX]" pour encaisser directement les factures impayées du tiers | |||
* '''Liens publics''' : vers les pages de saisie IBAN et CB si activées | |||
* '''Intégration UpToSign''' : avertissement si activé mais aucun signataire configuré | |||
=== 9. Comptabilité et rapprochement === | |||
==== 9.1 Gestion des frais ==== | |||
Trois modes de gestion des frais Stancer : | |||
{| class="wikitable" | |||
! Mode !! Paramètre !! Description | |||
|- | |||
| Aucun || <code>STANCER_ADD_FEES = NONE</code> || Pas d'enregistrement automatique des frais | |||
|- | |||
| Par reversement || <code>STANCER_ADD_FEES = PAYOUT</code> || Frais enregistrés au niveau de chaque reversement | |||
|- | |||
| Par paiement || <code>STANCER_ADD_FEES = PAYMENT</code> || Frais enregistrés individuellement pour chaque paiement | |||
|} | |||
==== 9.2 Régularisation des écarts comptables (<code>admin/compta.php</code>) ==== | |||
Page dédiée au rapprochement entre les factures fournisseur Stancer et les écritures comptables. | |||
'''Fonctionnalités :''' | |||
* Détection automatique des écarts entre débits et crédits | |||
* Seuil configurable (<code>STANCER_COMPTA_SEUIL_ECART</code>, ex. 0.05 EUR) | |||
* Création d'écritures OD (Opérations Diverses) pour régulariser | |||
* Deux lignes par écart : | |||
*# Ligne compte fournisseur : débit/crédit du solde d'écart | |||
*# Ligne compte d'écart (658xxx) : contrepartie | |||
'''Configuration :''' | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_COMPTA_JOURNAL_OD</code> || Journal pour les écritures OD | |||
|- | |||
| <code>STANCER_COMPTA_ACCOUNT_ECART</code> || Compte comptable pour les écarts (ex. 658xxx) | |||
|- | |||
| <code>STANCER_COMPTA_SEUIL_ECART</code> || Seuil de régularisation (ex. 0.05 EUR) | |||
|- | |||
| <code>STANCER_COMPTA_SUPPLIER_ID</code> || Identifiant du fournisseur Stancer dans Dolibarr | |||
|} | |||
==== 9.3 Enregistrement bancaire ==== | |||
Les paiements sont enregistrés dans le module bancaire de Dolibarr : | |||
* Création d'écritures <code>llx_bank</code> pour chaque paiement confirmé | |||
* Enregistrement des frais en écriture séparée si configuré | |||
* Support des virements inter-comptes pour les reversements | |||
* Détection des doublons bancaires (<code>stancerBankLineDoesNotExists()</code>) | |||
=== 10. Automatisation et tâches planifiées === | |||
Le module définit trois tâches cron dans Dolibarr : | |||
==== 10.1 StancerCheckPay ==== | |||
'''Fréquence :''' quotidienne | |||
'''Action :''' Vérifie le statut des paiements et reversements | |||
* Synchronise les paiements depuis l'API Stancer | |||
* Synchronise les paiements locaux non finalisés | |||
* Vérifie les reversements | |||
* Envoie des notifications email si configuré | |||
==== 10.2 StancerCheckTakePayments ==== | |||
'''Fréquence :''' quotidienne | |||
'''Action :''' Collecte automatique des paiements SEPA | |||
* Recherche les factures avec un mode de paiement SEPA actif | |||
* Vérifie l'existence d'un compte Stancer et d'un mandat SEPA valide | |||
* Initie les prélèvements SEPA pour les factures éligibles | |||
* Gère les acomptes et les échecs de relance | |||
* Génère un rapport HTML/email des actions effectuées | |||
==== 10.3 StancerCheckInvoicesPaid ==== | |||
'''Fréquence :''' quotidienne | |||
'''Action :''' Vérification du statut "payé" des factures | |||
* Recherche les factures non marquées comme payées | |||
* Vérifie si le montant payé correspond au total TTC | |||
* Marque automatiquement les factures comme payées si le paiement est complet | |||
=== 11. Hooks et intégration Dolibarr === | |||
Le module s'intègre dans 14 points d'accroche (hooks) de Dolibarr : | |||
{| class="wikitable" | |||
! Hook !! Contexte d'intégration | |||
|- | |||
| <code>newpayment</code> || Création de paiement | |||
|- | |||
| <code>paymentlib</code> || Fonctions de la bibliothèque paiement | |||
|- | |||
| <code>invoicecard</code> || Fiche facture client | |||
|- | |||
| <code>invoicesuppliercard</code> || Fiche facture fournisseur | |||
|- | |||
| <code>ordercard</code> || Fiche commande | |||
|- | |||
| <code>propalcard</code> || Fiche devis / proposition commerciale | |||
|- | |||
| <code>formObjectOptions</code> || Options de formulaire | |||
|- | |||
| <code>thirdpartybancard</code> || Onglet compte bancaire du tiers | |||
|- | |||
| <code>printFieldListTitle</code> || En-têtes de colonnes dans les listes | |||
|- | |||
| <code>printFieldListValue</code> || Valeurs de colonnes dans les listes | |||
|- | |||
| <code>subscription</code> || Cotisations d'adhérents | |||
|- | |||
| <code>doncard</code> || Fiche don | |||
|- | |||
| <code>membercard</code> || Fiche adhérent | |||
|- | |||
| <code>bankline</code> || Ligne d'écriture bancaire | |||
|} | |||
'''Actions principales du hook <code>formConfirm</code> :''' | |||
* <code>stancerCard</code> : affiche une popup de paiement CB avec QR code et lien de paiement | |||
* <code>stancerSEPA</code> : valide qu'un prélèvement SEPA n'est pas déjà en cours (temporisation de 10 minutes) | |||
=== 12. Variables de substitution === | |||
Le module fournit des variables de substitution pour les emails et documents : | |||
{| class="wikitable" | |||
! Variable !! Description | |||
|- | |||
| <code>__STANCER_SEPA_RUM__</code> || Référence Unique de Mandat SEPA | |||
|- | |||
| <code>__STANCER_SEPA_DELAIS__</code> || Délai de prélèvement SEPA (en jours) | |||
|- | |||
| <code>__STANCER_SEPA_URL__</code> || Lien public vers la page de saisie IBAN | |||
|} | |||
=== 13. Modèles d'emails === | |||
Six modèles d'emails sont préconfigurés à l'installation : | |||
{| class="wikitable" | |||
! Modèle !! Utilisation | |||
|- | |||
| '''Stancer Facture (SEPA)''' || Notification de prélèvement SEPA classique | |||
|- | |||
| '''Stancer Facture (SEPA information initiale)''' || Email d'information initial SEPA (obligation réglementaire) | |||
|- | |||
| '''Stancer Facture (SEPA Succès)''' || Confirmation de prélèvement SEPA réussi | |||
|- | |||
| '''Stancer Facture (ERREUR)''' || Notification d'erreur de paiement avec options de récupération | |||
|- | |||
| '''Stancer Facture (CB)''' || Notification de paiement par carte bancaire | |||
|- | |||
| '''Stancer Commande''' || Rappel de paiement pour commande | |||
|} | |||
'''Variables disponibles dans les modèles :''' | |||
<code>__REF__</code>, <code>__MYCOMPANY_NAME__</code>, <code>__MYCOMPANY_ADDRESS__</code>, <code>__MYCOMPANY_ZIP__</code>, <code>__MYCOMPANY_TOWN__</code>, <code>__DAY_TEXT__</code>, <code>__DAY__</code>, <code>__MONTH_TEXT__</code>, <code>__YEAR__</code>, <code>__AMOUNT_EXCL_TAX_FORMATED__</code>, <code>__STANCER_SEPA_DELAIS__</code>, <code>__USER_SIGNATURE__</code>, <code>__ONLINE_PAYMENT_URL__</code> | |||
=== 14. Notifications automatiques === | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_AUTO_MAIL_NOTIFICATIONS</code> || Activer les notifications email globales | |||
|- | |||
| <code>STANCER_AUTO_MAIL_NOTIFICATIONS_PAYMENT</code> || Notification à chaque paiement reçu | |||
|- | |||
| <code>STANCER_AUTO_MAIL_NOTIFICATIONS_PAYOUT</code> || Notification à chaque reversement reçu | |||
|- | |||
| <code>STANCER_AUTO_MAIL_NOTIFICATIONS_ON_NEW_CB_AND_SEPA</code> || Notification lors de l'enregistrement d'une nouvelle carte ou d'un nouveau mandat SEPA | |||
|- | |||
| <code>STANCER_AUTO_MAIL_INVOICES_ERROR</code> || Notification en cas d'erreur de paiement | |||
|} | |||
== Administration == | |||
=== Pages d'administration === | |||
Le module fournit 12 pages d'administration accessibles depuis le menu Stancer : | |||
{| class="wikitable" | |||
! Page !! Fichier !! Description | |||
|- | |||
| Configuration || <code>admin/setup.php</code> || Paramètres généraux, clés API, comptes bancaires, synchronisation | |||
|- | |||
| Carte bancaire || <code>admin/cb.php</code> || Configuration des paiements CB, 3DS, emails | |||
|- | |||
| SEPA || <code>admin/sepa.php</code> || Configuration des prélèvements SEPA, délais, montants max | |||
|- | |||
| Email || <code>admin/mail.php</code> || Configuration des modèles d'emails | |||
|- | |||
| Association || <code>admin/asso.php</code> || Activation pour les associations et adhérents | |||
|- | |||
| Comptabilité || <code>admin/compta.php</code> || Rapprochement comptable et régularisation des écarts | |||
|- | |||
| Test || <code>admin/test.php</code> || Interface de test de l'API (client, paiements, reversements) | |||
|- | |||
| À propos || <code>admin/about.php</code> || Informations sur le module | |||
|- | |||
| Logs || <code>admin/logs.php</code> || Visualisation des journaux de transactions | |||
|- | |||
| Extrafields Paiements || <code>admin/stancer_payments_extrafields.php</code> || Champs personnalisés pour les paiements | |||
|- | |||
| Extrafields Reversements || <code>admin/stancer_payouts_extrafields.php</code> || Champs personnalisés pour les reversements | |||
|- | |||
| Extrafields Remboursements || <code>admin/stancer_refunds_extrafields.php</code> || Champs personnalisés pour les remboursements | |||
|} | |||
=== Configuration générale === | |||
==== Clés API ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_IS_PROD</code> || Mode production (1) ou test (0) | |||
|- | |||
| <code>STANCER_TEST_PUBLIC_KEY</code> || Clé publique de test | |||
|- | |||
| <code>STANCER_TEST_PRIVATE_KEY</code> || Clé privée de test (masquée) | |||
|- | |||
| <code>STANCER_PROD_PUBLIC_KEY</code> || Clé publique de production | |||
|- | |||
| <code>STANCER_PROD_PRIVATE_KEY</code> || Clé privée de production (masquée) | |||
|} | |||
==== Comptes et utilisateurs ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_USER_ACCOUNT_FOR_ACTIONS</code> || Utilisateur Dolibarr pour les actions automatisées | |||
|- | |||
| <code>STANCER_BANK_ACCOUNT_FOR_PAYMENTS</code> || Compte bancaire pour l'enregistrement des paiements | |||
|- | |||
| <code>STANCER_BANK_MAIN_ACCOUNT_FOR_PAYOUTS</code> || Compte bancaire principal pour les reversements | |||
|} | |||
==== Synchronisation ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description !! Défaut | |||
|- | |||
| <code>STANCER_NUMBER_OF_ITEMS_TO_SYNC</code> || Nombre d'éléments par appel API || 200 (plage : 10-1000) | |||
|- | |||
| <code>STANCER_NB_DAYS_TO_SYNC</code> || Nombre de jours d'historique à récupérer || 31 (plage : 10-730) | |||
|} | |||
==== Divers ==== | |||
{| class="wikitable" | |||
! Paramètre !! Description | |||
|- | |||
| <code>STANCER_MONTHLY_SUBSCRIPTION_FEE</code> || Abonnement mensuel (frais de TPE, défaut : 18 EUR) | |||
|- | |||
| <code>STANCER_AUTO_INVOICE_ON_PROPAL_PAID</code> || Créer automatiquement une facture quand un devis est payé | |||
|} | |||
=== Interface de test (<code>admin/test.php</code>) === | |||
Permet de vérifier le bon fonctionnement de l'API directement depuis Dolibarr : | |||
# '''Vérification de la configuration''' : affiche le mode (PRODUCTION / TEST) et un aperçu de la clé publique | |||
# '''Création de client''' : crée ou récupère un client de test, affiche le lien vers le dashboard Stancer | |||
# '''Lecture de client''' : affiche les détails (identifiant, email, nom, mobile) | |||
# '''Liste des paiements récents''' : affiche les 5 derniers paiements (identifiant, montant, statut, date) | |||
# '''Liste des reversements récents''' : affiche les 5 derniers reversements | |||
# '''Détail d'un paiement''' : informations détaillées incluant le masquage de carte (**** + 4 derniers chiffres) | |||
=== Support des associations (<code>admin/asso.php</code>) === | |||
L'activation de Stancer pour les associations crée automatiquement trois champs supplémentaires sur les adhérents : | |||
{| class="wikitable" | |||
! Champ !! Type !! Description | |||
|- | |||
| <code>stancer_sepa_ref</code> || VARCHAR(32) || Référence du mandat SEPA de l'adhérent | |||
|- | |||
| <code>stancer_cb_ref</code> || VARCHAR(32) || Référence de la carte bancaire de l'adhérent | |||
|- | |||
| <code>stancer_account</code> || VARCHAR(32) || Identifiant du compte client Stancer (obligatoire) | |||
|} | |||
== API REST Stancer == | |||
Le module utilise un client REST intégré (<code>StancerApi</code>) qui communique directement avec l'API Stancer sans dépendance externe. | |||
== Synchronisation == | |||
=== Principes === | |||
* La synchronisation est '''exclusivement manuelle''' (bouton Rafraîchir dans les listes) | |||
* Jamais de rafraîchissement automatique lors de la recherche ou du filtrage | |||
* Les fonctions de synchronisation sont chaînées conditionnellement : si l'une échoue, les suivantes sont ignorées | |||
=== Flux de synchronisation des paiements === | |||
# <code>stancerRefreshAllPayments()</code> : récupère les '''nouveaux''' paiements depuis l'API Stancer depuis la dernière synchronisation | |||
# <code>stancerRefreshAllPaymentsFromDolibarr()</code> : vérifie le statut des paiements locaux '''non finalisés''' via l'API | |||
# <code>stancerRemoveOldDraftPayments()</code> : supprime les paiements brouillon anciens (> 30 jours), sans appel API | |||
=== Flux de synchronisation des reversements === | |||
# <code>stancerRefreshAllPayoutsFromStancer()</code> : récupère les reversements depuis l'API (mode production uniquement) | |||
# Enchaîne avec la vérification locale si la première étape réussit | |||
# Arrêt immédiat en cas d'erreur | |||
== Objets métier supportés == | |||
Le module s'intègre avec les objets Dolibarr suivants : | |||
{| class="wikitable" | |||
! Objet Dolibarr !! Paiement CB !! Prélèvement SEPA !! Remarques | |||
|- | |||
| '''Facture client''' || Oui || Oui || Calcul automatique du solde restant dû | |||
|- | |||
| '''Commande''' || Oui || — || Support des acomptes (pourcentage configurable) | |||
|- | |||
| '''Devis / Proposition commerciale''' || Oui || — || Support des acomptes, page dédiée | |||
|- | |||
| '''Don''' || Oui || — || Via la page publique de paiement | |||
|- | |||
| '''Cotisation d'adhérent''' || Oui || Oui || Nécessite l'activation du mode association | |||
|} | |||
== Codes de réponse bancaire == | |||
Le module interprète les codes de réponse bancaire standards : | |||
{| class="wikitable" | |||
! Code !! Signification | |||
|- | |||
| 00 || Transaction approuvée | |||
|- | |||
| 02 || Contacter l'émetteur de la carte | |||
|- | |||
| 03 || Accepteur invalide | |||
|- | |||
| 04 || Conserver la carte | |||
|- | |||
| 05 || Ne pas honorer | |||
|- | |||
| 07 || Conserver la carte (conditions spéciales) | |||
|- | |||
| 08 || Approuver après identification | |||
|- | |||
| 12 || Transaction invalide | |||
|- | |||
| 13 || Montant invalide | |||
|- | |||
| 14 || Numéro de porteur invalide | |||
|- | |||
| 15 || Émetteur de carte inconnu | |||
|- | |||
| 30 || Erreur de format | |||
|- | |||
| 31 || Identifiant de l'acquéreur inconnu | |||
|- | |||
| 33 || Carte expirée | |||
|- | |||
| 34 || Suspicion de fraude | |||
|- | |||
| 41 || Carte perdue | |||
|- | |||
| 43 || Carte volée | |||
|- | |||
| 51 || Provision insuffisante ou crédit dépassé | |||
|- | |||
| 54 || Carte expirée | |||
|- | |||
| 56 || Carte absente du fichier | |||
|- | |||
| 57 || Transaction non autorisée pour ce porteur | |||
|- | |||
| 58 || Transaction non autorisée pour ce terminal | |||
|- | |||
| 59 || Suspicion de fraude | |||
|- | |||
| 60 || L'accepteur doit contacter l'acquéreur | |||
|- | |||
| 61 || Montant maximal de retrait dépassé | |||
|- | |||
| 63 || Règles de sécurité non respectées | |||
|- | |||
| 68 || Réponse non parvenue ou reçue trop tard | |||
|- | |||
| 75 || Nombre maximal d'essais PIN dépassé | |||
|- | |||
| 76 || Porteur déjà en opposition | |||
|- | |||
| 90 || Arrêt momentané du système | |||
|- | |||
| 91 || Émetteur de carte inaccessible | |||
|- | |||
| 92 || Transaction non trouvée par le réseau | |||
|- | |||
| 94 || Transaction dupliquée | |||
|- | |||
| 96 || Mauvais fonctionnement du système | |||
|- | |||
| 97 || Échéance de la temporisation | |||
|- | |||
| 98 || Serveur indisponible | |||
|- | |||
| 99 || Incident domaine initiateur | |||
|- | |||
| 7840 || Fraude détectée par le réseau CB | |||
|} | |||
== Tests == | |||
Le module dispose d'une suite complète de tests : | |||
=== Tests unitaires === | |||
{| class="wikitable" | |||
! Fichier !! Couverture | |||
|- | |||
| <code>StancerApiTest.php</code> || Client HTTP StancerApi | |||
|- | |||
| <code>StancerClassTest.php</code> || Classe principale Stancer | |||
|- | |||
| <code>StancerLibTest.php</code> || Fonctions de la bibliothèque partagée | |||
|- | |||
| <code>StancerPaymentsTest.php</code> || Modèle Stancer_payments | |||
|- | |||
| <code>StancerPayoutsTest.php</code> || Modèle Stancer_payouts | |||
|- | |||
| <code>StancerRefundsTest.php</code> || Modèle Stancer_refunds | |||
|} | |||
=== Tests d'intégration === | |||
{| class="wikitable" | |||
! Fichier !! Couverture | |||
|- | |||
| <code>StancerClassIntegrationTest.php</code> || Intégration classe principale avec Dolibarr | |||
|- | |||
| <code>StancerLibIntegrationTest.php</code> || Intégration fonctions bibliothèque | |||
|- | |||
| <code>StancerPaymentsIntegrationTest.php</code> || Intégration paiements | |||
|- | |||
| <code>StancerPayoutsIntegrationTest.php</code> || Intégration reversements | |||
|- | |||
| <code>StancerRefundsIntegrationTest.php</code> || Intégration remboursements | |||
|- | |||
| <code>StancerTriggersIntegrationTest.php</code> || Intégration déclencheurs | |||
|} | |||
=== Infrastructure de test === | |||
* '''Framework :''' PHPUnit 9.6+ | |||
* '''Mocks :''' HttpMock (simulation HTTP), DolibarrMocks (simulation Dolibarr) | |||
* '''Fixtures :''' StancerApiFixtures (réponses API pré-enregistrées) | |||
* '''Base de données :''' SQLite via <code>cap-rel/dolibarr-integration-sqlite</code> | |||
* '''Couverture :''' PCOV avec rapport HTML | |||
== Conformité et sécurité == | |||
=== RGPD / Protection des données === | |||
* Configuration du DPO (Délégué à la Protection des Données) via <code>STANCER_EMAIL_DPO</code> | |||
* Textes légaux SEPA intégrés dans les mandats PDF | |||
* Informations sur le traitement des données dans les formulaires publics | |||
=== Sécurité des paiements === | |||
* Support 3D Secure pour les paiements par carte | |||
* Clés sécurisées (hachage) pour les pages publiques | |||
* Détection de rechargement de page pour prévenir les paiements en double | |||
* Protection CSRF sur les formulaires (désactivée uniquement sur les callbacks externes) | |||
* Arrêt immédiat sur erreur 401 (authentification) pour éviter les requêtes en boucle | |||
* Masquage des numéros de carte (affichage des 4 derniers chiffres uniquement) | |||
=== Multi-entité === | |||
* Toutes les tables supportent le champ <code>entity</code> pour la gestion multi-société | |||
* Les clés API sont configurables par entité | |||
* Le contexte multi-entité est propagé dans les callbacks publics | |||
== Historique des versions == | |||
{| class="wikitable" | |||
! Version !! Date !! Changements majeurs | |||
|- | |||
| 1.2.136 || 2026-01-19 || Paiement partiel (acompte) sur les devis | |||
|- | |||
| 1.2.130 || — || Corrections SQL des tâches cron | |||
|- | |||
| 1.2.124 || — || Migration vers getDolGlobalString(), support multi-entité, options d'automatisation SEPA | |||
|- | |||
| 1.2.117 || — || Nettoyage PHPStan, restauration gestion des frais | |||
|- | |||
| 1.2.109 || — || Second mandat SEPA, import de relevés, compatibilité Dolibarr 20 | |||
|- | |||
| 1.2.108 || — || Support des remboursements, import CSV de relevés, helpers bancaires | |||
|- | |||
| 1.2.100 || — || Corrections de conditions de course, améliorations des popups | |||
|- | |||
| 1.2.88 || — || Retour bancaire anticipé CB, automatisation statut facture payée | |||
|- | |||
| 1.2.80 || — || Délai SEPA, gestion multi-entité | |||
|- | |||
| 1.2.52 || — || Rétro-portage PHP-IBAN, conformité CNIL/DPO | |||
|- | |||
| 1.2.0 || — || Configuration du délai SEPA, notifications email automatiques | |||
|- | |||
| 1.0.0 || 2023-03-12 || Publication initiale | |||
|} | |||
edits