18 KiB
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
- Dashboard Admin
- Gestion des Documents
- Signataires Attendus
- Rappels Email
- Monitoring & Statistiques
- Bonnes Pratiques
- 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.
# Dans le fichier .env
ACKIFY_ADMIN_EMAILS=admin@company.com,manager@company.com
Après ajout de votre email:
- Redémarrer Ackify:
docker compose restart ackify-ce - Se déconnecter et se reconnecter
- 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:
- Cliquer sur le bouton "Créer Nouveau Document"
- 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
- 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:
- Cliquer sur "Éditer Métadonnées"
- Modifier les champs
- Cliquer sur "Sauvegarder"
- 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:
- Cliquer sur "Éditer Métadonnées"
- Modifier les champs désirés
- Cliquer sur "Sauvegarder"
- Si checksum/algorithme changé, confirmer dans modal
- Notification de succès affichée
Supprimer un Document
Comportement Suppression Douce:
- Document marqué comme supprimé (timestamp
deleted_atdé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:
- Aller sur page détail document (
/admin/docs/{docId}) - Cliquer sur bouton "Supprimer Document"
- Confirmer suppression dans modal
- 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:
- Défiler jusqu'à la section "Signataires Attendus"
- Cliquer sur bouton "Ajouter Signataire Attendu"
- Entrer adresse(s) email:
- Simple:
alice@company.com - Multiple: Séparées par virgules
alice@company.com,bob@company.com
- Simple:
- Optionnellement ajouter des notes
- Cliquer sur "Ajouter"
Endpoint API:
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:
- Trouver signataire dans liste Signataires Attendus
- Cliquer sur bouton "Retirer" à côté de leur email
- Confirmer le retrait
Endpoint API:
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:
GET /api/v1/admin/documents/{docId}/status
Réponse:
{
"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:
- Cliquer sur bouton "Envoyer Rappels"
- 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
- Cliquer sur "Envoyer Rappels"
- Confirmation: "X rappels mis en file pour envoi"
Endpoint API:
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
emailsnon spécifié - Envoie aux
emailsspé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 HTMLreminder.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:
GET /api/v1/admin/documents/{docId}/reminders
Réponse:
{
"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èsfailed- É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):
-- 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:
-- 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:
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:
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_SECRETpé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:
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_FROMest 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:
# 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:
# 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
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 documentssignatures- Signatures utilisateursexpected_signers- Qui doit signerreminder_logs- Historique emailsemail_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