ERP Souverain — Garage Automobile

GMK.
Mode d'emploi

Documentation complète du système de gestion intégré pour garage automobile. Facturation, devis, catalogue, clients et parc automobile — sans base de données, sans dépendance externe.

V4.6 Stable Sans BDD Portable PHP + JSON
01 — Introduction

Aperçu du système

GMK est un ERP souverain conçu pour les garages automobiles. Il fonctionne sans base de données — toutes les données sont stockées dans des fichiers JSON sur le serveur. Il se déploie en uploadant un dossier, sans installation, sans configuration complexe.

◎
4 types de documents
Facture, Avoir, Proforma et Devis — chacun avec sa propre numérotation séquentielle légale.
🚗
Gestion du parc
Véhicules liés aux clients, historique des interventions par véhicule, sélecteur intelligent.
◈
Catalogue intégré
Services & main d'œuvre, pièces détachées avec stock et alertes de seuil bas.
⇄
Import / Export
ODS (LibreOffice), JSON backup, CSV comptabilité. Flux bidirectionnel avec la matrice.
✉
Envoi mail automatique
Facture envoyée au client par email à la validation, avec copie au garage. Template HTML premium.
⚙
Mode Démo
Panneau architecte accessible par sentinelle — invisible de l'opérateur en production.

02 — Structure

Architecture fichiers

tmpl_gmk/
├── data/ ← protégé .htaccess — inaccessible depuis le web
│ ├── gmk_clients.json ← clients + véhicules
│ ├── gmk_catalogue.json ← services + pièces
│ ├── gmk_params.json ← numérotation + config garage
│ └── .gmk_smtp ← credentials SMTP (optionnel)
├── factures_gmk/ ← un dossier par facture F- / FA- / FP-
│ └── F-2026-0315-001/
│ ├── facture.json
│ └── .conf ← statut, index rapide
├── devis_gmk/ ← un dossier par devis D-
├── logs/ ← access.log + factures.log
├── gmk_config.php ← configuration centrale — tous les chemins
├── portail_gmk.html ← portail de connexion
├── espace_admin.html ← interface principale
└── operateurs.json ← comptes opérateurs hashés
Principe clé Toutes les données sensibles sont dans data/, protégé par .htaccess. Les dossiers factures_gmk/ et devis_gmk/ sont également protégés — aucun fichier JSON n'est accessible directement depuis un navigateur.

03 — Installation

Déploiement d'une instance

1

Uploader l'archive

Uploader le dossier tmpl_gmk/ complet sur l'hébergeur via FTP ou gestionnaire de fichiers. Placer dans public_html/ ou un sous-répertoire.

2

Appliquer les droits

Depuis le terminal SSH, dans le répertoire tmpl_gmk/ :

find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \;
3

Configurer le SMTP (optionnel)

Pour l'envoi d'emails, créer data/.gmk_smtp avec le contenu :

{"host":"smtp.domaine.com","port":587,"username":"email@domaine.com","password":"..."}
4

Importer les données

Se connecter en tant qu'architecte → activer le Mode Démo → bouton "Importer données" → charger le fichier ODS ou JSON de la matrice. Clients, catalogue et paramètres sont immédiatement disponibles.

✓

Le système est opérationnel

Aucune configuration supplémentaire. Les répertoires data/, factures_gmk/, devis_gmk/ et logs/ sont créés automatiquement au premier accès.


04 — Accès

Portail opérateur

L'accès se fait via portail_gmk.html — ou directement via l'URL racine du répertoire. Le portail vérifie la session et redirige automatiquement si déjà connecté.

1

Saisir les identifiants

Identifiant opérateur + code d'accès. La barre de progression indique la force du mot de passe saisi.

2

Choisir un espace

Après connexion, le hub affiche les modules disponibles selon le rôle. Clic sur "Administration" pour accéder au centre de gestion.

3

Session active — 60 minutes

Le timer en haut à droite décompte le temps restant. La session se renouvelle automatiquement à chaque action. À expiration, redirection vers le portail.


05 — Permissions

Rôles & accès

RôleCapacités
Opérateur Émettre des factures et devis, gérer les clients, consulter l'historique, utiliser le catalogue.
Architecte Tout ce que l'opérateur peut faire, plus : Mode Démo, import/export, reset, modification catalogue complète, gestion des paramètres.
Identifiant architecte Le rôle architecte est défini dans operateurs.json. Le mot de passe est hashé en bcrypt. Ne jamais partager l'accès architecte avec un opérateur du quotidien.

06 — Module

Tableau de bord

Vue d'ensemble en temps réel calculée depuis les données serveur à chaque ouverture de session.

Factures ce mois
Nombre de factures émises sur le mois en cours. Ne compte pas les avoirs.
CA HT ce mois
Chiffre d'affaires hors taxe du mois courant, toutes prestations confondues.
Devis en attente
Devis à l'état EN_ATTENTE — à convertir en facture.
Clients actifs
Nombre de clients enregistrés dans la base.
Alertes stock
Pièces dont le stock est inférieur au seuil d'alerte défini (par défaut : 5 unités).
Bonus 200€
Dossiers pare-brise avec bonus assureur non encore encaissé.

Le tableau de bord affiche également les 5 dernières factures avec accès direct à l'historique complet via "Voir tout →".


07 — Module

Facturation — 4 types

L'onglet Facturation gère trois types de documents. Chaque type possède sa propre numérotation séquentielle indépendante et ses propres règles.

F- Facture Standard

Facture commerciale définitive. S'affiche par défaut à l'ouverture du formulaire. À la validation en mode PROD, le numéro est incrémenté, le document est verrouillé, et un email est envoyé au client si son adresse est renseignée.

FA- Facture d'Avoir

Annule totalement ou partiellement une facture existante. Accès : triple clic sur le bouton "FACTURE STANDARD" révèle le bouton "FACTURE D'AVOIR". Un champ de référence apparaît — saisir le numéro de la facture à annuler. À la validation, la facture d'origine est automatiquement marquée AVOIR_ÉMIS. Affiché en rouge dans l'historique.

Accès rapide Dans l'historique, cocher une seule facture F- fait apparaître le bouton "↺ Émettre un avoir" qui pré-remplit automatiquement le formulaire.
FP- Facture Proforma

Facture estimative avant accord client. Accessible depuis l'onglet Devis — triple clic sur "DEVIS" révèle le bouton "PROFORMA". N'a pas de valeur comptable. Affiché en bleu. Le compteur FP- est indépendant.

Créer une facture — étapes

1

Sélectionner le type

Par défaut : Facture Standard. Triple clic pour révéler Avoir ou Proforma si nécessaire.

2

Renseigner le client

Taper les premières lettres du nom dans "Rechercher client". L'autocomplete affiche les résultats depuis la base. Clic sur un résultat remplit tous les champs client et le véhicule par défaut.

3

Choisir le véhicule

Si le client a plusieurs véhicules, un sélecteur apparaît automatiquement — le dernier véhicule réparé est pré-sélectionné. Changer de véhicule via la liste déroulante met à jour tous les champs.

4

Ajouter les prestations

Chaque ligne : saisir le code ou la désignation dans le champ autocomplete → le système propose les services et pièces du catalogue avec les prix. Modifier la quantité et le prix unitaire au besoin. Bouton "+" pour ajouter une ligne.

5

Valider

Bouton "▶ Générer & Envoyer". En mode PROD : le document est verrouillé, le compteur s'incrémente, l'email part au client. L'historique se met à jour immédiatement.

Historique des factures

Accessible via le bouton "HISTORIQUE" dans l'onglet Facturation.

FonctionnalitéDescription
Recherche full-textCherche dans tous les champs : numéro, client, véhicule, immat, prestation, sinistre, assureur.
FiltresPar statut (EN_ATTENTE, PAYÉE, SINISTRE_DÉCLARÉ, AVOIR_ÉMIS, ANNULÉE) et par type de document.
Changement de statutBouton ✎ → modal avec les 4 statuts, date et mode de paiement pour PAYÉE.
Export ZIPCocher plusieurs factures → "⬇ Export sélection" télécharge un ZIP des PDFs.
Émettre un avoirCocher exactement une facture F- → bouton "↺ Émettre un avoir" apparaît.

08 — Module

Devis & Proforma

D-
Devis
Document de proposition commerciale. Modifiable après émission. Convertible en facture d'un clic. Validité configurable (30, 60, 90 jours).
FP-
Proforma
Facture estimative sans valeur comptable. Accessible par triple clic sur "DEVIS". Numérotation FP- indépendante.

Le formulaire devis est identique au formulaire facture — même autocomplete client, même sélecteur véhicule, même catalogue. Le bouton "⇄ Convertir en Facture" transfère les données dans l'onglet Facturation.


09 — Module

Gestion clients

La base clients est stockée dans data/gmk_clients.json. Chaque client porte ses véhicules avec lui — pas de table séparée.

ChampDescription
IDIdentifiant unique — format C001, C002... Attribué automatiquement.
Nom / PrénomAffiché en majuscules dans les documents.
TéléphoneApparaît dans l'autocomplete de recherche.
EmailUtilisé pour l'envoi automatique des factures.
AdressePré-remplie dans le formulaire facture.
VéhiculesTableau de véhicules liés au client. Voir module Véhicules.
Autocomplete universel Dans les formulaires facture et devis, la recherche client fonctionne par nom, prénom, téléphone, email et ville. La sélection d'un client pré-remplit immédiatement tous les champs.

10 — Module

Parc automobile

L'onglet Véhicules centralise tout le parc automobile. Source de vérité unique : data/gmk_clients.json. Un véhicule est toujours lié à un client.

◈

Vue liste du parc

Tous les véhicules de tous les clients, filtrables par immatriculation, modèle ou client. La colonne "Dernière intervention" affiche la date de la dernière facture pour ce véhicule.

◈

Fiche véhicule

Clic sur une ligne → fiche complète : immat, modèle, année, km, couleur, VIN, client propriétaire. Bouton "✎ Modifier" pour corriger les données. Historique complet des interventions en bas de fiche.

◈

Actions rapides depuis la fiche

"+ Nouvelle facture" et "+ Nouveau devis" pré-remplissent directement les formulaires avec ce véhicule et son client. Aucune saisie manuelle nécessaire.

◈

Ajouter un véhicule

Bouton "+ Nouveau véhicule" → modal avec autocomplete client. Saisir modèle, immatriculation et données complémentaires. Sauvegarde directe dans le profil client.

Sélecteur intelligent Dans les formulaires, quand un client ayant plusieurs véhicules est sélectionné, le système affiche automatiquement une liste déroulante. Le véhicule pré-sélectionné est celui de la dernière facture émise pour ce client.
Véhicule inconnu Si une immatriculation saisie manuellement ne correspond à aucun véhicule enregistré pour le client, une alerte orange apparaît avec un bouton "Enregistrer" — un clic ajoute le véhicule dans le profil client.

11 — Module

Catalogue services & pièces

Deux sous-onglets : Services & Main d'œuvre (codes SRV-) et Pièces détachées (codes REF-). Chaque entrée dispose d'un prix HT, TVA, prix TTC, et pour les pièces : stock et seuil d'alerte.

Champ pièceDescription
RéférenceCode unique — format REF001, REF002...
DésignationLibellé affiché dans les documents.
PA HTPrix d'achat hors taxe (interne — n'apparaît pas sur les documents).
PV HTPrix de vente hors taxe — affiché sur les factures.
StockQuantité en stock. Décrémenté manuellement ou via import.
Seuil alerteDéclenche une alerte dans le tableau de bord si stock ≤ seuil.
FournisseurNom du fournisseur — information interne.
Autocomplete catalogue Dans les formulaires facture et devis, taper le code ou la désignation dans une ligne de prestation affiche les suggestions du catalogue. La sélection pré-remplit code, désignation et prix unitaire.

12 — Architecte

Mode Démo

Aquarium fermé, totalement séparé de la fiscalité réelle — aucun code secret, activable depuis l'onglet Paramètres (rôle architecte).

AspectFonctionnement réel
ActivationBascule dans Paramètres → "Mode démonstration". État persistant côté serveur (gmk_params.json['systeme']['mode']), jamais un flag envoyé par le navigateur — même principe que system.json/est_demo() dans REST-OS.
NumérotationSéquence DEMO-00001 indépendante, propre compteur — ne touche jamais les 4 séquences fiscales ni gmk_num.php.
StockageDossier demo_gmk/ séparé de factures_gmk/, jamais de contact avec le moteur NF525 (aucune signature, aucun verrouillage).
PurgeLibre à tout moment (bouton dans Paramètres) — aucun impact fiscal possible puisque ces documents n'en ont aucun.
BandeauBandeau permanent affiché en haut de l'écran tant que le mode est actif.
Historique — 2026-09-06 Ce mécanisme remplace un ancien panneau "Sentinelle" (appui long + code secret) qui permettait, entre autres, de recharger une facture déjà verrouillée pour la réécrire. Ce panneau et toutes ses fonctions ont été entièrement retirés du code — la seule correction possible sur une facture F-/FA- déjà émise est désormais un avoir séparé référençant l'original, sans exception. Les outils légitimes que ce panneau contenait par ailleurs (réinitialiser la numérotation, cloner le système, import/export) vivent maintenant dans l'onglet Paramètres, carte "Outils système".

13 — Données

Import & Export

Accessible depuis l'onglet Paramètres, carte "Outils système" (rôle architecte). Le système utilise le format ODS (LibreOffice) et JSON comme formats d'échange. Flux bidirectionnel.

Exports disponibles

FormatContenuUsage
ODS Complet4 feuilles : Factures, Clients, Services, PiècesRapport comptable, archivage, modification en masse
JSON BackupSnapshot complet : clients, catalogue, params, facturesSauvegarde machine, migration d'instance, clone
CSV FacturesFactures du mois ou toutesImport comptabilité externe
ZIP PDFsPDFs des factures sélectionnéesArchivage, envoi groupé

Import

Le bouton "⬆ Importer données" accepte un fichier .ods ou .json. Deux modes :

Fusion (merge)
Les données existantes sont conservées. Les entrées identifiées par ID sont mises à jour. Nouvelles entrées ajoutées. Mode recommandé.
Remplacement complet
Les données existantes sont entièrement remplacées par celles du fichier importé. Irréversible — utiliser après une sauvegarde.
Important Le fichier importé n'est jamais conservé sur le serveur — il est lu, transformé, puis les données écrasent ou fusionnent avec les fichiers JSON. La source de vérité reste toujours le JSON côté serveur.

14 — Référence

Numérotation légale

Quatre séquences indépendantes, chacune commence à 1 et ne souffre aucun manque — conformément aux obligations comptables françaises.

PréfixeTypeFormatExemple
F- Facture standard F-AAAA-MMJJ-NNN F-2026-0315-001
FA- Facture d'avoir FA-AAAA-MMJJ-NNN FA-2026-0315-001
FP- Proforma FP-AAAA-MMJJ-NNN FP-2026-0315-001
D- Devis D-AAAA-MMJJ-NNN D-2026-0315-001
Règle légale Chaque séquence est strictement croissante, sans saut, sans doublon. Le numéro est généré côté serveur (gmk_num.php) avec verrouillage de fichier (flock) pour garantir l'atomicité même en accès concurrent. La remise à zéro de ces compteurs (`gmk_data.php`/`gmk_reset.php`) est bloquée dès qu'une facture réelle a été signée dans la chaîne NF525 — voir ci-dessous.

Signature et verrouillage NF525 (ajouté 2026-09-06)

Toute facture (F-) ou avoir (FA-) est, dès son émission, signé cryptographiquement (Ed25519, moteur mutualisé OS KAYA kaya-os/_moteurs/nf525/) puis verrouillé physiquement sur le disque (chattr +i, résiste même à une écriture en root). Toute tentative de réémission sous le même numéro est refusée par le serveur — la seule correction légale possible est un avoir séparé référençant l'original. Devis (D-) et proforma (FP-) n'ont aucune valeur fiscale et restent librement modifiables.

Critère NF525Vérifié comment
InaltérabilitéExistence de la paire de clés Ed25519 de l'instance
SécurisationSauvegarde horodatée + checksum SHA-256 indépendant, à jour
ConservationDurée de rétention minimale définie (6 ans)
ArchivageChaque facture verrouillée réellement immuable (lsattr), aucun fichier corrompu

Rapport en direct consultable depuis l'onglet Paramètres (gmk_conformite.php).


15 — Référence

Fichiers & données

FichierRôle
gmk_config.phpConfiguration centrale. Tous les chemins calculés via __DIR__. Zéro hardcode. À inclure dans tous les PHP.
gmk_init.phpPoint d'entrée unique. Retourne en une requête : session, clients, catalogue, numéros, stats.
gmk_num.phpIncrémentation atomique des 4 compteurs avec verrouillage fichier.
gmk_data.phpCRUD clients, catalogue, params. Les 4 clés de numérotation ne sont jamais écrasées.
gmk_reset.phpOpérations de reset — accessible architecte uniquement, bloqué dès qu'une facture réelle est signée.
gmk_reset_usine.phpRemise à zéro fiscale pré-production (nouveau 2026-09-06) — purge factures/clés NF525 uniquement, préserve clients/catalogue. Confirmation par mot de passe + texte exact.
gmk_conformite.phpRapport de conformité NF525 en direct (nouveau 2026-09-06) — jamais des indicateurs statiques.
gmk_brouillon.phpEspace brouillon (nouveau 2026-09-06) — hors séquence fiscale, aucun numéro réel consommé.
save_facture_portail.phpSauvegarde F, FA, FP, D. Signe et verrouille physiquement les documents fiscaux (F-/FA-) via le moteur NF525. Refuse toute réécriture d'un document déjà émis. Calcule la TVA réelle côté serveur (jamais depuis une valeur envoyée par le client).
scan_factures_portail.phpListe et détail des factures depuis factures_gmk/.
gmk_export.phpExport CSV, ODS complet multi-feuilles, JSON backup, ZIP PDFs, recherche full-text. Statut/paiement lus depuis .conf (jamais facture.json une fois verrouillé).
gmk_import.phpImport ODS ou JSON — merge ou replace — architecte uniquement.
auth.phpAuthentification bcrypt. Logs locaux. Sans télémétrie externe. Session partagée (SSO) entre les sous-domaines admin./stock./avis.garagegmk.com.

gmk_proxy_receiver.php et portail_factures.html ont été désactivés le 2026-09-06 (vestiges non sécurisés, jamais utilisés en pratique) — originaux conservés dans _ARCHIVES/.


16 — Référence

Sécurité & protection

Sessions PHP
Session avec timeout glissant de 60 minutes. Chaque requête PHP vérifie $_SESSION['gmk_auth']. Expiration → redirection portail.
Mots de passe bcrypt
Stockés hashés dans operateurs.json. Jamais en clair. Changeable via l'interface.
.htaccess data/
Require all denied sur le dossier data/ — aucun fichier JSON accessible directement depuis le web.
.htaccess factures/
Même protection sur factures_gmk/ et devis_gmk/ — les données clients ne sont accessibles qu'aux PHP authentifiés.
CORS dynamique
Les origines autorisées sont lues depuis gmk_params.json. Zéro hardcode de domaine dans les PHP.
Logs d'accès
Chaque connexion, chaque facture émise, chaque import est tracé dans logs/ avec IP et horodatage.
GMK.
ERP SOUVERAIN · V4.6 · GARAGE AUTOMOBILE