467 lines
12 KiB
Markdown
467 lines
12 KiB
Markdown
# Workflow complet d'un agent SimpleConnect
|
|
|
|
## Vue d'ensemble
|
|
|
|
Ce document décrit le parcours complet d'un agent utilisant SimpleConnect, depuis la connexion jusqu'à la déconnexion, en passant par la gestion des appels et l'utilisation des différentes fonctionnalités.
|
|
|
|
## 1. Lancement de l'application
|
|
|
|
### Actions au démarrage
|
|
|
|
```javascript
|
|
// L'agent lance l'application SimpleConnect
|
|
// Initialisation automatique des composants
|
|
```
|
|
|
|
**Processus système** :
|
|
|
|
- Connexion automatique au serveur SignalR (configuré dans `config.json`)
|
|
- Vérification de la disponibilité du service
|
|
- Récupération de la liste des terminaux téléphoniques disponibles
|
|
- Création du fichier de log journalier
|
|
- Génération du dashboard initial (état : application ouverte, non connecté)
|
|
|
|
## 2. Phase de connexion
|
|
|
|
### 2.1 Interface de connexion
|
|
|
|
L'agent arrive sur l'écran de connexion avec :
|
|
|
|
- Champ code agent
|
|
- Champ mot de passe
|
|
- Sélecteur de terminal téléphonique (liste dynamique)
|
|
- Bouton de connexion
|
|
|
|
### 2.2 Processus d'authentification
|
|
|
|
```javascript
|
|
// Envoi des credentials au serveur
|
|
AgentLogin(email, password, terminal) → Serveur SignalR
|
|
|
|
// Réponse du serveur avec les informations complètes
|
|
{
|
|
accessCode: "AGENT001",
|
|
firstName: "Marie",
|
|
lastName: "DUPONT",
|
|
terminal: "3001",
|
|
connList: [ // Centres/files assignés à l'agent
|
|
{
|
|
code: "centre1",
|
|
applicationName: "https://pro.doctolib.fr",
|
|
accessCode: "user_cardio",
|
|
password: "pass123"
|
|
},
|
|
{
|
|
code: "centre2",
|
|
applicationName: "https://pro.mondocteur.fr",
|
|
accessCode: "user_clinique",
|
|
password: "pass456"
|
|
}
|
|
// ...
|
|
]
|
|
}
|
|
```
|
|
|
|
### 2.3 Post-connexion
|
|
|
|
**Actions automatiques après connexion réussie** :
|
|
|
|
1. Génération dynamique des onglets selon les centres assignés
|
|
2. Création des webviews pour chaque plateforme
|
|
3. Auto-connexion aux plateformes médicales (injection des credentials)
|
|
4. Mise à jour de l'interface :
|
|
- Titre fenêtre : "SimpleConnect - Agent: Marie DUPONT - Tel: 3001"
|
|
- Nom agent affiché dans l'interface
|
|
- Statut : "Disponible" (indicateur vert)
|
|
5. Activation de l'écoute des événements IPBX
|
|
6. Mise à jour du dashboard JSON avec les informations de connexion
|
|
|
|
## 3. Phase d'activité - Gestion des appels
|
|
|
|
### 3.1 État disponible
|
|
|
|
**L'agent est prêt à recevoir des appels** :
|
|
|
|
- Statut : indicateur vert "Disponible"
|
|
- Peut naviguer librement entre les onglets
|
|
- Peut consulter les plannings de manière proactive
|
|
- Statistiques visibles : appels traités, RDV pris
|
|
|
|
### 3.2 Réception d'un appel entrant
|
|
|
|
#### Séquence d'événements
|
|
|
|
```
|
|
1. Patient appelle le centre
|
|
↓
|
|
2. Système IPBX détecte l'appel
|
|
↓
|
|
3. Serveur SignalR envoie IpbxEvent
|
|
↓
|
|
4. Client reçoit : {eventCode: 1, terminal: "3001", queueName: "centre1"}
|
|
↓
|
|
5. Interface réagit automatiquement
|
|
```
|
|
|
|
#### Actions système
|
|
|
|
**Notification immédiate** :
|
|
|
|
```javascript
|
|
// Alerte visuelle
|
|
showIncomingCallAlert({
|
|
centreName: "Centre Cardio Lyon",
|
|
patientInfo: "Marie LAMBERT - 0612345678",
|
|
motif: "Consultation urgente",
|
|
});
|
|
|
|
// Son de notification
|
|
playNotificationSound();
|
|
```
|
|
|
|
**Auto-acceptation** :
|
|
|
|
- Timer de 3 secondes avant acceptation automatique
|
|
- Ou acceptation manuelle immédiate par l'agent
|
|
|
|
#### Basculement automatique
|
|
|
|
```javascript
|
|
// Le système identifie le centre concerné
|
|
selectCenter("centre1");
|
|
|
|
// Bascule sur le bon onglet/webview
|
|
switchToTab("Centre Cardio Lyon");
|
|
|
|
// Mise à jour du statut
|
|
updateStatus("EN APPEL - Centre Cardio Lyon");
|
|
```
|
|
|
|
### 3.3 Pendant l'appel
|
|
|
|
**Actions possibles de l'agent** :
|
|
|
|
1. **Prise de RDV** :
|
|
|
|
- Navigation dans le planning actif
|
|
- Recherche de créneaux disponibles
|
|
- Validation du RDV directement dans la webview
|
|
|
|
2. **Prise de notes** :
|
|
|
|
```javascript
|
|
// Zone de notes rapides
|
|
quickNotes.value = "Patient souhaite mardi matin de préférence";
|
|
saveNotes(); // Sauvegarde horodatée
|
|
```
|
|
|
|
3. **Consultation documentation** :
|
|
|
|
```javascript
|
|
// Ouverture wiki interne (nouvelle fenêtre)
|
|
OpenDoc("http://wiki.interne/protocoles");
|
|
|
|
// Consultation infos patient (fenêtre séparée)
|
|
OpenDoc("http://crm.interne/patient/12345");
|
|
```
|
|
|
|
4. **Informations contextuelles** :
|
|
- Historique des derniers appels du patient (si disponible)
|
|
- Procédures spécifiques au centre
|
|
- Tarifs et modalités
|
|
|
|
### 3.4 Fin d'appel
|
|
|
|
#### Séquence de libération
|
|
|
|
```
|
|
1. Patient/Agent raccroche
|
|
↓
|
|
2. Système IPBX détecte la fin d'appel
|
|
↓
|
|
3. Serveur SignalR envoie IpbxEvent
|
|
↓
|
|
4. Client reçoit : {eventCode: 2, terminal: "3001", queueName: "centre1"}
|
|
↓
|
|
5. Libération automatique de la file
|
|
```
|
|
|
|
#### Actions post-appel
|
|
|
|
```javascript
|
|
// Mise à jour automatique
|
|
updateStatus("DISPONIBLE");
|
|
callStats.calls++;
|
|
callStats.appointments++; // Si RDV pris
|
|
|
|
// Sauvegarde dans l'historique
|
|
saveCallHistory({
|
|
timestamp: new Date().toISOString(),
|
|
duration: 180, // secondes
|
|
centre: "centre1",
|
|
status: "completed",
|
|
appointment: true,
|
|
});
|
|
```
|
|
|
|
## 4. Fonctionnalités disponibles pendant la session
|
|
|
|
### 4.1 Navigation multi-centres
|
|
|
|
```javascript
|
|
// L'agent peut gérer plusieurs centres simultanément
|
|
centres = [
|
|
{ id: "centre1", nom: "Centre Cardio Lyon", couleur: "#FF6B6B" },
|
|
{ id: "centre2", nom: "Clinique Saint-Jean", couleur: "#4ECDC4" },
|
|
{ id: "centre3", nom: "Cabinet Dr Martin", couleur: "#45B7D1" },
|
|
];
|
|
|
|
// Navigation libre entre les onglets (hors appel)
|
|
selectCenter("centre2"); // Changement manuel
|
|
```
|
|
|
|
### 4.2 Outils de productivité
|
|
|
|
**Statistiques temps réel** :
|
|
|
|
```javascript
|
|
{
|
|
calls: 15, // Appels traités aujourd'hui
|
|
appointments: 12, // RDV confirmés
|
|
avgDuration: 180, // Durée moyenne en secondes
|
|
successRate: 80 // Taux de conversion
|
|
}
|
|
```
|
|
|
|
**Notes et historique** :
|
|
|
|
```javascript
|
|
// Notes rapides par appel
|
|
saveNotes({
|
|
content: "Patient à rappeler pour confirmation",
|
|
centre: "centre1",
|
|
timestamp: new Date(),
|
|
});
|
|
|
|
// Consultation historique
|
|
getCallHistory(); // 100 derniers appels
|
|
```
|
|
|
|
### 4.3 Fenêtres auxiliaires
|
|
|
|
```javascript
|
|
// Documentation (DocXplore)
|
|
childClientDocXplore = new BrowserWindow({
|
|
x: 1920,
|
|
y: 0, // Position configurée
|
|
title: "SimpleConnect / Wiki",
|
|
});
|
|
|
|
// Informations client
|
|
childClientDoc = new BrowserWindow({
|
|
x: 2880,
|
|
y: 0, // Position configurée
|
|
title: "SimpleConnect / Infos client",
|
|
});
|
|
```
|
|
|
|
## 5. Processus de déconnexion
|
|
|
|
### 5.1 Déclenchement
|
|
|
|
La déconnexion peut être initiée par :
|
|
|
|
- Clic sur le bouton "Déconnexion"
|
|
- Fermeture de l'application (croix de fenêtre)
|
|
- Timeout de session (si configuré)
|
|
|
|
### 5.2 Confirmation et nettoyage
|
|
|
|
```javascript
|
|
// Dialogue de confirmation
|
|
if (confirm("Voulez-vous vraiment vous déconnecter ?")) {
|
|
// 1. Notification au serveur
|
|
AgentLogoff(agentId);
|
|
|
|
// 2. Nettoyage local
|
|
currentAgent = null;
|
|
currentCentres = [];
|
|
webviews = {};
|
|
|
|
// 3. Fermeture des fenêtres auxiliaires
|
|
if (childClientDocXplore) childClientDocXplore.close();
|
|
if (childClientDoc) childClientDoc.close();
|
|
|
|
// 4. Génération log final
|
|
writeDashboardLog({
|
|
PrestaConnect: {
|
|
Connexion: {
|
|
Connecte: "Non",
|
|
Date_Deconnexion: new Date().toISOString(),
|
|
},
|
|
},
|
|
});
|
|
|
|
// 5. Retour page connexion ou fermeture
|
|
showLoginPage(); // ou app.quit()
|
|
}
|
|
```
|
|
|
|
## 6. Logs et monitoring
|
|
|
|
### 6.1 Structure du dashboard
|
|
|
|
**Fichier** : `./log/log-Dashboard.json`
|
|
|
|
```json
|
|
{
|
|
"PrestaConnect": {
|
|
"Ouverture": {
|
|
"Ouvert": "Oui",
|
|
"Date": "2024-12-04T10:00:00.000Z",
|
|
"IP_Client": "192.168.1.50",
|
|
"IP_Serveur": "10.90.20.201:8002",
|
|
"Liste_Telephones": ["3001", "3002", "3003"]
|
|
},
|
|
"Connexion": {
|
|
"Connecte": "Oui",
|
|
"Date": "2024-12-04T10:01:00.000Z",
|
|
"Agent": "AGENT001",
|
|
"Telephone": "3001",
|
|
"Nom_Agent": "Marie DUPONT",
|
|
"Nombre_Files": 3,
|
|
"Files": [
|
|
{
|
|
"Nom_File": "centre1",
|
|
"URL_File": "https://pro.doctolib.fr"
|
|
},
|
|
{
|
|
"Nom_File": "centre2",
|
|
"URL_File": "https://pro.mondocteur.fr"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 6.2 Logs détaillés
|
|
|
|
**Fichier** : `./log/YYYY-MM-DD-log.txt`
|
|
|
|
```
|
|
[2024-12-04 10:00:00.123] [info] Start application
|
|
[2024-12-04 10:00:01.456] [info] ip: 10.90.20.201:8002
|
|
[2024-12-04 10:00:02.789] [info] SignalR connected
|
|
[2024-12-04 10:01:00.123] [info] Agent login: AGENT001
|
|
[2024-12-04 10:05:30.456] [info] IpbxEvent received: eventCode=1, terminal=3001
|
|
[2024-12-04 10:08:45.789] [info] IpbxEvent received: eventCode=2, terminal=3001
|
|
```
|
|
|
|
## 7. Mode développement et simulation
|
|
|
|
### 7.1 Panneau de test CTI
|
|
|
|
En mode développement (`NODE_ENV=development`), un panneau de test permet :
|
|
|
|
```javascript
|
|
// Simulation d'appels
|
|
ctiSimulator.generateRandomCall();
|
|
|
|
// Simulation automatique
|
|
ctiSimulator.startAutoSimulation(30); // Un appel toutes les 30 secondes
|
|
|
|
// Scénarios prédéfinis
|
|
ctiSimulator.simulateScenarios():
|
|
- "Appel urgent"
|
|
- "Patient régulier"
|
|
- "Nouveau patient"
|
|
- "Demande résultats"
|
|
```
|
|
|
|
### 7.2 Statistiques de simulation
|
|
|
|
```javascript
|
|
{
|
|
total: 45, // Total appels simulés
|
|
today: 15, // Appels aujourd'hui
|
|
answered: 14, // Appels traités
|
|
missed: 1, // Appels manqués
|
|
average_duration: 180 // Durée moyenne
|
|
}
|
|
```
|
|
|
|
## 8. Diagramme d'états
|
|
|
|
```
|
|
┌─────────────┐
|
|
│ DÉCONNECTÉ │
|
|
└─────┬───────┘
|
|
│ Connexion
|
|
↓
|
|
┌─────────────┐
|
|
│ CONNEXION │
|
|
└─────┬───────┘
|
|
│ Authentification réussie
|
|
↓
|
|
┌─────────────┐ Appel entrant ┌─────────────┐
|
|
│ DISPONIBLE │ ←─────────────────→ │ EN APPEL │
|
|
└─────┬───────┘ Fin d'appel └─────────────┘
|
|
│
|
|
│ Déconnexion
|
|
↓
|
|
┌─────────────┐
|
|
│ DÉCONNEXION │
|
|
└─────────────┘
|
|
```
|
|
|
|
## 9. Points clés du workflow
|
|
|
|
### Avantages pour l'agent
|
|
|
|
1. **Zéro friction** : Pas de recherche manuelle de plateforme
|
|
2. **Contexte automatique** : Basculement instantané vers le bon planning
|
|
3. **Productivité maximale** : Auto-connexion, notes rapides, historique
|
|
4. **Traçabilité complète** : Tous les événements sont enregistrés
|
|
5. **Multi-tâches optimisé** : Gestion simultanée de plusieurs centres
|
|
|
|
### Optimisations système
|
|
|
|
1. **Reconnexion automatique** SignalR en cas de perte réseau
|
|
2. **Sessions persistantes** dans les webviews
|
|
3. **Cache local** des dernières sélections (terminal, notes)
|
|
4. **Logs structurés** pour analyse et monitoring
|
|
5. **Mode simulation** pour formation et tests
|
|
|
|
## 10. Cas d'usage spéciaux
|
|
|
|
### 10.1 Appel urgent
|
|
|
|
```javascript
|
|
// Identification par priorité haute
|
|
if (callData.priority === "high") {
|
|
// Notification visuelle renforcée
|
|
showUrgentCallAlert(callData);
|
|
// Son différent
|
|
playUrgentSound();
|
|
// Auto-acceptation immédiate
|
|
acceptCall(callData);
|
|
}
|
|
```
|
|
|
|
### 10.2 Patient régulier
|
|
|
|
```javascript
|
|
// Affichage historique patient
|
|
if (callData.lastVisit) {
|
|
showPatientHistory({
|
|
lastVisit: callData.lastVisit,
|
|
appointments: callData.appointmentHistory,
|
|
});
|
|
}
|
|
```
|
|
|
|
### 10.3 Multi-files simultanées
|
|
|
|
L'agent peut recevoir des appels de différentes files et le système bascule automatiquement vers la bonne plateforme à chaque appel, permettant une gestion fluide multi-centres.
|