PP
PharmaPro
Documentation
Télécharger
RÉFÉRENCE

Manuel utilisateur

⏱ Lecture ≈ 25 min · Mise à jour 2026-05-05 · v1.1.0

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

  1. Présentation générale
  2. Pré-requis techniques et installation
  3. Activation de la licence
  4. Premier démarrage
  5. Tour de l'interface
  6. Tableau de bord
  7. Module Médicaments
  8. Suivi par lots — FEFO
  9. Point de Vente (POS)
  10. Module Caisse — Shifts X / Z
  11. Ordonnances médicales
  12. Ventes en Instance (Chifa différée)
  13. Retours et remboursements
  14. Rejets CHIFA
  15. Crédits / Dettes
  16. Clients / Patients
  17. Programme de fidélité
  18. Fournisseurs
  19. Factures fournisseur et OCR
  20. Statistiques et rapports
  21. Bordereau CHIFA
  22. Promotions / Remises
  23. Interactions médicamenteuses
  24. Journal d'activité
  25. Utilisateurs et rôles
  26. Paramètres
  27. Synchronisation multi-pharmacie
  28. Accès mobile (lecture seule)
  29. Sauvegarde et restauration
  30. Raccourcis clavier
  31. Dépannage
  32. 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

  1. Au premier lancement, la fenêtre Activation de Licence apparaît.
  2. Le HWID de la machine s'affiche au format XXXX-XXXX-XXXX-XXXX.
  3. Communiquez ce HWID au revendeur ou à l'éditeur.
  4. Vous recevez en retour une chaîne de caractères chiffrée (la clé).
  5. 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

  1. Le pharmacien tape ou scanne le nom / code-barres du produit (F2 met le focus sur la recherche)
  2. Il appuie sur Entrée pour ajouter au panier (ou double-clic)
  3. Il choisit le type de vente (combo box) :
  4. Espèces (Comptoir)
  5. Carte Chifa (CNAS)
  6. CASNOS
  7. Mutuelle complémentaire
  8. Caisse militaire
  9. Mixte (cash + tiers)
  10. Si le type implique un tiers payant, un champ "Montant pris en charge" apparaît
  11. Il valide avec F12 ou clique sur Encaisser
  12. 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émenter
  • Suppr : 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

  1. ➕ Nouvelle Ordonnance
  2. Sélectionner le patient (créé au préalable depuis Clients)
  3. Saisir le médecin prescripteur (optionnel)
  4. Date de prescription (par défaut aujourd'hui)
  5. Statut initial (généralement En attente)
  6. 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 attentePartielleDé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

  1. Préparer le panier comme pour une vente normale
  2. Le client doit être préalablement sélectionné (la vente en instance exige un patient)
  3. Cliquer sur ⏳ Vente en Instance (Ctrl+I)
  4. 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

  1. Sélectionner la vente
  2. ↩ Rembourser cette vente
  3. Le dialogue affiche toutes les lignes avec leur quantité vendue et la quantité déjà remboursée
  4. Saisir, ligne par ligne, la quantité à rembourser (limitée à vendu - déjà remboursé)
  5. Indiquer un motif (produit défectueux, erreur de saisie, etc.)
  6. 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

  1. ➕ Saisir un Rejet
  2. Rechercher la vente Chifa concernée
  3. Indiquer le motif (8 motifs prédéfinis ou texte libre)
  4. Saisir le montant rejeté
  5. 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

  1. ➕ Nouvelle Facture
  2. Sélectionner le fournisseur, le numéro de facture (auto-incrémenté), la date, le statut, les remarques
  3. Pour chaque ligne : médicament, quantité, prix unitaire, date de péremption
  4. 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

  1. ➕ Nouvelle Promo
  2. Choisir le médicament cible
  3. Type : % (pourcentage) ou DA (montant fixe)
  4. Valeur (par exemple 20 pour -20%)
  5. Optionnellement : date de début et / ou date de fin
  6. 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

  1. ➕ Nouvelle Interaction
  2. Sélectionner le Médicament A dans la liste
  3. Sélectionner le Médicament B
  4. Choisir la Sévérité : Mineure / Modérée / Sévère / Contre-indiquée
  5. 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

  1. Fermer PharmaPro
  2. Remplacer data/pharma.db par la sauvegarde
  3. 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

  1. Paramètres → Langue de l'interface → العربية → Enregistrer
  2. 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.

Toutes les ressources