Comment l'app hors ligne, l'API du CRM et la capture de leads fonctionnent ensemble — plus ce que l'app contient déjà.
Le formulaire de demande publie directement vers l'API LeadIntake du CRM — sans serveur intermédiaire.
<!-- POST via fetch → https://launcherp.be/api/v1/leads --> { "name": "...", // nom "email": "...", // e-mail (obligatoire) "company": "...", // société "plan": "hidden", // plan choisi (depuis prijzen.html) "source": "salesonipad" // source → le lead est tagué dans le CRM }
✓ Le champ honeypot website filtre les bots. ✓ Erreur réseau → message clair, aucun lead perdu.
// config/cors.php 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_origins' => [env('APP_URL'), 'https://salesonipad.com'], // bootstrap/app.php — exception CSRF pour le endpoint de leads ->withMiddleware(function (Middleware $middleware) { $middleware->validateCsrfTokens(except: ['api/v1/leads']); })
✓ Le LeadIntakeController existant traite les données ; aucun nouveau backend nécessaire.
L'app se synchronise déjà avec l'API du CRM via les mêmes schémas que les commandes. Ces modules tournent et doivent simplement être connectés.
scripts/leads.jsnovasync.syncLeads) et App → CRM (file d'attente erp="send")crm:<uuid> ou lead:<ts>) — jamais de doublonsscripts/opportunities.jspdf.js: creditNotaFromFactuurscripts/novasync.jsCe qui se passe sur l'iPad et dans le CRM.
| Composant | Fonctionnement |
|---|---|
| Protection PIN | Verrouille l'app contre toute utilisation non autorisée |
| Sauvegarde Dropbox | OAuth 2.0 PKCE — sauvegarde en un geste, restauration ultérieure sur le même iPad ou un nouveau |
| File d'attente hors ligne | Les commandes en attente survivent à un redémarrage ; file de sauvegarde séparée |
| Prêt pour Peppol | Les champs d'e-facturation sont présents ; le module CRM génère l'e-facture UBL en téléchargement. L'envoi via un point d'accès Peppol n'est pas encore opérationnel. |
| PWA / hors ligne | Le service worker met en cache l'application complète — fonctionne sans réseau |
L'app est une Progressive Web App : les représentants l'installent sur leur iPad sans App Store et elle fonctionne entièrement hors ligne.
La combinaison utilise la sync existante — aucune nouvelle infrastructure.
1. Compte CRM créé (paiement Stripe) 2. Licence SalesOnIPad liée à l'entreprise CRM 3. L'app sait via la config quel endpoint de sync utiliser 4. La sync s'exécute automatiquement — les utilisateurs voient « synchronisé » dans l'app 5. Résilier le CRM = la sync s'arrête ; l'app continue de fonctionner localement
Les commandes, leads, opportunités et avoirs utilisent déjà le même schéma de sync. Le module Vente sur le terrain les connecte au tableau de bord du CRM.
Ce qu'il reste à faire pour mettre l'intégration en ligne.
| Étape | Travail | Statut |
|---|---|---|
| 1. Capture de leads en ligne | Poster le formulaire vers l'API + CORS | Prêt (testwebsite) |
| 2. Module Vente sur le terrain | Activer les modules CRM + prix | Étape suivante |
| 3. Connecter la sync | Connecter les endpoints par client | Pilote |
| 4. Upsell au paiement | Stripe + page de bienvenue | Extension |