PharmaPro — Manuel d'utilisation complet
Logiciel de gestion de pharmacie pour le marché algérien Version 1.0 — Édition complète
Table des matières
- Présentation générale
- Pré-requis techniques et installation
- Activation de la licence
- Premier démarrage
- Tour de l'interface
- Tableau de bord
- Module Médicaments
- Suivi par lots — FEFO
- Point de Vente (POS)
- Module Caisse — Shifts X / Z
- Ordonnances médicales
- Ventes en Instance (Chifa différée)
- Retours et remboursements
- Rejets CHIFA
- Crédits / Dettes
- Clients / Patients
- Programme de fidélité
- Fournisseurs
- Factures fournisseur et OCR
- Statistiques et rapports
- Bordereau CHIFA
- Promotions / Remises
- Interactions médicamenteuses
- Journal d'activité
- Utilisateurs et rôles
- Paramètres
- Synchronisation multi-pharmacie
- Accès mobile (lecture seule)
- Sauvegarde et restauration
- Raccourcis clavier
- Dépannage
- Annexes
1. Présentation générale
PharmaPro est un logiciel de gestion d'officine conçu spécifiquement pour les pharmacies algériennes. Il couvre l'intégralité du cycle quotidien — accueil patient, ordonnance, vente comptoir, paiement Chifa/CASNOS/Mutuelle, gestion des stocks par lot avec péremption, déclaration des bordereaux CNAS, suivi des rejets, dettes des clients, achats fournisseurs et reporting comptable.
Points distinctifs : - Interface clavier-first (le pharmacien n'a pas besoin de la souris pour vendre) - Base d'environ 2100 spécialités pré-importée - Couverture complète des régimes algériens : Chifa CNAS, CASNOS, Mutuelle complémentaire, caisse Militaire, ventes mixtes - Suivi par lot (FEFO — premier périmé, premier sorti) - Détection automatique des interactions médicamenteuses configurées - Synchronisation bidirectionnelle vers un serveur HQ (mode chaîne de pharmacies) - Interface bilingue français / arabe avec basculement RTL automatique - Application mobile en lecture seule pour le propriétaire (réseau local)
Stack technique : Python 3.10+, PyQt6, SQLite avec WAL, ReportLab pour les PDF, ESC/POS pour les imprimantes thermiques. Aucune dépendance cloud obligatoire — tout fonctionne hors-ligne.
2. Pré-requis techniques et installation
Configuration recommandée
| Composant | Minimum | Recommandé |
|---|---|---|
| Système | Windows 10 64-bit | Windows 11 |
| RAM | 4 Go | 8 Go |
| Disque | 500 Mo libres | 2 Go (sauvegardes) |
| Écran | 1280 × 720 | 1920 × 1080 |
| Imprimante | Optionnelle | Thermique 80 mm |
| Lecteur code-barres | Optionnel | USB type clavier |
Installation
L'installeur Inno Setup (PharmaPro_Setup.exe) effectue :
1. Création du dossier C:\Program Files\PharmaPro
2. Copie de l'exécutable et des ressources
3. Création des sous-dossiers data/, backups/, data/exports/, data/receipts/
4. Génération d'un raccourci sur le bureau et dans le menu Démarrer
Aucune dépendance Python externe n'est requise — l'exécutable est packagé avec PyInstaller.
3. Activation de la licence
PharmaPro utilise un système de licence lié au matériel (HWID). Une licence ne fonctionne que sur la machine pour laquelle elle a été générée.
Procédure
- Au premier lancement, la fenêtre Activation de Licence apparaît.
- Le HWID de la machine s'affiche au format
XXXX-XXXX-XXXX-XXXX. - Communiquez ce HWID au revendeur ou à l'éditeur.
- Vous recevez en retour une chaîne de caractères chiffrée (la clé).
- Collez la clé dans le champ prévu et cliquez sur Activer.
Le système vérifie : - La validité cryptographique de la clé (Fernet AES-128 + HMAC-SHA256) - La correspondance entre le HWID encodé et le HWID actuel - La date d'expiration
Si tout est valide, la fenêtre se ferme et l'application bascule sur l'écran de connexion.
4. Premier démarrage
Au premier démarrage, PharmaPro :
- Crée la base SQLite data/pharma.db avec toutes les tables nécessaires
- Installe les triggers de synchronisation
- Insère un compte administrateur par défaut :
- Identifiant : admin
- Mot de passe : admin2026
- Crée la pharmacie principale (id = 1)
- Effectue une sauvegarde initiale dans backups/
Action immédiate recommandée : connectez-vous, allez dans Utilisateurs, modifiez le mot de passe administrateur, puis créez les comptes des vendeurs avec le rôle worker.
5. Tour de l'interface
L'interface se compose de trois zones principales :
- Barre supérieure : nom de la pharmacie, indicateur de synchronisation, horloge, identité de l'utilisateur, bouton de déconnexion
- Barre latérale gauche : 18 boutons de navigation
- Zone centrale : page active
Les pages réservées à l'administrateur (rôle admin) sont masquées pour les vendeurs (worker). Les pages opérationnelles (POS, Caisse, Ordonnances, Retours, etc.) sont accessibles à tous les utilisateurs connectés.
6. Tableau de bord
Le tableau de bord donne une vue d'ensemble de la pharmacie en un coup d'œil :
Cartes KPI (8 indicateurs) : - Ventes du jour, profit du jour, nombre de ventes - Chiffre d'affaires total cumulé - Produits en stock, stock faible - Nombre de clients enregistrés - Total Chifa (CNAS) cumulé
Trois graphiques générés en temps réel : - Tendance CA — 30 derniers jours (sparkline) - Mix d'aujourd'hui (donut par type de vente) - Ventes — 7 derniers jours (histogramme journalier)
Alertes visibles automatiquement : - Bandeau rouge si dettes en cours - Bandeau orange si rejets CHIFA en attente - Liste des médicaments proches de la péremption - Liste des médicaments en stock faible - Patients chroniques avec visite proche
Tableau des ventes récentes (15 dernières ventes du jour avec heure, montant, type, mode de paiement, profit, vendeur).
Le tableau se rafraîchit à chaque navigation vers la page.
7. Module Médicaments
Cette page gère le catalogue produits.
Colonnes affichées : ID, Nom, Quantité, Prix Vente, Prix Achat, Date de Péremption, Catégorie, Code-barres, Fournisseur.
Filtres rapides : - Tous - Stock faible (en dessous du seuil paramétré) - Rupture de stock - Expire bientôt - Par catégorie (Médicament, Parapharmacie, Cosmétique, Complément alimentaire, Matériel médical, Autre)
Actions disponibles : - ➕ Ajouter un nouveau produit - ✏️ Modifier un produit sélectionné - 📦 Voir Lots : ouvre le détail des lots avec DDP, prix d'achat, fournisseur, facture d'origine - 🗑️ Supprimer (avec confirmation)
Saisie code-barres intelligente : dans le dialogue d'ajout, si vous scannez un code-barres déjà présent dans la base, le logiciel propose de basculer en mode édition pour éviter les doublons.
8. Suivi par lots — FEFO
Chaque livraison fournisseur crée automatiquement un lot dans la table dédiée. Un lot enregistre : - Le médicament concerné - La quantité reçue - Le prix d'achat de cette livraison - La date de péremption (DDP) - Le fournisseur et la facture d'origine - La date de réception - Une remarque optionnelle
Algorithme FEFO (First Expired, First Out) : à chaque vente, le système puise dans le lot dont la DDP est la plus proche. Si ce lot est épuisé, il bascule automatiquement sur le lot suivant. Le champ medicaments.quantite reste synchronisé en tant que cache pour les requêtes rapides.
Rétrocompatibilité : les médicaments existant avant l'activation du suivi par lot (ou importés en masse) reçoivent automatiquement un lot dit "de migration" couvrant leur stock courant. Aucune perte de données.
Visualisation : depuis la page Médicaments, le bouton 📦 Voir Lots ouvre une boîte listant tous les lots du produit sélectionné, classés par DDP croissante.
9. Point de Vente (POS)
Le POS est l'écran le plus utilisé de la journée. Il est conçu pour fonctionner intégralement au clavier.
Disposition
- Colonne gauche : barre de recherche, liste des produits filtrés, sélecteur de quantité
- Colonne droite : panier, total, type de vente, zone paiement, boutons d'action, bandeau ordonnance/fidélité
Workflow type
- Le pharmacien tape ou scanne le nom / code-barres du produit (
F2met le focus sur la recherche) - Il appuie sur
Entréepour ajouter au panier (ou double-clic) - Il choisit le type de vente (combo box) :
- Espèces (Comptoir)
- Carte Chifa (CNAS)
- CASNOS
- Mutuelle complémentaire
- Caisse militaire
- Mixte (cash + tiers)
- Si le type implique un tiers payant, un champ "Montant pris en charge" apparaît
- Il valide avec
F12ou clique sur Encaisser - Le ticket s'imprime sur l'imprimante thermique configurée (ou est sauvegardé en .txt)
Fonctionnalités automatiques
- Promotions : si le médicament a une promotion active, le prix unitaire est automatiquement réduit (le détail apparaît dans le panier)
- Interactions : si deux médicaments du panier ont une interaction connue, une alerte rouge bloque la validation jusqu'à confirmation explicite (la décision est journalisée)
- Fidélité : si activée et qu'un client est sélectionné, ses points utilisables apparaissent + un sélecteur permet d'en consommer
- Stock : le système refuse une vente si la quantité demandée dépasse le stock disponible
Boutons additionnels
- ⚠ Vente à Crédit (
Ctrl+D) : ouvre un dialogue pour créer une dette client - ⏳ Vente en Instance (
Ctrl+I) : crée une vente Chifa sans encaissement (le patient reviendra avec sa carte) - Vider (
Echap) : réinitialise le panier
Touches de navigation panier
+: incrémenter la ligne sélectionnée−: décrémenterSuppr: supprimer la ligne
10. Module Caisse — Shifts X / Z
La page Caisse gère le shift de chaque caissier.
Ouverture du shift
À la prise de poste, l'utilisateur clique sur ▶ Ouvrir un Shift et saisit le fond de caisse (espèces déjà présentes dans le tiroir). Une seule session ouverte par utilisateur à la fois.
Pendant le shift
Toutes les ventes effectuées sont automatiquement rattachées au shift en cours via la colonne ventes.shift_id. Cela inclut les ventes comptoir, Chifa, mixtes, et les retours (en négatif).
Rapport X (état courant)
À tout moment, le bouton 🔄 Actualiser X affiche : - Nombre de ventes - CA brut - Espèces attendues (= fond + part cash + retours négatifs) - Total tiers payants - Détail par type de vente
Le rapport X est non-destructif et peut être consulté autant de fois que nécessaire.
Clôture (Z-report)
À la fin du poste, ⏹ Clôturer (Z) demande au caissier de compter physiquement les espèces présentes dans le tiroir. Le système calcule l'écart entre ce qui est compté et ce qui est attendu, puis verrouille le shift.
L'écart est : - Vert s'il est nul - Rouge s'il y a un manquant ou un excédent
Tous les détails sont conservés en base (caisse_shifts) pour audit.
11. Ordonnances médicales
Cette page gère les prescriptions remises par les patients.
Création d'une ordonnance
- ➕ Nouvelle Ordonnance
- Sélectionner le patient (créé au préalable depuis Clients)
- Saisir le médecin prescripteur (optionnel)
- Date de prescription (par défaut aujourd'hui)
- Statut initial (généralement En attente)
- Ajouter les lignes : pour chaque ligne, rechercher le médicament, indiquer la posologie ("1 cp x 3 / jour, 7 jours") et la quantité prescrite
Délivrance dans le POS
Le bouton 💊 Délivrer (POS) charge automatiquement les lignes non encore délivrées dans le panier du POS. Le pharmacien valide la vente normalement. Au moment de la validation, les compteurs quantite_delivree sont mis à jour et le statut de l'ordonnance évolue automatiquement :
- En attente → Partielle → Délivrée
Statuts disponibles
- En attente : aucune délivrance
- Partielle : au moins une ligne partiellement délivrée
- Délivrée : toutes les lignes complètement délivrées
- Annulée : abandonnée
Impression PDF
Depuis le dialogue d'édition, 📄 Imprimer PDF génère un document A4 avec en-tête de la pharmacie, identité du patient, tableau des lignes, motif et zone de signature pharmacien.
12. Ventes en Instance (Chifa différée)
Cas typique : le patient se présente sans sa carte Chifa. Le pharmacien peut quand même délivrer les médicaments et différer le règlement.
Création
- Préparer le panier comme pour une vente normale
- Le client doit être préalablement sélectionné (la vente en instance exige un patient)
- Cliquer sur ⏳ Vente en Instance (
Ctrl+I) - Confirmer
Effets immédiats :
- Le stock est dégagé (les lots sont touchés en FEFO)
- Une vente est créée avec statut = 'En instance'
- Aucun encaissement n'est enregistré
Page dédiée
La page Ventes en Instance liste toutes les ventes en attente avec patient, date, type, total. Deux actions :
- ✓ Régler (carte présentée) : ouvre un dialogue de paiement (Chifa / Mixte / Espèces) qui passe le statut à Validée
- ↺ Annuler (rendre stock) : restitue les unités au stock et passe le statut à Annulée
13. Retours et remboursements
La page Retours liste les 100 dernières ventes éligibles au remboursement (validées, hors retours).
Procédure
- Sélectionner la vente
- ↩ Rembourser cette vente
- Le dialogue affiche toutes les lignes avec leur quantité vendue et la quantité déjà remboursée
- Saisir, ligne par ligne, la quantité à rembourser (limitée à
vendu - déjà remboursé) - Indiquer un motif (produit défectueux, erreur de saisie, etc.)
- Valider le remboursement
Effets :
- Une nouvelle vente est créée avec total négatif et type_vente = 'Retour'
- Elle pointe vers la vente d'origine (vente_origine_id)
- Le stock est restitué au lot le plus récent du médicament
- Le shift de caisse en cours est impacté en négatif
14. Rejets CHIFA
Après dépôt d'un bordereau, la CNAS peut signaler des lignes rejetées (mauvais code patient, médicament hors nomenclature, dépassement, signature manquante, etc.).
Saisie d'un rejet
- ➕ Saisir un Rejet
- Rechercher la vente Chifa concernée
- Indiquer le motif (8 motifs prédéfinis ou texte libre)
- Saisir le montant rejeté
- Date du rejet et statut initial
Statuts
- En attente : à traiter
- Re-déposé : corrigé et envoyé dans le bordereau suivant
- Recouvré : remboursé après contestation
- Perdu : abandon, perte sèche
Trois boutons rapides évitent de rouvrir le dialogue (Recouvré / Re-déposé / Perdu).
Indicateur de tableau de bord
Dès qu'au moins un rejet est en attente ou re-déposé, un bandeau orange apparaît sur le tableau de bord avec le total cumulé.
15. Crédits / Dettes
Gestion des ventes à crédit (cas fréquents : famille du pharmacien, pharmacie d'urgence d'un employeur, patients chroniques connus).
Création depuis le POS
Bouton ⚠ Vente à Crédit (Ctrl+D) ouvre un dialogue qui demande nom, prénom, téléphone, carte d'identité du débiteur. Le panier est converti en dette ; le stock est dégagé.
Page Dettes
Liste les dettes avec montant total, montant payé, montant restant, statut (En cours / Soldée / Annulée).
Pour chaque dette : possibilité d'enregistrer des paiements partiels qui s'additionnent dans paiements_dette. Le statut bascule automatiquement à Soldée quand le restant atteint 0.
Indicateur tableau de bord
Bandeau rouge avec le total des dettes en cours et la liste des 10 plus gros débiteurs.
16. Clients / Patients
Fichier patient avec : - Nom, téléphone - Âge, sexe - Maladie chronique (champ libre) - Date de prochaine visite (alerte automatique sur le tableau de bord) - Remarques - Solde de points fidélité
Recherche par nom ou téléphone. Le fichier patient sert de pivot pour les ordonnances, les ventes en instance, les dettes, et le programme de fidélité.
17. Programme de fidélité
Désactivé par défaut. À activer dans Paramètres → Programme de fidélité.
Configuration
- DA dépensés pour 1 point gagné (par défaut 100 — c'est-à-dire 1 point par 100 DA dépensés)
- Valeur en DA d'1 point utilisé (par défaut 1 — soit 1 point = 1 DA de remise)
Utilisation au POS
Une fois activée, une zone Client (fidélité) apparaît dans le POS. En sélectionnant un client, son solde de points s'affiche. Le caissier peut saisir un nombre de points à utiliser ; la remise correspondante est immédiatement déduite du total.
À la validation de la vente : - Les points utilisés sont retirés du compte client - De nouveaux points sont crédités sur la base du montant net payé
Les points ne sont pas crédités sur les ventes en instance tant qu'elles ne sont pas réglées.
18. Fournisseurs
Fichier simple avec nom, téléphone, adresse, email, date d'ajout. Le fichier sert de référence pour les factures et les lots.
19. Factures fournisseur et OCR
Saisie d'une facture
- ➕ Nouvelle Facture
- Sélectionner le fournisseur, le numéro de facture (auto-incrémenté), la date, le statut, les remarques
- Pour chaque ligne : médicament, quantité, prix unitaire, date de péremption
- Le total se calcule en temps réel
À la validation : - La facture est enregistrée - Un lot est créé pour chaque ligne (suivi FEFO) - Le stock du médicament est augmenté
Saisie rapide par code-barres
Un champ 🔖 Scan code-barres au-dessus du tableau permet de scanner ou taper un code, puis Entrée. Le système ajoute automatiquement une ligne avec le médicament correspondant pré-rempli.
OCR (Scaneye-style) — optionnel
Le bouton 📷 Scanner Facture (OCR) permet d'importer une image de facture papier. Le système extrait les lignes via Tesseract OCR.
Pré-requis pour activer l'OCR :
1. Installer Tesseract OCR pour Windows (https://github.com/UB-Mannheim/tesseract/wiki)
2. Ajouter le dossier d'installation au PATH système
3. pip install pytesseract Pillow
4. Optionnellement, le pack français de langue
Si l'OCR n'est pas installé, le bouton affiche les instructions d'installation au lieu d'échouer silencieusement.
Export PDF
Bouton 📄 Exporter PDF génère une facture A4 imprimable avec en-tête pharmacie, fournisseur, lignes et total.
20. Statistiques et rapports
Page accessible à tous, avec : - Sélecteur de plage de dates (par défaut le mois en cours) - Top 15 produits vendus sur la période - Ventes par utilisateur - Résumé textuel : nombre de ventes, CA, profit, marge moyenne - Bouton 📄 Générer Rapport Complet affiche un récapitulatif global incluant stock, clients, dettes
21. Bordereau CHIFA
Deux boutons d'export sur la page Statistiques :
Bordereau (résumé)
📤 Bordereau CHIFA (CSV) — Une ligne par vente Chifa/CASNOS/Mutuelle/Militaire/Mixte avec : N° vente, Date, Heure, Patient, Téléphone, N° Ordonnance, Médecin, Type, Mode Paiement, Total, Espèces, Carte Chifa.
Détail des lignes
📤 Détail Lignes CHIFA — Une ligne par produit vendu : N° vente, Date, Patient, Produit, Quantité, P.U., Sous-total, Total Vente, Part Chifa.
Le format est CSV avec séparateur ;, virgule décimale et UTF-8 BOM, donc directement lisible par Microsoft Excel.
Important : le format CNAS officiel peut évoluer. Vérifiez avec un bordereau de référence avant dépôt et signalez à l'éditeur toute divergence.
Les fichiers sont enregistrés dans data/exports/bordereau_chifa_*_<date_du>_au_<date_au>.csv.
22. Promotions / Remises
Page admin permettant de définir des remises automatiques.
Création
- ➕ Nouvelle Promo
- Choisir le médicament cible
- Type : % (pourcentage) ou DA (montant fixe)
- Valeur (par exemple 20 pour -20%)
- Optionnellement : date de début et / ou date de fin
- Activer immédiatement (oui / non)
Application au POS
À chaque ajout au panier, le système vérifie si une promotion active existe pour le médicament. Si oui, le prix unitaire est immédiatement réduit. La remise unitaire et le total des remises sont conservés sur la vente (remise_totale) pour reporting.
Filtres de la liste
- Toutes
- Actives (en cours sur la fenêtre de date)
- Expirées
- Désactivées (manuellement)
23. Interactions médicamenteuses
Page admin pour configurer la base d'interactions.
Création d'une interaction
- ➕ Nouvelle Interaction
- Sélectionner le Médicament A dans la liste
- Sélectionner le Médicament B
- Choisir la Sévérité : Mineure / Modérée / Sévère / Contre-indiquée
- Décrire le mécanisme et la conduite à tenir
Détection automatique au POS
À chaque ajout d'un médicament au panier, le système recherche les interactions connues avec les autres lignes déjà présentes. Si au moins une interaction est trouvée, une boîte d'alerte apparaît : - Code couleur par sévérité (jaune → rouge → noir) - Description complète du risque - Choix : Oui (j'ajoute quand même) ou Non (je retire)
Si le pharmacien décide de passer outre, son choix est enregistré dans le journal d'activité avec la mention INTERACTION_OVERRIDE.
24. Journal d'activité
Page admin (lecture seule). Liste chronologique de toutes les actions sensibles : connexions, ventes, modifications de stock, suppressions, interactions ignorées, ouvertures et clôtures de shifts, exports CSV, synchronisations.
Chaque entrée comporte : horodatage, utilisateur, action, détails. Filtrable par texte libre.
25. Utilisateurs et rôles
Page admin permettant de créer, modifier ou désactiver les comptes.
Rôles
- admin : accès à toutes les pages (Promotions, Interactions, Journal, Utilisateurs, Paramètres inclus)
- worker : accès opérationnel uniquement (POS, Caisse, Ordonnances, Retours, etc.)
Les mots de passe sont hachés avec bcrypt (jamais stockés en clair).
26. Paramètres
Page admin centralisée :
Informations de la pharmacie
Nom, adresse, téléphone (utilisés sur les tickets et les PDF).
Alertes et seuils
- Seuil de stock faible
- Nombre de jours pour l'alerte de péremption
Affichage
Taille de police globale + aperçu en direct.
Programme de fidélité
Activation, taux de gain, valeur d'1 point.
Accès Mobile (LAN)
Port HTTP, mot de passe d'accès, boutons Démarrer/Arrêter, lien direct vers l'IP locale.
Synchronisation vers HQ
URL serveur HQ, jeton, boutons Tester / Synchroniser maintenant, sync automatique avec intervalle.
Langue de l'interface
Français / Arabe (basculement RTL automatique au redémarrage).
27. Synchronisation multi-pharmacie
PharmaPro fonctionne en standalone par défaut, mais peut s'inscrire dans une chaîne de plusieurs pharmacies via un serveur central HQ.
Architecture
[Branche A] ─┐
│
[Branche B] ─┼──HTTPS──> [Serveur HQ] ──> [Admin web UI]
│
[Branche C] ─┘
Chaque branche conserve sa base SQLite locale (mode offline-first). Toutes les modifications sont capturées par des triggers dans une table sync_outbox puis envoyées au HQ par paquets.
Configuration côté HQ
Le HQ se lance via le script scripts/run_hq_server.py.
# Génération d'un certificat TLS auto-signé pour le réseau local
python scripts/run_hq_server.py gen-cert --cn hq.pharmacie.dz
# Création d'un jeton pour la branche n°2
python scripts/run_hq_server.py add-token --pharmacy-id 2
# Démarrage en HTTPS avec UI admin
python scripts/run_hq_server.py serve \
--port 9090 \
--tls-cert data/hq_cert.pem \
--tls-key data/hq_key.pem \
--admin-password "MotDePasseFort"
Endpoints exposés :
- GET /v1/health — sondage public (uptime monitoring)
- GET /v1/ping — test d'authentification
- POST /v1/changes — réception des changements branches
- GET /v1/changes?since=&limit= — broadcasts vers la branche
- GET /admin — interface web admin (login par cookie)
Configuration côté branche
Dans Paramètres → Synchronisation vers HQ : 1. Saisir l'URL HQ (HTTPS recommandé) 2. Coller le jeton fourni 3. Cliquer sur 🔌 Tester pour vérifier la connectivité 4. Activer Sync automatique avec un intervalle (par défaut 5 minutes)
À chaque cycle automatique : - Push : la branche envoie son outbox au HQ - Pull : la branche récupère les broadcasts (mises à jour catalogue, transferts inter-branches)
Broadcasts depuis HQ
Le chef de chaîne peut pousser des changements à toutes les branches :
# Mise à jour du prix de vente d'un produit pour toute la chaîne
python scripts/run_hq_server.py broadcast \
--table medicaments --op U --pk 1234 \
--payload-inline '{"prix_vente": 150}'
Transferts de stock inter-branches
# Transfert de 50 unités du produit 42 de la branche 2 vers la 3
python scripts/run_hq_server.py transfer \
--source 2 --target 3 --pk 42 --qty 50
Les deux branches reçoivent automatiquement les ajustements à la prochaine sync.
Interface web admin HQ
Accessible à https://hq.pharmacie.dz:9090/admin avec le mot de passe configuré au démarrage. Affiche :
- Tableau de bord chaîne (4 KPIs principaux)
- Liste des branches avec dernière connexion
- Tables répliquées avec compteurs de lignes
- Rapports : CA chaîne, CA par pharmacie, top 20 produits, valeur du stock par pharmacie
- Détail par pharmacie : 50 derniers changements, total reçu, par table
Anti-écho
Les triggers de la branche sont équipés d'une garde WHEN NOT EXISTS (SELECT 1 FROM sync_state WHERE key='applying_remote'). Pendant qu'une branche applique un broadcast pull, ses triggers locaux ne créent pas de nouvelles entrées d'outbox — évitant ainsi tout effet ping-pong infini.
28. Accès mobile (lecture seule)
Permet au propriétaire de consulter l'état de la pharmacie depuis son téléphone, sur le même réseau Wi-Fi local.
Activation
Dans Paramètres → Accès Mobile (LAN) :
1. Définir un port (par défaut 8080)
2. Saisir un mot de passe
3. Cliquer sur ▶ Démarrer le serveur
4. Le système affiche l'URL à ouvrir depuis le téléphone (par exemple http://192.168.1.10:8080)
Pages accessibles
/login: authentification/: tableau de bord (KPIs : ventes du jour, profit, stock, dettes, rejets)/stock: top 10 stock faible + top 10 péremption proche (≤ 90 jours)/dettes: top 10 débiteurs
L'interface est responsive et adaptée au format mobile. Aucune écriture n'est possible — l'accès mobile est strictement consultatif.
⚠ Le serveur n'utilise pas TLS et n'est destiné qu'au réseau local. Ne l'exposez pas à Internet sans reverse proxy HTTPS.
29. Sauvegarde et restauration
Sauvegardes automatiques
À chaque démarrage de l'application, une copie horodatée de data/pharma.db est écrite dans backups/.
Avant chaque opération sensible (import en masse, par exemple), une sauvegarde supplémentaire est créée.
Sauvegarde manuelle
Copiez simplement le fichier data/pharma.db à l'emplacement de votre choix. Tant que l'application est fermée (ou en mode WAL avec checkpoint propre), c'est suffisant.
Restauration
- Fermer PharmaPro
- Remplacer
data/pharma.dbpar la sauvegarde - Relancer l'application
30. Raccourcis clavier
| Touche | Effet | Page |
|---|---|---|
F2 |
Focus barre de recherche | POS |
F12 |
Encaisser | POS |
Entrée |
Ajouter au panier | POS |
+ / − |
Incrémenter / décrémenter ligne sélectionnée | POS |
Suppr |
Supprimer la ligne sélectionnée | POS |
Ctrl+D |
Vente à crédit | POS |
Ctrl+I |
Vente en instance | POS |
Echap |
Vider la recherche puis le panier | POS |
Ctrl+Entrée |
Encaisser (alternative à F12) | POS |
| Double-clic | Ouvrir détail / éditer | la plupart des tableaux |
31. Dépannage
"Aucune clé de licence trouvée"
La licence est manquante ou corrompue. Communiquez votre HWID au revendeur pour en obtenir une nouvelle.
"Cette licence est liée à un autre appareil"
Le HWID a changé (changement de carte mère, réinstallation Windows). Demandez une nouvelle licence pour le HWID actuel.
"Stock insuffisant" au moment de l'encaissement
Une autre vente est passée entre l'ajout au panier et la validation. Rafraîchissez le panier ou réduisez la quantité.
L'imprimante thermique n'imprime pas
Vérifiez le type d'imprimante dans Paramètres :
- auto : essaie Windows raw puis ESC/POS USB
- escpos : USB, série, réseau ou Win32-raw selon configuration
- win32 : utilise le pilote Windows
- none : sauvegarde uniquement en fichier dans data/receipts/
La synchronisation HQ échoue avec "Connexion impossible"
- Vérifiez l'URL (HTTPS si TLS, HTTP sinon)
- Vérifiez que le serveur HQ tourne (
/v1/health) - Vérifiez le pare-feu du serveur HQ (port ouvert)
- Vérifiez que le jeton est bien celui généré pour cette pharmacy_id
Synchronisation lente
Réduisez l'intervalle automatique (5 → 10 ou 15 minutes) si le réseau est saturé. La taille de l'outbox n'est pas un problème — elle peut grossir et se rattraper plus tard.
L'interface arabe n'apparaît pas
- Paramètres → Langue de l'interface → العربية → Enregistrer
- Fermer et relancer l'application (les widgets Qt déjà construits ne se traduisent pas à chaud)
Crash au démarrage après mise à jour
Restaurez la dernière sauvegarde de data/pharma.db. Les migrations sont idempotentes mais une corruption disque peut empêcher leur application.
32. Annexes
Structure des dossiers
PharmaPro/
├── main.py # Point d'entrée
├── config.py # Constantes globales
├── core/
│ ├── auth.py # Authentification
│ ├── backup.py # Sauvegardes auto
│ ├── i18n.py # Traductions
│ ├── licensing.py # Licence HWID
│ ├── multipharmacy.py # API multi-pharmacie
│ └── settings.py # Gestion préférences
├── database/
│ └── connection.py # Schéma + migrations + triggers
├── services/
│ ├── caisse.py # Shifts X/Z
│ ├── chifa_export.py # Bordereaux CSV
│ ├── interactions.py # Détection interactions
│ ├── mobile_server.py # HTTP read-only
│ ├── ocr.py # OCR factures
│ ├── pdf_export.py # PDF
│ ├── printer.py # Imprimantes thermiques
│ ├── promotions.py # Calcul remises
│ ├── stock.py # FEFO lots
│ ├── sync_client.py # Push/pull HQ
│ └── sync_server.py # Serveur HQ
├── ui/
│ ├── main_window.py # Fenêtre principale + sync auto
│ ├── styles.py # CSS Qt
│ ├── widgets/
│ │ ├── charts.py # BarChart / Sparkline / Donut
│ │ └── common.py # Widgets réutilisables
│ └── pages/ # 18 pages métier
├── scripts/
│ ├── import_listing.py # Import en masse Excel
│ └── run_hq_server.py # CLI serveur HQ
├── data/
│ ├── pharma.db # Base SQLite locale
│ ├── license.key # Licence
│ ├── exports/ # CSV bordereaux
│ └── receipts/ # Tickets fallback
└── backups/ # Sauvegardes datées
Tables principales
| Table | Rôle |
|---|---|
pharmacies |
Master multi-pharmacie |
users |
Comptes utilisateurs |
medicaments |
Catalogue produits |
lots |
Suivi par lot (FEFO) |
clients |
Patients |
fournisseurs |
Fournisseurs |
factures_fournisseur + details_facture |
Factures d'achat |
ventes + details_vente |
Ventes (toutes catégories) |
caisse_shifts |
Shifts caisse |
ordonnances + ordonnance_lignes |
Prescriptions |
dettes + paiements_dette |
Crédits clients |
rejets_chifa |
Rejets CNAS |
promotions |
Remises auto |
interactions |
Couples médicamenteux à risque |
activity_log |
Journal d'audit |
sync_outbox + sync_state |
Synchronisation HQ |
app_settings |
Paramètres clés/valeurs |
Codes de sévérité interactions
| Code | Couleur POS | Conduite |
|---|---|---|
| Mineure | Vert / Bleu | Information |
| Modérée | Orange | Vigilance |
| Sévère | Rouge | Avis prescripteur |
| Contre-indiquée | Rouge foncé | Refuser la délivrance |
Statuts de vente
| Statut | Signification |
|---|---|
| Validée | Vente normale, encaissée |
| En instance | Stock dégagé, paiement Chifa différé |
| Annulée | Vente annulée (stock restitué) |
Types de vente
| Type | Tiers payant ? |
|---|---|
| Comptoir | Non (espèces) |
| Chiffa | Oui (CNAS) |
| CASNOS | Oui |
| Mutuelle | Oui |
| Militaire | Oui |
| Mixte | Oui (combiné cash + tiers) |
| Retour | Non (négatif) |
Fin du manuel — Version 1.0
Pour toute question : votre revendeur PharmaPro ou l'éditeur.