Passe Marché est une application Rails 8 qui simplifie les candidatures aux marchés publics pour les petites et moyennes entreprises (PME). Le projet vise à transformer les procédures d'appel d'offres complexes en un processus rationalisé et convivial, intégré aux plateformes d'achat existantes.
Faciliter l'accès des PME aux marchés publics français en :
- Réduisant les formalités administratives
- Automatisant l'identification des entreprises (SIRET)
- Simplifiant la gestion documentaire
- Fournissant des attestations officielles
- Intégration avec les plateformes d'éditeurs
- Flux d'autorisation sécurisé
- Gestion des tokens et des scopes
- Notifications en temps réel vers les éditeurs
- Signatures HMAC pour la sécurité
- Système de retry intelligent avec circuit breaker
- Gestion centralisée des événements webhook
- Documents requis par type de marché
- Validation PDF uniquement (version MVP)
- Génération automatique d'attestations
- Téléchargement sécurisé
- Validation automatique des numéros SIRET
- Récupération des informations d'entreprise
- Vérification de l'éligibilité
- Système de Design de l'État (DSFR)
- Interface accessible et responsive
- Thèmes clair/sombre/système
- Conformité aux standards gouvernementaux
- Support multilingue (français/anglais)
- Configuration i18n complète
- Contenu externalisé dans des fichiers YAML
- ruby 3.4.5
- postrgresql >= 15
- Rails 8.0.2 - Framework web
- Solid Cable/Cache/Queue - Infrastructure Rails database-backed
- DSFR (Système de Design de l'État) v1.13.0 - Framework CSS gouvernemental
- Turbo & Stimulus (Hotwire) - Interactivité frontend
- Importmap - Gestion des modules JavaScript
- Propshaft - Pipeline d'assets moderne
- RSpec - Tests unitaires et d'intégration
- Cucumber - Tests comportementaux (BDD)
- FactoryBot - Génération de données de test
- Shoulda Matchers - Matchers de test avancés
- RuboCop - Analyse statique du code
- Capybara + Selenium - Tests système
- Ruby 3.4.5
- PostgreSQL 12+
- Git
- Passe Marché : https://sandbox.voie-rapide.services.api.gouv.fr/
- Éditeur de démonstration (Fake Editor) : https://sandbox.voie-rapide-edition.services.api.gouv.fr/
Ces environnements permettent de tester l'intégration complète sans affecter les données de production.
git clone [URL_DU_PROJET]
cd voie_rapide./bin/install# Démarrer le serveur de développement
bin/dev
# Ou directement Rails
bin/rails server# Démarrer l'application de démonstration OAuth2
cd fake_editor_app
bundle install
bundle exec rackup -p 4567
# Accéder au dashboard : http://localhost:4567# Migrations
bin/rails db:migrate
# Reset complet
bin/rails db:reset
# Préparation (setup + migrations)
bin/rails db:prepare# Tous les tests RSpec
bundle exec rspec
# Tests Cucumber
bundle exec cucumber
# Tests avec base de données fraîche
bin/rails test:db# Vérification RuboCop
bin/rubocop
# Correction automatique
bin/rubocop -a
# Suite de qualité complète
bin/rubocop && bundle exec rspec && bundle exec cucumber# Interface d'administration (après avoir créé un admin)
# URL: http://localhost:3000/admin
# Gestion des éditeurs
# - Créer/modifier des éditeurs
# - Configurer les URLs de webhook et redirection
# - Générer les secrets webhook
# - Activer/désactiver les éditeurs
# Surveillance des webhooks
# - Consulter les événements webhook
# - Réessayer les webhooks échoués
# - Statistiques de succès/échec# Précompilation des assets
bin/rails assets:precompile
# Nettoyage des assets
bin/rails assets:clobber# Import de la configuration des champs depuis CSV
bin/rails field_configuration:import
# Import depuis un fichier CSV personnalisé
bin/rails field_configuration:import_from_file[/chemin/vers/fichier.csv]
# Validation de la structure CSV sans import
bin/rails field_configuration:validate[/chemin/vers/fichier.csv]
# Import des traductions des champs depuis CSV
bin/rails field_translations:import
# Import des traductions depuis un fichier CSV personnalisé
bin/rails field_translations:import_from_file[/chemin/vers/fichier.csv]Ces tâches permettent de configurer les champs de formulaire à partir d'un fichier CSV :
-
field_configuration:import: Importe la configuration des champs depuis le fichier CSV par défaut (config/form_fields/fields.csv)- Crée les
MarketAttributeet associations avec lesMarketType - Supprime en mode soft-delete les champs non présents dans le CSV
- Affiche des statistiques détaillées de l'import
- Crée les
-
field_configuration:import_from_file: Même fonctionnalité mais avec un fichier CSV personnalisé -
field_configuration:validate: Valide la structure et le contenu du fichier CSV sans effectuer d'import
Ces tâches permettent d'extraire et de mettre à jour les traductions françaises depuis le même fichier CSV :
-
field_translations:import: Extrait les traductions des colonnes CSV et met à jourconfig/locales/form_fields.fr.yml- Extrait les titres et descriptions côté acheteur (
category_acheteur,titre_acheteur, etc.) - Met à jour les sections
categories,subcategoriesetfieldsdu fichier de traduction - Compatible avec les vues existantes sans modification de code
- Extrait les titres et descriptions côté acheteur (
-
field_translations:import_from_file: Même fonctionnalité mais avec un fichier CSV personnalisé
Le fichier CSV doit contenir les colonnes suivantes (ligne 4 = en-têtes) :
category_key,subcategory_key,key: Clés techniquescategory_acheteur,subcategory_acheteur: Traductions des catégories/sous-catégoriestitre_acheteur,description_acheteur: Traductions des champs côté acheteurimport:ouipour les lignes à traiter- Colonnes de types de marchés :
services,fournitures,travaux,défense
app/
├── controllers/ # Gestion des requêtes HTTP
│ ├── admin/ # Interface d'administration (éditeurs, webhooks)
│ ├── api/v1/ # API RESTful pour les éditeurs
│ └── buyer/ # Interface candidat
├── models/ # Logique métier et données
│ ├── editor.rb # Modèle éditeur avec config webhook
│ ├── webhook_event.rb # Événements webhook
│ └── public_market.rb # Marchés publics
├── services/ # Services métier
│ ├── webhook_delivery_service.rb # Livraison webhook
│ ├── webhook_circuit_breaker.rb # Circuit breaker
│ └── editor_sync_service.rb # Sync OAuth
├── jobs/ # Tâches en arrière-plan
│ ├── webhook_retry_job.rb # Retry webhooks échoués
│ └── webhook_sync_job.rb # Sync données via webhooks
└── views/ # Templates et présentation
└── admin/ # Interface admin pour webhooks
config/ # Configuration de l'application
├── locales/ # Fichiers de traduction i18n
└── routes.rb # Routes de l'application
db/ # Schéma et migrations
spec/ # Tests RSpec
features/ # Tests Cucumber
- Module:
VoieRapide- Module principal de l'application - Locales: Français (défaut), Anglais
- Base de données: PostgreSQL avec schémas multiples
- Protection CSRF intégrée
- Paramètres forts (Strong Parameters)
- Validation côté serveur
- Sanitisation des entrées utilisateur
- Authentification OAuth2 sécurisée
- Respect du RGPD
- Standards d'accessibilité gouvernementaux
- Sécurité des données sensibles
- Audit et logs de sécurité
L'application supporte plusieurs langues via Rails i18n :
- Français (défaut) -
fr - Anglais -
en
fr:
application: # Métadonnées de l'app
header: # Navigation et branding
footer: # Liens légaux
home: # Page d'accueil
features: # Fonctionnalités
workflow: # Processus en 3 étapesUne application Sinatra complète qui démontre l'intégration OAuth2 avec Passe Marché.
- Authentification OAuth2 : Client Credentials flow
- Dashboard visuel : Statut et détails des tokens en temps réel
- Gestion des tokens : Authentification, rafraîchissement, nettoyage
- Base SQLite : Stockage local des tokens
- Interface utilisateur : Design inspiré du DSFR
# 1. Démarrer Passe Marché
bin/dev
# 2. Dans un autre terminal, démarrer l'app de démo
cd fake_editor_app
bundle install
bundle exec rackup -p 4567
# 3. Accéder au dashboard
# http://localhost:4567- Cliquer sur "S'authentifier" pour obtenir un token OAuth2
- Visualiser les détails du token (expiration, scope, etc.)
- Utiliser "Rafraîchir le Token" pour renouveler
- Tester l'intégration complète avec l'API
Voir fake_editor_app/README.md pour plus de détails.
- Tests unitaires (RSpec) - Modèles, contrôleurs, services
- Tests d'intégration (RSpec) - Flux complets
- Tests comportementaux (Cucumber) - Scénarios utilisateur
- Tests système (Capybara) - Interface utilisateur
- ✅ Page d'accueil avec DSFR
- ✅ Intégration i18n
- ✅ Configuration de base
- ✅ Authentification OAuth2
- ✅ Qualité de code (RuboCop)
# Tests RSpec uniquement
bundle exec rspec
# Tests Cucumber uniquement
CUCUMBER_PUBLISH_QUIET=true bundle exec cucumber
# Suite complète
bin/rubocop && bundle exec rspec && bundle exec cucumber- Variables d'environnement pour les secrets
- Configuration SSL/TLS
- Optimisation des assets
- Configuration de la base de données
- Logs et monitoring
- Kamal - Déploiement Docker
- Thruster - Mise en cache et accélération
- Support des conteneurs Docker
- Recherche → Planification → Implémentation
- Tests obligatoires (RSpec + Cucumber)
- Qualité code (RuboCop sans violation)
- Convention Rails respectée
- Documentation i18n en français
- Créer une branche feature
- Développer avec tests
- Vérifier la qualité (
bin/rubocop) - Exécuter tous les tests
- Créer une pull request
- 📖 Guide de Démarrage - Navigation et glossaire de toute la documentation
- 🏃♂️ Démarrage Rapide - Intégration complète en 30 minutes
- 🔐 Authentification OAuth2 - Flux Client Credentials, gestion tokens, sécurité
- 🔔 Webhooks - Notifications temps réel, signatures HMAC, retry intelligent
- 🏢 Flux Acheteur - Création et configuration des marchés publics
- 👥 Flux Candidat - Soumission et finalisation des candidatures
- ⚙️ Référence API - Spécifications complètes des endpoints
- 🏗️ Schémas d'Intégration - Architecture et diagrammes techniques
- 🎭 Fake Editor App - Exemple d'implémentation OAuth2
- Code en anglais, interface en français
- Messages de commit en français
- Documentation technique en français
- Tests comportementaux en français
Ce projet est développé pour l'administration française dans le cadre de l'amélioration de l'accès aux marchés publics.
Pour toute question ou problème :
- Consulter la documentation
- Vérifier les issues existantes
- Créer une nouvelle issue avec les détails
Passe Marché - Simplifiez vos candidatures aux marchés publics 🚀