githubModifier

Passe Marché

Rubyarrow-up-right Railsarrow-up-right DSFRarrow-up-right

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.

🎯 Objectif

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

✨ Fonctionnalités principales

🔐 Authentification OAuth

  • Intégration avec les plateformes de marchés publics

  • Flux d'autorisation sécurisé

  • Gestion des tokens et des scopes

🔗 Système de Webhooks

  • Notifications en temps réel vers les plateformes de marchés publics

  • Signatures HMAC pour la sécurité

  • Système de retry intelligent avec circuit breaker

  • Gestion centralisée des événements webhook

📋 Gestion documentaire

  • Documents requis par type de marché

  • Validation PDF uniquement (version MVP)

  • Génération automatique d'attestations

  • Téléchargement sécurisé

🏢 Identification SIRET

  • Validation automatique des numéros SIRET

  • Récupération des informations d'entreprise

  • Vérification de l'éligibilité

🎨 Interface gouvernementale

  • Système de Design de l'État (DSFR)

  • Interface accessible et responsive

  • Thèmes clair/sombre/système

  • Conformité aux standards gouvernementaux

🌍 Internationalisation

  • Support multilingue (français/anglais)

  • Configuration i18n complète

  • Contenu externalisé dans des fichiers YAML

🛠 Technologies utilisées

Requirements

  • ruby 3.4.5

  • postrgresql >= 15

Backend

  • Rails 8.0.2 - Framework web

  • Solid Cable/Cache/Queue - Infrastructure Rails database-backed

Frontend

  • 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

Tests et Qualité

  • 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

📋 Prérequis

  • Ruby 3.4.5

  • PostgreSQL 12+

  • Git

🌐 Environnements

🧪 Sandbox (environnement de test)

  • 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.

🚀 Installation et configuration

1. Cloner le projet

3. Installer/configurer

🔧 Commandes de développement

Serveur de développement

Application de démonstration (Fake Editor App)

Base de données

Tests

Qualité du code

Administration des plateformes de marchés publics et webhooks

Assets

Configuration des champs et traductions

Configuration des champs (field_configuration)

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 MarketAttribute et associations avec les MarketType

    • Supprime en mode soft-delete les champs non présents dans le CSV

    • Affiche des statistiques détaillées de l'import

  • 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

Structure du fichier CSV attendu

Le fichier CSV doit contenir les colonnes suivantes (ligne 4 = en-têtes) :

  • category_key, subcategory_key, key : Clés techniques

  • category_acheteur, subcategory_acheteur : Traductions des catégories/sous-catégories

  • titre_acheteur, description_acheteur : Traductions des champs côté acheteur

  • import : oui pour les lignes à traiter

  • Colonnes de types de marchés : services, fournitures, travaux, défense

🏗 Architecture

Structure Rails

Modules principaux

  • Module: VoieRapide - Module principal de l'application

  • Locales: Français (défaut), Anglais

  • Base de données: PostgreSQL avec schémas multiples

🔐 Sécurité

Standards appliqués

  • Protection CSRF intégrée

  • Paramètres forts (Strong Parameters)

  • Validation côté serveur

  • Sanitisation des entrées utilisateur

  • Authentification OAuth2 sécurisée

Conformité

  • Respect du RGPD

  • Standards d'accessibilité gouvernementaux

  • Sécurité des données sensibles

  • Audit et logs de sécurité

🌐 Internationalisation

L'application supporte plusieurs langues via Rails i18n :

Langues disponibles

  • Français (défaut) - fr

  • Anglais - en

Structure des traductions

🎭 Application de Démonstration (Fake Editor App)

Une application Sinatra complète qui démontre l'intégration OAuth2 avec Passe Marché.

Fonctionnalités

  • 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

Démarrage rapide

Utilisation

  1. Cliquer sur "S'authentifier" pour obtenir un token OAuth2

  2. Visualiser les détails du token (expiration, scope, etc.)

  3. Utiliser "Rafraîchir le Token" pour renouveler

  4. Tester l'intégration complète avec l'API

Voir fake_editor_app/README.md pour plus de détails.

🧪 Tests

Types de tests

  • 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

Couverture actuelle

  • ✅ Page d'accueil avec DSFR

  • ✅ Intégration i18n

  • ✅ Configuration de base

  • ✅ Authentification OAuth2

  • ✅ Qualité de code (RuboCop)

Exécution des tests

Couverture de code (SimpleCov)

Le projet utilise SimpleCov pour mesurer la couverture de code.

Le rapport est généré dans le dossier coverage/ à la racine du projet. Il combine automatiquement la couverture de RSpec et Cucumber.

🚢 Déploiement

Configuration de production

  • Variables d'environnement pour les secrets

  • Configuration SSL/TLS

  • Optimisation des assets

  • Configuration de la base de données

  • Logs et monitoring

Outils de déploiement

  • Kamal - Déploiement Docker

  • Thruster - Mise en cache et accélération

  • Support des conteneurs Docker

🤝 Contribution

Standards de développement

  1. Recherche → Planification → Implémentation

  2. Tests obligatoires (RSpec + Cucumber)

  3. Qualité code (RuboCop sans violation)

  4. Convention Rails respectée

  5. Documentation i18n en français

Workflow de contribution

  1. Créer une branche feature

  2. Développer avec tests

  3. Vérifier la qualité (bin/rubocop)

  4. Exécuter tous les tests

  5. Créer une pull request

📚 Documentation

La documentation technique est publiée sur GitBook. Tout nouveau fichier doit être référencé dans SUMMARY.mdarrow-up-right pour y apparaître.

🚀 Pour les Équipes Techniques

📋 Documentation Technique Détaillée

Authentification et Sécurité

Flux Métier

Références Techniques

💡 Application de Démonstration

Ressources utiles

Conventions du projet

  • Code en anglais, interface en français

  • Messages de commit en français

  • Documentation technique en français

  • Tests comportementaux en français

📄 Licence

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.

🙋‍♂️ Support

Pour toute question ou problème :

  1. Consulter la documentation

  2. Vérifier les issues existantes

  3. Créer une nouvelle issue avec les détails


Passe Marché - Simplifiez vos candidatures aux marchés publics 🚀

Mis à jour

Ce contenu vous a-t-il été utile ?