Toutes les formules de l'application

Ce chapitre existe pour une seule raison : aucun chiffre affiché par SuperPharm ne doit être une boîte noire. Chaque montant, chaque pourcentage, chaque quantité affichée à l'écran est calculé ici, avec la formule exacte du code, ses arrondis, ses cas particuliers et ses limites connues.

Il ne s'agit pas de procédures « comment faire » : rien à cliquer, rien à valider. C'est le dictionnaire de calcul de l'application — à lire quand un chiffre surprend, quand il faut le justifier à un comptable, ou avant de contester une différence avec un document du fournisseur ou de la CNAS.

Conventions valables partout

Convention Détail
Arrondi Les montants sont arrondis à 2 décimales. La ventilation CHIFA arrondit « au plus loin de zéro » (0,005 → 0,01) ; partout ailleurs c'est l'arrondi standard.
Taux Un taux est stocké en fraction (0,19 pour 19 %) et saisi et affiché en pour cent (19). La conversion se fait à l'entrée et à la sortie du champ, jamais dans les calculs.
Quantité La quantité est toujours canonique en boîtes, même pour une vente à l'unité (vrac) : c'est l'unité que le moteur de stock décrémente.
PPA Le PPA algérien est un prix toutes taxes comprises. Aucune formule ne lui rajoute de TVA.
Coût figé Le prix d'achat d'une ligne de vente est recopié depuis le lot au moment de la vente et ne bouge plus. Corriger un lot ne réécrit pas l'historique des ventes déjà faites.
Jour officine Les statistiques datent une vente au jour local de l'officine, pas au jour UTC de stockage. Une vente de 00h30 appartient au jour civil algérien.
Une seule source Quand deux écrans affichent la même grandeur, ils lisent la même formule. Les divergences documentées ci-dessous sont intentionnelles et signalées comme telles.

HT-FRM-001 — Prix d'achat, PPA et prix de vente d'un lot

Les quatre prix d'une ligne d'entrée, et comment ils se déduisent l'un de l'autre.

Prix d'achat TTC   = arrondi(Prix HT × (1 + TVA), 2)
TVA unitaire       = arrondi(Prix HT × TVA, 2)

Prix de vente      = arrondi(PPA + SHP, 2)
PPA                = arrondi(Prix de vente − SHP, 2)
  • Le PPA est déjà TTC : le prix au comptoir ne s'en déduit pas par la TVA. Seul le SHP (la marge de l'officine sur un médicament) s'y ajoute. Sur une parapharmacie sans SHP, prix de vente et PPA sont égaux.
  • La TVA ne touche que le versant achat (TVA déductible, prix d'achat TTC). Elle ne participe jamais au prix de vente.

Cette formule a porté un facteur (1 + TVA) par le passé : invisible sur le médicament (TVA nulle), il gonflait de 19 % le prix au comptoir de toute la parapharmacie.


HT-FRM-002 — Bonus fournisseur : UG et ristourne

Trois formes de bonus, trois unités, trois effets différents.

Type Unité stockée Ce qu'il veut dire
Ristourne taux (0,05) remise en argent : rien de gratuit
UG_Qte nombre de boîtes (3) 3 boîtes gratuites parmi celles reçues
UG_Pourcent taux (0,10) 10 % gratuit en plus des boîtes payées

Précision stockée — un taux de bonus est enregistré avec quatre décimales (numeric(18,4)), soit exactement les deux décimales de pour cent que le champ de saisie accepte : 9,09 % s'écrit 0,0909 en base et se relit 9,09 %.

La ligne d'entrée a longtemps porté ce champ en numeric(18,2) — la convention générale des montants, appliquée par erreur à un taux. Seuls les pourcentages entiers survivaient donc à un aller-retour en base : 0,0909 y était arrondi à 0,09, et le champ se rouvrait sur « 9,00 % ». La ligne de sortie et la ligne de bon de commande étaient en (18,4) depuis toujours ; l'entrée les a rejointes.

Ce que la correction ne rattrape pas : les bonus saisis auparavant restent arrondis — l'information perdue à l'écriture ne se reconstitue pas. Une ristourne de 9,09 % enregistrée avant cette correction vaut 9 % en base, et c'est ce taux-là qui a servi au prix de revient du lot (HT-FRM-003) puis au coût figé de chaque vente issue de ce lot. La ressaisir est le seul moyen de la corriger.

Deux quantités coexistent sur la même ligne — c'est la clé de tout le reste :

Qte           = quantité REÇUE     (payée + gratuites) → entre en stock, se vend, porte PPA et SHP
Qte facturée  = quantité PAYÉE     → ce que le fournisseur facture

Qte facturée = Qte − ValeurBonus            (UG en quantité)
             = Qte / (1 + ValeurBonus)      (UG en pourcentage)
             = Qte                          (ristourne, ou remise globale)

Bornes de saisie (refus explicite, ou neutralisation silencieuse à l'import IA) :

Type Refusé si Pourquoi
tous valeur < 0 —
Ristourne > 100 % le prix de revient deviendrait négatif
UG_Qte > quantité reçue on ne peut pas offrir plus de boîtes qu'il n'en arrive
UG_Pourcent > 1 000 % attrape-faute de frappe (10 boîtes offertes par boîte payée)

Une officine a saisi 2000 en pensant « 2 000 DA de remise » sur une ristourne — soit 200 000 %. Le prix de revient est tombé à −2 226 388 DA, et la vente d'une boîte à 20 DA a fait annoncer 2,2 millions de bénéfice. Le coût étant figé à la vente, l'absurdité survivait à toute correction du lot. D'où ces bornes, gardées sur les deux portes : la saisie manuelle et l'import de facture par IA.


HT-FRM-003 — Remise, prix de revient et marges d'un lot

Remise par boîte  = ValeurBonus × Prix d'achat TTC                  (ristourne)
                  = (ValeurBonus × Prix d'achat TTC) / Qte          (UG en quantité)
                  = (ValeurBonus × Prix d'achat TTC) / (1 + ValeurBonus)  (UG en pourcentage)
                  = 0                                               (sous remise globale)

Net (prix de revient réel par boîte) = arrondi(Prix d'achat TTC − Remise, 2)

Marge théorique     = arrondi(PPA − Prix HT, 2)
Marge théorique %   = arrondi((PPA − Prix HT) / Prix HT, 4)
Marge réelle        = arrondi(Prix de vente − Net, 2)
Marge réelle %      = Marge réelle / Net
  • Net est un prix PAR BOÎTE, pas un total. C'est lui, et lui seul, qui est recopié sur la ligne de vente comme coût d'achat.
  • Le taux de bonus qui alimente la remise est stocké à quatre décimales. Les lots saisis avant cette correction portent un taux arrondi au pour cent entier — voir la note de précision de HT-FRM-002.
  • La remise est calculée sur le TTC et non sur le HT : une ristourne fait aussi baisser la TVA (voir HT-FRM-004), donc l'amortir sur le HT sous-estimerait la marge de remise × taux de TVA par boîte.
  • La marge théorique compare le prix public au prix catalogue ; la marge réelle compare ce qu'on encaisse à ce qu'on a réellement payé, bonus compris. La seconde est la vraie.

Sous remise globale, la remise par boîte vaut zéro : la ligne est facturée à la quantité brute, donc la boîte est payée plein tarif et son prix de revient est le prix d'achat TTC. Conséquence assumée : la remise globale ne redescend pas jusqu'à la boîte, le coût du stock est surestimé de son montant, et la marge d'autant prudente.


HT-FRM-004 — Totaux d'une ligne et d'une facture d'achat

Sur la ligne — noter quelle quantité entre dans chaque total :

Total HT      = arrondi(Qte FACTURÉE × Prix HT, 2)
Total TVA     = arrondi( (arrondi(Qte facturée nette × Prix HT, 2) − Ristourne) × TVA , 2)
Total TTC     = arrondi(Total HT + Total TVA, 2)
Total remise  = Ristourne de la ligne  (0 si UG, 0 sous remise globale)
Total net     = arrondi(Total TTC − Total remise, 2)

Total PPA     = arrondi(Qte REÇUE × PPA, 2)
Total SHP     = arrondi(Qte REÇUE × SHP, 2)
Total vente   = arrondi(Qte REÇUE × Prix de vente, 2)
Total marge réelle     = arrondi(Qte REÇUE × Marge réelle, 2)
Total marge théorique  = arrondi(Qte REÇUE × Marge théorique, 2)

La TVA porte sur le HT APRÈS remise, comme au pied de la facture du grossiste : TOTAL HT − REMISE = NET HT, puis TVA, puis NET À PAYER = NET HT + TVA.

Constaté sur une facture réelle : même total HT au centime (79 457,81), mais TVA 467,02 côté application contre 291,89 sur le document — un écart de 175,13 DA qui valait exactement remise × taux.

Sur l'en-tête (somme des lignes, recalculée à chaque modification) :

Total HT / TTC / TVA / PPA / SHP / vente / marge réelle = Σ des lignes
Total remise = Σ des remises de ligne        (mode ligne par ligne)
             = Remise globale saisie          (mode remise globale)
Total net    = arrondi(Total TTC − Total remise, 2)

Le total TTC garde le HT brut parce que le net retranche la remise ensuite. La déduire des deux côtés la compterait deux fois.


HT-FRM-005 — Avoir fournisseur : report du bonus au prorata

Un avoir reprend les totaux d'une ligne d'entrée recalculés pour la quantité rendue. Le bonus en boîtes ne se transpose pas tel quel :

ValeurBonus de l'avoir = arrondi(ValeurBonus d'origine × Qte rendue / Qte d'origine, 2)

Sans ce prorata, Qte facturée = Qte − ValeurBonus deviendrait négative dès que la quantité rendue est inférieure aux unités gratuites, et tous les totaux de l'avoir passeraient en négatif. La ristourne et l'UG en pourcentage sont déjà proportionnels : ils sont reportés tels quels.

Un avoir se soustrait partout où il apparaît :

Achats nets     = Σ (Avoir ? −Total net : +Total net)
TVA déductible  = Σ (Avoir ? −Total TVA : +Total TVA)

HT-FRM-006 — Prix de vente suggéré et alerte de marge faible

Aide à la décision affichée uniquement sur une entrée fournisseur de parapharmacie — le seul contexte où l'on fixe librement un prix de vente à partir d'un coût d'achat.

Marge habituelle = MÉDIANE des marges des achats précédents du même produit
PPA suggéré      = Prix HT × (1 + Marge habituelle)
Prix suggéré     = arrondi(PPA suggéré + SHP, 2)

Marge faible ⇔ Marge théorique % < Marge habituelle × MargeFaibleRatio

La médiane plutôt que la moyenne : un seul achat aberrant ne doit pas déplacer la suggestion. MargeFaibleRatio est un paramètre d'officine (Paramètres, voir HT-PAR-005).

Le bouton « S'aligner sur le stock » reprend le prix de vente du lot en stock le plus récent — pour éviter deux prix différents pour le même produit en rayon.


HT-FRM-007 — Total et marge d'une ligne de vente

Total vente = Prix vrac × Qte unités      (ligne en vrac)
            = Prix de vente × Qte         (ligne à la boîte)

Qte (boîtes) = Qte unités / Nb d'unités par conditionnement   (vrac)

Marge de la ligne = Total vente − Prix d'achat × Qte

Le prix d'achat est le Net du lot (voir HT-FRM-003) figé au moment de la vente. La formule de marge vaut à la boîte comme en vrac, parce que la quantité est toujours canonique en boîtes et que le total sait déjà dans quel mode il est.

Vendre une unité d'une boîte de 30 retire 1/30 de boîte du stock et lui oppose 1/30 du coût d'une boîte. Si le conditionnement n'est pas renseigné, la ligne devient incohérente avec elle-même : recette à l'unité, coût d'une boîte entière. C'est cet état qui est empêché en amont, pas rattrapé par le calcul.


HT-FRM-008 — Facture de vente : exonéré, HT, TVA, TTC

Sur une facture de vente libre, chaque ligne est classée par le type du produit :

Pour chaque ligne :
  parapharmacie →  HT ligne = arrondi(Total TTC / (1 + taux TVA para), 2)
                   TVA      = arrondi(Total TTC − HT ligne, 2)
  autre         →  exonéré += Total TTC          (médicament, service, préparation)

Montant exonéré = Σ des lignes exonérées + services + préparations
Montant HT      = Σ des HT de ligne
Montant TVA     = Σ des TVA de ligne
Montant TTC     = Exonéré + HT + TVA
Total à payer   = Montant TTC + Timbre

La TVA est extraite du prix affiché, jamais ajoutée : le prix au comptoir est déjà TTC.


HT-FRM-009 — Droit de timbre

base = Montant exonéré + Montant HT

taux = TimbreTaux1  si base ≤ TimbreSeuil1
     = TimbreTaux2  si base ≤ TimbreSeuil2
     = TimbreTaux3  sinon

Timbre = plancher(base / 100) × taux
Timbre = min(Timbre, PlafondTimbre)      si un plafond est configuré
  • Le timbre se calcule par tranche de 100 DA entamée à l'inférieur : plancher(base / 100). Une base de 1 099 DA compte 10 tranches, pas 11.
  • Les seuils, les trois taux et le plafond sont des paramètres d'officine (HT-PAR-005), pas des constantes du logiciel : la loi de finances les change.
  • Un plafond à 0 signifie pas de plafond (la loi de finances 2025 l'a supprimé).
  • Le timbre ne concerne que les factures réglées en espèces — voir le registre (HT-FRM-028).

HT-FRM-010 — Remboursement CHIFA d'une ligne

Le cœur du calcul CHIFA : ce que la caisse paie, ce que l'assuré paie.

Total vente        = Prix de vente × Qte

Prix retenu = Tarif de référence   si applicable ET renseigné ET strictement < Prix de vente
            = Prix de vente         dans tous les autres cas

Base remboursement = Prix retenu × Qte remboursée

Part caisse (MontantPS) = arrondi(Base remboursement × Taux, 2)
Part assuré (MtAssure)  = Total vente − Part caisse

Le tarif de référence ne s'applique donc que s'il abaisse la base : un TR supérieur au prix de vente est ignoré, il ne fait gagner d'argent à personne.

Part non remboursée (produit hors CHIFA, ou quantité au-delà de celle remboursée) :

Qte non remboursée   = max(0, Qte − Qte remboursée)   si la ligne est remboursée
                     = Qte                             sinon
Total non remboursé  = Qte non remboursée × Prix de vente

Sur l'en-tête de l'ordonnance, la part caisse est regroupée par ligne d'ordonnance CHIFA — un couple (code CNAS, prix de vente) — et non lot par lot :

Part caisse de l'ordonnance = Σ sur chaque groupe (code CNAS, prix) de
                                arrondi(Σ des bases du groupe × taux, 2)

C'est la granularité de CHIFA elle-même. Sommer des parts caisse déjà arrondies lot par lot dérive d'un centime dès que le résultat tombe sur un demi-centime : 2 × 364,16 → 1 456,64 × 0,8 = 1 165,312 donne 1 165,31 chez CHIFA et 1 165,32 en sommant — d'où un « Montant assuré » à 416,00 au lieu de 416,01.


HT-FRM-011 — Majorations CHIFA d'une ligne

Trois incitations, calculées ligne par ligne :

Majoration produit local   = arrondi(Part caisse × TauxMajLocal, 2)   si produit local
Majoration substitution    = Qte remboursée × MajSubParBoite          si substitué
Majoration « inf. au TR »  = arrondi(Part caisse × TauxMajInfTr, 2)   si prix ≤ tarif de référence

Les taux ne sont pas de la politique d'officine : ce sont des valeurs nationales lues en direct dans la base CHIFA. Valeurs par défaut tant que la base n'est pas connectée :

Grandeur Défaut
FAE (forfait d'acte pharmaceutique) 5,00 DA
Majoration substitution, par boîte 15,00 DA
Taux « inférieur au tarif de référence » 10 %
Taux produit local 20 %

La table CHIFA stocke ces taux en pour cent entier (10, 20) alors que tout le code attend une fraction (0,10 / 0,20). La conversion est faite à la lecture : sans elle, chaque enveloppe calculée après connexion à CHIFA était multipliée par cent (150,40 DA devenaient 15 040 DA).


HT-FRM-012 — Majoration retenue d'une ordonnance : la règle du maximum

Une ordonnance ne cumule pas ses majorations : la meilleure des trois l'emporte.

Bonus « Type 2 » potentiel = arrondi(Part caisse des MÉDICAMENTS × 10 %, 2)   si éligible
                           = 0                                                sinon

Majoration retenue = MAX( Σ majorations substitution ,
                          Bonus Type 2 potentiel ,
                          Σ majorations produit local )

Total dû au pharmacien = Part caisse + FAE + Majoration retenue
Total à charge assuré  = Total vente − Part caisse
Total net              = Total à charge assuré − Remise accordée

Éligibilité au Type 2 : toutes les lignes remboursables de l'ordonnance doivent être inférieures ou égales au tarif de référence. Le filtre sur « remboursable » est essentiel — un produit hors CHIFA ajouté à la même vente n'a ni tarif de référence ni ligne sur la facture CNAS.

Sans ce filtre, ajouter un antalgique non remboursable au panier faisait tomber le Type 2 de toute l'ordonnance côté application (29,43 DA) alors que CHIFA, qui ne voit jamais ce produit, l'accordait (160,33 DA).

La base du Type 2 est la part caisse des médicaments remboursables seuls — convention CNAS : accessoires et bandelettes en sont exclus.


HT-FRM-013 — Rejets CHIFA

Quand la CNAS rejette des boîtes déjà délivrées :

Qte remboursée      = Qte remboursée d'origine − Qte rejetée
Montant rejeté      = arrondi(Qte rejetée × Prix de vente, 2)
Qte à payer         = max(0, Qte rejetée − Qte rendue)
Montant à encaisser = arrondi(Qte à payer × Prix de vente, 2)

La baisse de la quantité remboursée relance toute la chaîne de HT-FRM-010 : base de remboursement, part caisse, part assuré, majorations. Le client rend les boîtes ou les paie : Qte à payer est ce qui reste après ce qu'il a rendu.


HT-FRM-014 — Éligibilité d'une carte CHIFA

Calcul entièrement fait à partir de ce qui est écrit sur la carte — aucune lecture de la base de l'officine.

Carte « Tiers payant »  OU  assuré porteur d'un traitement chronique (ALD)
    → régime illimité pour TOUS les bénéficiaires de la carte

Sinon (carte « −5000 DA ») :
    → chaque bénéficiaire est limité à 2 ordonnances sur les 3 derniers mois
  • Le comptage se fait par bénéficiaire (rang sur la carte), pas par carte.
  • Une ordonnance = un numéro de facture distinct ; à défaut (cartes anciennes, sans numéro), une date distincte.
  • Des droits expirés (date de fin dépassée) bloquent la facturation quel que soit le régime.

HT-FRM-015 — Caisse : théorique, clôture, écart

Ce que le tiroir devrait contenir est un accumulateur tenu par la base de données, jamais recalculé par l'application. Chaque opération de caisse le déplace :

Opération « Entrée » : théorique  += Montant − Montant TPE
                       théorique TPE += Montant TPE
Opération « Sortie » : théorique  −= Montant

Le TPE est exclu du théorique espèces : le tiroir ne contient que des espèces.

À la clôture :

Montant clôture stocké = Montant compté − Fond de caisse
Écart = Montant clôture − Théorique
      = (Compté − Fond) − Encaissé net

Autrement dit, lu comme le pharmacien le lit :

Attendu dans le tiroir = Fond de caisse + Encaissé net espèces
Écart = Compté − Attendu          négatif = manquant, positif = excédent

Le théorique ne doit jamais être réécrit par l'application. Une sauvegarde ordinaire de la session le remplacerait par un instantané périmé — c'était la cause des écarts de caisse fantômes. Une garde en base neutralise toute écriture non annoncée.

Le rapprochement du TPE se fait à part, contre le ticket de télécollecte du terminal : il n'entre pas dans l'écart espèces. Voir HT-TRE-006 pour la démarche de recherche d'un écart.


HT-FRM-016 — Soldes d'un client

Solde = Solde initial + Σ des opérations de caisse du client
        avec  opération « Sortie » →  + Montant       (le client emporte, il doit)
              opération « Entrée » →  − Montant       (il verse, sa dette baisse)

Solde carte    = Σ des soldes de tous les clients partageant le même NSS
Solde famille  = Σ des soldes de la COMPOSANTE CONNEXE des relations familiales
  • Solde > 0 = le client doit de l'argent à l'officine.
  • Le solde carte regroupe les bénéficiaires d'une même carte CHIFA (même NSS).
  • Le solde famille suit les relations déclarées de proche en proche : si A est lié à B et B à C, les trois partagent le même solde famille, même sans lien direct A–C. Un client isolé (aucune relation) a un solde famille de 0, pas son propre solde — la case n'a de sens qu'à plusieurs.
  • Dépassement de plafond : Plafond > 0 ET Solde > Plafond. Un plafond à 0 vaut « pas de plafond ».

HT-FRM-017 — Soldes et échéances d'un fournisseur

Solde = Solde initial + Total achats − Total paiements

Une entrée fournisseur    →  Solde += Total net,  Total achats += Total net
Un avoir / remise finan.  →  Solde −= Total net,  Total achats −= Total net
Un paiement               →  Solde −= Montant,    Total paiements += Montant

Solde > 0 = l'officine doit de l'argent au fournisseur.

Échéance d'une facture — ce n'est pas « date de facture + N jours » :

Échéance = dernier jour du MOIS de la facture + délai convenu (en jours)

Toutes les factures d'un même mois tombent donc le même jour, ce qui permet de régler un fournisseur en une fois. Exemple, délai 30 jours : tous les achats de juillet → 31/07 + 30 j = 30/08. Un délai de 0 signifie « pas de délai convenu » : aucune échéance n'est calculée.

Échéancier : chaque fournisseur à qui l'on doit est daté de sa plus ancienne échéance dépassée s'il en a une, sinon de sa prochaine à venir.

Limite assumée : le solde est global, aucune facture ne se déclare « réglée ». Un fournisseur porteur d'une échéance dépassée est signalé pour la totalité de son solde, pas pour le seul montant échu.


HT-FRM-018 — Stock : quantité d'un lot, quantité d'un produit, inventaire

Tout mouvement de stock passe par une transaction de stock, et une seule formule les résume :

Qte du lot au dépôt   = Σ des transactions de ce lot sur ce dépôt
Qte en stock produit  = Σ des transactions de TOUS ses lots, TOUS dépôts confondus

Une ligne de stock tombée à zéro est supprimée, pas conservée à 0.

Inventaire — le comptage fait foi :

Écart = Quantité comptée − Quantité en stock RELUE en base

Le delta est calculé sur le stock relu au moment de la validation, sous le même verrou que le moteur de stock — pas sur ce qui était affiché à l'écran. Une vente passée entre l'affichage et la validation ne peut donc pas être écrasée. L'écart, s'il n'est pas nul, devient une transaction d'ajustement d'inventaire ; c'est le moteur de stock qui en tire tout le reste.


HT-FRM-019 — Réapprovisionnement : vélocité, point de commande, couverture

Les quatre formules qui alimentent la Centrale des commandes et les alertes de rupture.

Moyenne journalière(fenêtre) = Unités vendues sur la fenêtre / nombre de jours

Vélocité = MAX(moyenne 7 jours, moyenne 30 jours) × Facteur saisonnier

Point de réapprovisionnement = plafond(Vélocité × Couverture visée en jours)

Jours de couverture = arrondi(Qte en stock / Vélocité, 2)
                    = 9999            si la vélocité est nulle

Qte à commander = max(0, Point de réappro − Qte en stock − Qte déjà en commande)
  • Le maximum des deux fenêtres, et non la moyenne : une hausse récente est absorbée immédiatement, sans qu'une semaine creuse tire l'estimation vers zéro.
  • Le facteur saisonnier est un paramètre d'officine (défaut 1,0).
  • 9999 jours est une valeur sentinelle : un produit sans aucune demande doit se ranger en dernier quand on trie par couverture croissante, pas en premier comme le ferait un 0.
  • La quantité déjà commandée compte les commandes Brouillon et Envoyée : on ne recommande pas ce qui est déjà en route.
  • Rupture = stock ≤ 0 et au moins une vente sur 30 jours. Dormant = stock > 0 et aucune vente sur 90 jours.

HT-FRM-020 — Bonus accordé sur un échange envoyé

Le bonus consenti à un confrère suit les mêmes formes que le bonus fournisseur, mais appliqué au prix de vente :

Remise de la ligne = ValeurBonus × Total vente                          (ristourne)
                   = ValeurBonus × Total vente / (1 + ValeurBonus)      (UG en pourcentage)
                   = ValeurBonus × Prix de vente                        (UG en quantité)

Total net de l'échange = Total sortie − Total remise

C'est ce total net qui alimente le solde de la pharmacie partenaire — le net à payer, remise déduite ; le total sortie reste le brut.


HT-FRM-021 — Fiche de paie

Heures supplémentaires = arrondi( (Salaire de base / 173,33)
                                  × (1,5 × heures à 50 % + 1,75 × heures à 75 %), 2 )

Salaire brut = max(0, Salaire de base + Prime de risque + Prime de caisse
                      + Heures supplémentaires − Retenue d'absence)

Retenue sécurité sociale = arrondi(Salaire brut × 9 %, 2)

Salaire net = arrondi( (Brut − Sécurité sociale − IRG)
                       + Prime de panier + Prime de transport − Avance, 2 )
  • 173,33 est la base légale mensuelle (40 h × 52 / 12).
  • Les primes de panier et de transport ne sont pas cotisables : elles s'ajoutent après les retenues, et n'entrent pas dans le brut.
  • L'IRG n'est PAS calculé par l'application : c'est un montant saisi. Voir HT-FRM-030.

HT-FRM-022 — Ce que les statistiques enregistrent pour chaque ligne vendue

Toutes les statistiques de vente reposent sur une même table de faits — une ligne par ligne de vente — construite ainsi :

Quantité       = Qte (boîtes)
Unités         = Qte unités si vrac, sinon Qte
Montant net    = Total vente de la ligne
Coût d'achat   = Prix d'achat figé × Qte
Marge          = Montant net − Coût d'achat

Taux de TVA    = taux parapharmacie si le produit est une parapharmacie, sinon 0
Montant HT     = arrondi(Montant net / (1 + taux), 2)   si taux > 0, sinon Montant net
Montant TVA    = Montant net − Montant HT

Et les axes d'analyse, figés au moment de la vente :

Axe Valeurs D'où il vient
Canal Libre, Chifa, Preparation le type de la vente ; les mouvements de stock ne sont pas des ventes et sont ignorés
Catégorie Medicament, Parapharmacie, Ingredient, Inconnu le type du produit
Organisme CNAS, CASNOS, Inconnu, Aucun le premier chiffre du centre payeur du client (donnée CHIFA) : 1 ou 9 = CNAS, 2 ou 8 = CASNOS. Une vente CHIFA sans centre payeur exploitable vaut Inconnu ; Aucun est réservé aux ventes hors tiers payant
Origine du lot Facture, BL le type de pièce de l'entrée par laquelle la marchandise est entrée en stock (toute entrée en porte un)
Fournisseur le fournisseur du lot l'entrée d'origine ; un lot d'inventaire ou d'échange n'en a pas

Le jour est le jour local de l'officine, jamais le jour UTC.

Les libellés (nom du produit, nom du fournisseur) sont toujours les libellés actuels, même sur de l'historique : un produit renommé s'affiche partout sous son nouveau nom. Les axes, eux, sont figés à la vente. Conséquence : filtrer sur la DCI actuelle d'un produit et filtrer sur la DCI au moment de la vente ne donnent pas le même résultat dès qu'un produit a été reclassé.


HT-FRM-023 — Ventilation de la majoration et du FAE sur les lignes

La majoration retenue et le FAE sont calculés par ordonnance (HT-FRM-012), mais les statistiques croisent par ligne. Ils sont donc répartis :

part_i = arrondi(enveloppe × poids_i / Σ poids, 2)     pour i < dernière
part_dernière = enveloppe − Σ des parts précédentes    (jamais arrondie)

poids_i = part caisse de la ligne i
        = total vente de la ligne i     si toutes les parts caisse sont nulles
  • Invariant garanti : la somme des parts égale exactement l'enveloppe, au centime. L'écart d'arrondi est absorbé par la dernière part, jamais réparti — sinon un montant d'en-tête recomposé depuis les lignes ne retomberait pas sur ses pieds.
  • Le prorata retenu est la part caisse, parce que c'est d'elle que dérivent les majorations.
  • Somme des poids nulle (ordonnance intégralement rejetée) ⇒ répartition égale : le montant n'est pas perdu, et le résultat reste reproductible.

HT-FRM-024 — Les mesures des écrans de statistiques

Toutes les mesures affichées, avec leur définition exacte.

Chiffre d'affaires   = Σ Montant net
Coût d'achat         = Σ Coût d'achat
Bénéfice / Marge     = Σ Marge          = CA − Coût d'achat
CA encaissé          = CA + Majoration + FAE
Bénéfice total       = Marge + Majoration + FAE
Unités vendues       = Σ Unités
Lignes de vente      = nombre de lignes

Taux de marge        = Marge / CA × 100          (écrans d'analyse)
Pourcentage bénéfice = Bénéfice / Coût d'achat × 100     (écran Bénéfice)

Ticket moyen         = arrondi(CA / Nombre de ventes, 2)
Panier moyen         = idem
Lignes par vente     = arrondi(Nb lignes / Nb ventes, 1)
CA par jour          = arrondi(CA / Nombre de jours actifs, 2)
Part CHIFA           = arrondi(CA CHIFA / CA × 100, 1)
Position nette       = Total créances clients − Total dettes fournisseurs
Flux net de caisse   = Encaissements − Décaissements
Écart moyen / session= arrondi(Écart total / Nombre de sessions, 2)

Deux taux de marge coexistent, et c'est voulu. L'écran Analyse croisée et les tableaux de bord rapportent la marge au chiffre d'affaires ; l'écran Bénéfice la rapporte au coût d'achat. Les deux pourcentages sont normaux et différents : sur un article acheté 100 et vendu 125, le premier affiche 20 %, le second 25 %.

« Nombre de ventes » = tickets distincts. Le tableau de bord, la fiche employé et le classement comptent les ventes distinctes de la période (une ordonnance mêlant médicament et parapharmacie compte une fois), et le ticket moyen s'en déduit. Par canal, les comptes s'additionnent jusqu'au total ; par catégorie, ils se lisent « ventes contenant la catégorie » et peuvent donc dépasser le total. Seules les séries temporelles de cette mesure (courbe « nombre de ventes ») restent comptées par seau canal × catégorie, et l'écran Analyse croisée n'expose pas la mesure.


HT-FRM-025 — Valeur du stock et péremption

Valeur au prix de revient  = Σ (Qte du lot × Net du lot)
Valeur au prix de vente    = Σ (Qte du lot × Prix de vente du lot)
Valeur au prix d'achat HT  = Σ (Qte du lot × Prix HT du lot)
Valeur au prix d'achat TTC = Σ (Qte du lot × Prix d'achat TTC du lot)
Valeur au prix de vente HT = Σ ( (Qte du lot × Prix de vente) / (1 + TVA du lot) )

Marge potentielle = Valeur au prix de vente − Valeur au prix de revient

Seuls les lots à quantité strictement positive sont valorisés, tous dépôts confondus.

Péremption :

Jours restants = Date d'expiration − aujourd'hui
Périmé            ⇔ expiration < aujourd'hui
Proche péremption ⇔ expiration < aujourd'hui + Seuil proche péremption (défaut 90 jours)

Valeur du lot = Qte × Net

Le seuil est un paramètre d'officine (HT-PAR-005). Voir HT-STA-006.

Stock non payé par fournisseur :

Dette          = max(Solde du fournisseur, 0)
Valeur stock   = Σ (Qte × Net) des lots venant de ce fournisseur
Stock non payé = MIN(Dette, Valeur stock)
Stock payé     = Valeur stock − Stock non payé
Dette hors stock = Dette − Stock non payé

Le minimum des deux, parce qu'aucune facture n'est pointée individuellement : on ne peut pas devoir plus que ce qu'on détient encore en rayon, ni avoir en rayon plus de non-payé que ce qu'on doit. Voir HT-STA-008.


HT-FRM-026 — Analyse ABC et matrice rotation × marge

ABC (Pareto) — les produits sont triés par CA décroissant, puis :

Cumul % = (Σ des CA jusqu'à ce produit) / CA total × 100

Classe A ⇔ cumul % ≤ 80
Classe B ⇔ cumul % ≤ 95
Classe C ⇔ au-delà

Un produit tombe dans la classe où le franchissement le place : c'est le cumul qui classe, pas le CA du produit pris isolément.

Matrice rotation × marge — les deux seuils sont des médianes de l'officine, pas des valeurs absolues :

rotation du produit = unités vendues sur la période
marge du produit    = Marge / CA

seuil rotation = MÉDIANE des rotations      seuil marge = MÉDIANE des marges

Étoile        : rotation ≥ médiane  ET  marge ≥ médiane
Vache à lait  : rotation ≥ médiane  ET  marge <  médiane
Dilemme       : rotation <  médiane ET  marge ≥ médiane
Poids mort    : rotation <  médiane ET  marge <  médiane

Conséquence à connaître : les quadrants sont relatifs. Il y aura toujours des « poids morts », même dans un assortiment sain — la médiane coupe la population en deux par construction.


HT-FRM-027 — Comparaison de périodes

Delta      = Valeur période − Valeur référence
Évolution %= Delta / Référence × 100          (0 si la référence est nulle)

Base 100   = Valeur du point / Valeur du premier point non nul × 100
Cumulé     = Σ des points depuis le début de la série
Part %     = Valeur du point / Total de la série × 100

Une référence à zéro rend une évolution de 0 %, pas l'infini : passer de 0 à 100 ne se mesure pas en pourcentage.


HT-FRM-028 — Comptabilité : G50, balance SCF, registre du timbre

Bloc TVA de la G50 — une bande par couple (catégorie de produit, taux) :

Base HT par bande  = Σ des montants HT des ventes
TVA par bande      = Σ des montants de TVA des ventes
TVA collectée      = Σ des TVA de toutes les bandes
TVA déductible     = Σ (Avoir ? −TVA d'achat : +TVA d'achat)
TVA nette à payer  = Collectée − Déductible

Balance de gestion alignée sur le plan SCF :

Compte Libellé Contenu
700 Ventes de marchandises Σ HT des ventes de la période (crédit)
44571 TVA collectée Σ TVA des ventes (crédit)
600 Achats de marchandises Σ HT des achats, net d'avoirs (débit)
44566 TVA déductible Σ TVA des achats, net d'avoirs (débit)
53 Caisse encaissements (débit) / décaissements (crédit) de la période
411 Clients Σ des soldes clients débiteurs à date
401 Fournisseurs Σ des soldes fournisseurs créditeurs à date

Les comptes 70/60/445/53 sont des comptes de mouvement sur la période choisie ; 411 et 401 sont des soldes à date, indépendants de la période. Le total débit et le total crédit n'ont donc aucune raison de s'équilibrer : ce n'est pas une balance comptable au sens légal, mais une balance de gestion, à rapprocher de la comptabilité générale.

Registre du droit de timbre — uniquement les factures réglées en espèces :

Nombre de factures    = compte des factures espèces de la période
Montant TTC espèces   = Σ de leurs montants TTC
Montant des timbres   = Σ de leurs timbres

HT-FRM-029 — Seuils des contrôles de fiabilité

L'écran Contrôles & alertes (HT-STA-017) applique ces règles, et rien d'autre :

Anomalie Règle exacte
Lignes à marge négative Marge < 0 sur une ligne de vente
Produits non classés catégorie Inconnu — TVA et analyses faussées
Écarts de caisse importants |Écart| > tolérance d'officine, ou > 1 000 DA si aucune tolérance n'est réglée
Lots périmés encore en stock expiration < aujourd'hui et quantité > 0 ; valeur = Qte × Net
Jours à CA aberrant CA du jour > 5 × la médiane des CA journaliers (à partir de 5 jours de données)
Ventes sans employé ligne de vente sans employé rattaché
Sessions non clôturées session sans date de clôture

Le facteur 5 × la médiane (et non la moyenne) : une seule journée exceptionnelle ne doit pas relever le seuil qui sert à la détecter.


HT-FRM-030 — Ce que l'application ne calcule PAS

Par souci de transparence, les grandeurs qui ressemblent à des calculs mais sont en réalité des valeurs saisies ou lues ailleurs — l'application les affiche telles quelles :

Grandeur Origine réelle
IRG (fiche de paie) saisi par l'utilisateur. Aucun barème n'est appliqué.
Prix vrac d'un lot saisi sur le lot. Ce n'est pas Prix de vente / conditionnement.
Tarif de référence, taux de remboursement lus dans le catalogue CNAS, jamais calculés.
Majoration CNAS de l'écran Bénéfice lue dans la base CHIFA (Σ des montants de majoration des factures). Si la base est indisponible, la colonne affiche 0 et le reste du rapport reste juste.
Taux CHIFA (FAE, substitution, local, inf. TR) lus dans la base CHIFA. Les valeurs de HT-FRM-011 ne sont que des défauts.
Taux de TVA, seuils et taux du timbre, plafond paramètres d'officine (HT-PAR-005), pas des constantes du logiciel.
Solde initial d'un client ou d'un fournisseur saisi à la création ; le solde courant en découle.
Quantité en stock jamais saisie directement : c'est toujours une somme de transactions (HT-FRM-018).

Une valeur saisie qui semble fausse se corrige à la source, pas en cherchant l'erreur de calcul : il n'y en a pas.