# Guide Administrateur Guide complet pour les administrateurs utilisant Ackify pour gérer les documents, les signataires attendus et les rappels email. ## Table des Matières - [Obtenir l'accès Admin](#obtenir-laccès-admin) - [Dashboard Admin](#dashboard-admin) - [Gestion des Documents](#gestion-des-documents) - [Signataires Attendus](#signataires-attendus) - [Rappels Email](#rappels-email) - [Monitoring & Statistiques](#monitoring--statistiques) - [Bonnes Pratiques](#bonnes-pratiques) - [Dépannage](#dépannage) --- ## Obtenir l'accès Admin ### Prérequis Pour accéder aux fonctionnalités admin, votre email doit être configuré dans la variable d'environnement `ACKIFY_ADMIN_EMAILS`. ```bash # Dans le fichier .env ACKIFY_ADMIN_EMAILS=admin@company.com,manager@company.com ``` **Après ajout de votre email:** 1. Redémarrer Ackify: `docker compose restart ackify-ce` 2. Se déconnecter et se reconnecter 3. Vous devriez maintenant voir le lien "Admin" dans la navigation ### Vérifier l'accès Admin Visitez `/admin` - si vous voyez le dashboard admin, vous avez l'accès admin. --- ## Dashboard Admin **URL**: `/admin` Le dashboard admin fournit: - **Total Documents**: Nombre de documents dans le système - **Lecteurs Attendus**: Nombre total de signataires attendus sur tous les documents - **Documents Actifs**: Documents non supprimés - **Liste Documents**: Liste paginée (20 par page) avec recherche ### Fonctionnalités du Dashboard #### Statistiques Rapides Trois cartes KPI en haut: - Nombre total de documents - Total des lecteurs/signataires attendus - Documents actifs (non supprimés) #### Recherche de Documents - Recherche par titre, ID document ou URL - Filtrage en temps réel #### Liste des Documents **Vue desktop** - Tableau avec colonnes: - ID Document - Titre - URL - Date de création - Créateur - Actions (Voir détails) **Vue mobile** - Mise en page carte avec: - ID document et titre - Info création - Tap pour voir détails #### Pagination - 20 documents par page - Boutons Précédent/Suivant - Indicateur de page actuelle --- ## Gestion des Documents ### Créer un Document **Depuis le Dashboard Admin:** 1. Cliquer sur le bouton "Créer Nouveau Document" 2. Remplir le formulaire: - **Référence** (requis): URL, chemin fichier ou ID personnalisé - **Titre** (optionnel): Auto-généré depuis l'URL si vide - **Description** (optionnel): Contexte additionnel 3. Cliquer sur "Créer Document" **Fonctionnalités Automatiques:** - **Génération ID Unique**: doc_id base36 résistant aux collisions - **Extraction Titre**: Auto-extrait de l'URL si non fourni - **Calcul Checksum**: Pour URLs distantes (si admin et fichier < 10MB) **Exemple:** ``` Référence: https://docs.company.com/politique-2025.pdf Titre: Politique de Sécurité 2025 (auto-extrait ou manuel) Description: Politique annuelle de conformité sécurité ``` **Résultat:** - doc_id: `k7m2n4p8` (auto-généré) - Checksum: SHA-256 auto-calculé (si URL accessible) ### Voir les Détails d'un Document **URL**: `/admin/docs/{docId}` Fournit des informations complètes sur le document: #### 1. **Section Métadonnées** Éditer les informations du document: - Titre - URL - Description - Checksum (SHA-256, SHA-512 ou MD5) - Algorithme Checksum **Pour éditer:** 1. Cliquer sur "Éditer Métadonnées" 2. Modifier les champs 3. Cliquer sur "Sauvegarder" 4. Modal de confirmation pour changements critiques (checksum, algorithme) #### 2. **Panneau Statistiques** Suivi des signatures en temps réel: - **Attendus**: Nombre de signataires attendus - **Signés**: Nombre ayant signé - **En Attente**: Pas encore signé - **Complétion**: Pourcentage complété #### 3. **Section Signataires Attendus** Liste tous les signataires attendus avec statut: - **Email**: Adresse email du signataire - **Statut**: ✅ Signé ou ⏳ En attente - **Ajouté**: Date d'ajout à la liste attendue - **Jours Depuis Ajout**: Suivi du temps - **Dernier Rappel**: Quand le dernier rappel a été envoyé - **Nb Rappels**: Total rappels envoyés - **Actions**: Bouton retirer signataire **Code couleur:** - Fond vert: Signataire a signé - Fond par défaut: Signature en attente #### 4. **Signatures Inattendues** Affiche les utilisateurs ayant signé mais pas sur la liste attendue: - Email utilisateur - Date de signature - Indique participation organique/inattendue #### 5. **Actions** - **Envoyer Rappels**: Emailer les signataires en attente - **Partager Lien**: Générer et copier lien de signature - **Supprimer Document**: Suppression douce (préserve historique signatures) ### Mettre à Jour les Métadonnées du Document **Champs importants:** **Titre & Description:** - Peuvent être changés librement - Pas de confirmation requise **URL:** - Met à jour où le document est localisé - Modal de confirmation affiché **Checksum & Algorithme:** - Critique pour vérification d'intégrité - Modal de confirmation avertit de l'impact - Changer uniquement si version du document a changé **Workflow:** 1. Cliquer sur "Éditer Métadonnées" 2. Modifier les champs désirés 3. Cliquer sur "Sauvegarder" 4. Si checksum/algorithme changé, confirmer dans modal 5. Notification de succès affichée ### Supprimer un Document **Comportement Suppression Douce:** - Document marqué comme supprimé (timestamp `deleted_at` défini) - Historique signatures préservé - Document n'apparaît plus dans listes publiques - Admin peut toujours voir via URL directe - Signatures CASCADE update (marquées avec `doc_deleted_at`) **Pour supprimer:** 1. Aller sur page détail document (`/admin/docs/{docId}`) 2. Cliquer sur bouton "Supprimer Document" 3. Confirmer suppression dans modal 4. Document déplacé en état supprimé **Note**: Il n'y a pas de "restauration" - c'est une suppression douce permanente. --- ## Signataires Attendus Les signataires attendus sont les utilisateurs que vous souhaitez suivre pour la complétion du document. ### Ajouter des Signataires Attendus **Depuis la page détail document:** 1. Défiler jusqu'à la section "Signataires Attendus" 2. Cliquer sur bouton "Ajouter Signataire Attendu" 3. Entrer adresse(s) email: - Simple: `alice@company.com` - Multiple: Séparées par virgules `alice@company.com,bob@company.com` 4. Optionnellement ajouter des notes 5. Cliquer sur "Ajouter" **Endpoint API:** ```http POST /api/v1/admin/documents/{docId}/signers Content-Type: application/json X-CSRF-Token: {token} { "emails": ["alice@company.com", "bob@company.com"], "notes": "Membres du conseil - Q1 2025" } ``` **Contraintes:** - Email doit avoir format valide - Contrainte UNIQUE: Impossible d'ajouter même email deux fois au même document - Ajouté par admin utilisateur actuel (suivi dans `added_by`) ### Retirer des Signataires Attendus **Depuis la page détail document:** 1. Trouver signataire dans liste Signataires Attendus 2. Cliquer sur bouton "Retirer" à côté de leur email 3. Confirmer le retrait **Endpoint API:** ```http DELETE /api/v1/admin/documents/{docId}/signers/{email} X-CSRF-Token: {token} ``` **Effet:** - Signataire retiré de la liste attendue - NE supprime PAS leur signature s'ils ont déjà signé - Historique des rappels préservé dans `reminder_logs` ### Suivre le Statut de Complétion **API Statut Document:** ```http GET /api/v1/admin/documents/{docId}/status ``` **Réponse:** ```json { "docId": "abc123", "expectedCount": 10, "signedCount": 7, "pendingCount": 3, "completionPercentage": 70.0 } ``` **Indicateurs visuels:** - Barre de progression montrant pourcentage complétion - Statut code couleur: Vert (signé), Orange (en attente) - Jours depuis ajout (aide identifier signataires lents) --- ## Rappels Email Les rappels email sont envoyés de manière asynchrone via le système `email_queue`. ### Envoyer des Rappels **Depuis la page détail document:** 1. Cliquer sur bouton "Envoyer Rappels" 2. Modal s'ouvre avec options: - **Envoyer à**: Tous en attente OU emails spécifiques - **URL Document**: Pré-rempli, peut personnaliser - **Langue**: en, fr, es, de, it 3. Cliquer sur "Envoyer Rappels" 4. Confirmation: "X rappels mis en file pour envoi" **Endpoint API:** ```http POST /api/v1/admin/documents/{docId}/reminders Content-Type: application/json X-CSRF-Token: {token} { "emails": ["alice@company.com"], // Optionnel: emails spécifiques "docURL": "https://docs.company.com/politique.pdf", "locale": "fr" } ``` **Comportement:** - Envoie à TOUS les signataires en attente si `emails` non spécifié - Envoie aux `emails` spécifiques si fournis (même si déjà signé) - Emails mis en file dans table `email_queue` - Worker background traite la file - Retry en cas d'échec (3 tentatives, exponential backoff) ### Templates Email **Emplacement**: `backend/templates/emails/` **Templates disponibles:** - `reminder.html` - Version HTML - `reminder.txt` - Version texte simple **Variables disponibles dans les templates:** - `{{.DocTitle}}` - Titre document - `{{.DocURL}}` - URL document - `{{.RecipientEmail}}` - Email destinataire - `{{.SenderName}}` - Admin ayant envoyé rappel - `{{.OrganisationName}}` - Depuis ACKIFY_ORGANISATION **Locales**: en, fr, es, de, it - Répertoire template: `templates/emails/{locale}/` - Fallback vers locale par défaut si traduction manquante ### Historique des Rappels **Voir log des rappels:** ```http GET /api/v1/admin/documents/{docId}/reminders ``` **Réponse:** ```json { "reminders": [ { "id": 123, "docId": "abc123", "recipientEmail": "alice@company.com", "sentAt": "2025-01-15T10:30:00Z", "sentBy": "admin@company.com", "templateUsed": "reminder", "status": "sent", "errorMessage": null } ] } ``` **Valeurs de statut:** - `queued` - Dans email_queue, pas encore traité - `sent` - Livré avec succès - `failed` - Échec de livraison (voir errorMessage) - `bounced` - Email retourné **Suivi:** - Date dernier rappel envoyé affiché par signataire - Nombre rappels affiché par signataire - Aide éviter sur-envoi ### Monitoring de la File Email **Vérifier statut de la file (PostgreSQL):** ```sql -- Emails en attente SELECT id, to_addresses, subject, status, scheduled_for FROM email_queue WHERE status IN ('pending', 'processing') ORDER BY priority DESC, scheduled_for ASC; -- Emails échoués SELECT id, to_addresses, last_error, retry_count FROM email_queue WHERE status = 'failed'; ``` **Configuration du worker:** - Taille lot: 10 emails - Intervalle polling: 5 secondes - Max retries: 3 - Cleanup: Rétention 7 jours --- ## Monitoring & Statistiques ### Statistiques Niveau Document **Suivi complétion:** - Nombre Attendus vs Signés - Liste signataires en attente - Pourcentage complétion - Temps moyen pour signer **Efficacité des rappels:** - Nombre rappels envoyés - Taux succès/échec - Temps entre rappel et signature ### Métriques Système Global **Requêtes PostgreSQL:** ```sql -- Total documents SELECT COUNT(*) FROM documents WHERE deleted_at IS NULL; -- Total signatures SELECT COUNT(*) FROM signatures; -- Documents par statut complétion SELECT CASE WHEN signed_count = expected_count THEN '100%' WHEN signed_count >= expected_count * 0.75 THEN '75-99%' WHEN signed_count >= expected_count * 0.50 THEN '50-74%' ELSE '<50%' END as completion_bracket, COUNT(*) as doc_count FROM ( SELECT d.doc_id, COUNT(DISTINCT es.email) as expected_count, COUNT(DISTINCT s.user_email) as signed_count FROM documents d LEFT JOIN expected_signers es ON d.doc_id = es.doc_id LEFT JOIN signatures s ON d.doc_id = s.doc_id AND s.user_email = es.email WHERE d.deleted_at IS NULL GROUP BY d.doc_id ) stats GROUP BY completion_bracket; -- Statistiques file email SELECT status, COUNT(*), MIN(created_at), MAX(created_at) FROM email_queue GROUP BY status; ``` ### Exporter les Données **Signatures pour un document:** ```sql COPY ( SELECT s.user_email, s.user_name, s.signed_at, s.payload_hash FROM signatures s WHERE s.doc_id = 'votre_doc_id' ORDER BY s.signed_at ) TO '/tmp/signatures_export.csv' WITH CSV HEADER; ``` **Statut signataires attendus:** ```sql COPY ( SELECT es.email, CASE WHEN s.id IS NOT NULL THEN 'Signé' ELSE 'En attente' END as status, es.added_at, s.signed_at FROM expected_signers es LEFT JOIN signatures s ON es.doc_id = s.doc_id AND es.email = s.user_email WHERE es.doc_id = 'votre_doc_id' ) TO '/tmp/expected_signers_export.csv' WITH CSV HEADER; ``` --- ## Bonnes Pratiques ### 1. Création de Documents ✅ **À Faire:** - Utiliser titres descriptifs - Ajouter descriptions claires - Inclure URL document pour accès facile - Stocker checksum pour vérification intégrité - Créer liste signataires attendus avant partage ❌ **À Éviter:** - Utiliser titres génériques comme "Document 1" - Laisser URL vide si document accessible en ligne - Changer checksums sauf si document réellement changé ### 2. Gestion Signataires Attendus ✅ **À Faire:** - Ajouter signataires attendus avant d'envoyer lien document - Utiliser notes claires pour expliquer pourquoi signataires attendus - Réviser signataires en attente régulièrement - Retirer signataires qui ne sont plus pertinents ❌ **À Éviter:** - Ajouter centaines de signataires d'un coup (utiliser lots) - Envoyer rappels trop fréquemment (max une fois par semaine) - Retirer signataires ayant déjà signé (préserver historique) ### 3. Rappels Email ✅ **À Faire:** - Attendre 3-5 jours avant premier rappel - Envoyer dans langue préférée du destinataire - Inclure titre et URL document clairs - Suivre historique rappels pour éviter spam - Envoyer rappels pendant heures bureau ❌ **À Éviter:** - Envoyer rappels quotidiens (cause fatigue) - Envoyer sans vérifier si déjà signé - Utiliser sujets génériques (personnaliser avec titre doc) - Envoyer hors heures bureau ### 4. Intégrité des Données ✅ **À Faire:** - Sauvegarder régulièrement base PostgreSQL - Vérifier checksums correspondent documents réels - Monitorer file email pour échecs - Réviser signatures inattendues (peut indiquer intérêt plus large) - Exporter données signatures importantes ❌ **À Éviter:** - Supprimer documents avec signatures actives - Modifier timestamps manuellement en base - Ignorer échecs livraison email - Changer checksums sans mettre à jour document ### 5. Sécurité ✅ **À Faire:** - Limiter accès admin aux utilisateurs de confiance uniquement - Utiliser HTTPS en production (`ACKIFY_BASE_URL=https://...`) - Tourner `ACKIFY_OAUTH_COOKIE_SECRET` périodiquement - Monitorer actions admin via logs application - Utiliser restrictions domaine OAuth autorisé ❌ **À Éviter:** - Partager identifiants admin - Fonctionner sans HTTPS en production - Désactiver protection CSRF - Ignorer échecs authentification dans logs --- ## Dépannage ### Problèmes Courants #### 1. Lien Admin Non Visible **Problème**: Ne peut pas voir lien "Admin" dans navigation **Solutions:** - Vérifier email dans variable `ACKIFY_ADMIN_EMAILS` - Redémarrer Ackify: `docker compose restart ackify-ce` - Se déconnecter et se reconnecter - Vérifier logs: `docker compose logs ackify-ce | grep admin` #### 2. Emails Non Envoyés **Problème**: Rappels mis en file mais pas livrés **Diagnostic:** ```sql SELECT * FROM email_queue WHERE status = 'failed' ORDER BY created_at DESC LIMIT 10; ``` **Solutions:** - Vérifier configuration SMTP (`ACKIFY_MAIL_HOST`, `ACKIFY_MAIL_USERNAME`, etc.) - Vérifier identifiants SMTP corrects - Vérifier logs worker email: `docker compose logs ackify-ce | grep email` - S'assurer `ACKIFY_MAIL_FROM` est adresse expéditeur valide - Tester connexion SMTP manuellement #### 3. Erreur Signataire Dupliqué **Problème**: "Email existe déjà comme signataire attendu" **Cause**: Contrainte UNIQUE sur (doc_id, email) **Solution**: Comportement attendu - chaque email ne peut être ajouté qu'une fois par document #### 4. Checksum Non Correspondant **Problème**: Utilisateurs rapportent checksum ne correspond pas **Solutions:** - Vérifier checksum stocké correspond document réel - Vérifier algorithme utilisé (SHA-256, SHA-512, MD5) - Recalculer checksum et mettre à jour via Éditer Métadonnées - S'assurer utilisateurs téléchargent version correcte #### 5. Document N'apparaît Pas **Problème**: Document créé n'apparaît pas dans liste **Solutions:** - Vérifier si document supprimé en douce (`deleted_at IS NOT NULL`) - Vérifier création réussie (vérifier réponse/logs) - Vider cache navigateur - Vérifier base: `SELECT * FROM documents WHERE doc_id = 'votre_id';` #### 6. Signature Déjà Existe **Problème**: Utilisateur ne peut pas signer document à nouveau **Cause**: Contrainte UNIQUE (doc_id, user_sub) - une signature par utilisateur par document **Solution**: Comportement attendu - utilisateurs ne peuvent pas signer même document deux fois ### Obtenir de l'Aide **Logs:** ```bash # Logs application docker compose logs -f ackify-ce # Logs base de données docker compose logs -f ackify-db # Logs worker email (grep email) docker compose logs ackify-ce | grep -i email ``` **Inspection base de données:** ```bash # Se connecter à PostgreSQL docker compose exec ackify-db psql -U ackifyr ackify # Requêtes utiles SELECT * FROM documents ORDER BY created_at DESC LIMIT 10; SELECT * FROM expected_signers WHERE doc_id = 'votre_doc_id'; SELECT * FROM email_queue WHERE status != 'sent' ORDER BY created_at DESC; ``` **Rapporter problèmes:** - GitHub: https://github.com/btouchard/ackify-ce/issues - Inclure logs et messages erreur - Décrire comportement attendu vs réel --- ## Référence Rapide ### Variables Environnement ```bash ACKIFY_ADMIN_EMAILS=admin@company.com ACKIFY_MAIL_HOST=smtp.gmail.com ACKIFY_MAIL_FROM=noreply@company.com ``` ### Endpoints Clés ``` GET /admin # Dashboard GET /admin/docs/{docId} # Détail document POST /admin/documents/{docId}/signers # Ajouter signataire POST /admin/documents/{docId}/reminders # Envoyer rappels PUT /admin/documents/{docId}/metadata # Mettre à jour métadonnées ``` ### Tables Importantes - `documents` - Métadonnées documents - `signatures` - Signatures utilisateurs - `expected_signers` - Qui doit signer - `reminder_logs` - Historique emails - `email_queue` - File email async ### Raccourcis Clavier (Frontend) - Barre recherche auto-focus sur dashboard - Entrée pour soumettre formulaires - Échap pour fermer modales --- **Dernière Mise à Jour**: 2025-10-26 **Version**: 1.0.0