# Passe Marché

[![Ruby](https://img.shields.io/badge/Ruby-3.4.5-red.svg)](https://www.ruby-lang.org/) [![Rails](https://img.shields.io/badge/Rails-8.0.2-red.svg)](https://rubyonrails.org/) [![DSFR](https://img.shields.io/badge/DSFR-1.13.0-blue.svg)](https://www.systeme-de-design.gouv.fr/)

**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

```bash
git clone [URL_DU_PROJET]
cd voie_rapide
```

### 3. Installer/configurer

```bash
./bin/install
```

## 🔧 Commandes de développement

### Serveur de développement

```bash
# Démarrer le serveur de développement
bin/dev

# Ou directement Rails
bin/rails server
```

### Application de démonstration (Fake Editor App)

```bash
# 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
```

### Base de données

```bash
# Migrations
bin/rails db:migrate

# Reset complet
bin/rails db:reset

# Préparation (setup + migrations)
bin/rails db:prepare
```

### Tests

```bash
# Tous les tests RSpec
bundle exec rspec

# Tests Cucumber
bundle exec cucumber

# Tests avec base de données fraîche
bin/rails test:db
```

### Qualité du code

```bash
# Vérification RuboCop
bin/rubocop

# Correction automatique
bin/rubocop -a

# Suite de qualité complète
bin/rubocop && bundle exec rspec && bundle exec cucumber
```

### Administration des plateformes de marchés publics et webhooks

```bash
# Interface d'administration (après avoir créé un admin)
# URL: http://localhost:3000/admin

# Gestion des plateformes de marchés publics
# - Créer/modifier des plateformes de marchés publics
# - Configurer les URLs de webhook et redirection
# - Générer les secrets webhook
# - Activer/désactiver les plateformes de marchés publics

# Surveillance des webhooks
# - Consulter les événements webhook
# - Réessayer les webhooks échoués
# - Statistiques de succès/échec
```

### Assets

```bash
# Précompilation des assets
bin/rails assets:precompile

# Nettoyage des assets
bin/rails assets:clobber
```

### Configuration des champs et traductions

```bash
# 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]

```

#### 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

```
app/
├── controllers/     # Gestion des requêtes HTTP
│   ├── admin/       # Interface d'administration (plateformes de marchés publics, webhooks)
│   ├── api/v1/      # API RESTful pour les plateformes de marchés publics
│   └── 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
```

### 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

```yaml
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 étapes
```

## 🎭 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

```bash
# 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
```

### 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](/passe-marche/fake_editor_app.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

```bash
# 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
```

### Couverture de code (SimpleCov)

Le projet utilise SimpleCov pour mesurer la couverture de code.

```bash
# Générer un rapport (après exécution des tests)
bundle exec rspec && bundle exec cucumber

# Consulter le rapport HTML
xdg-open coverage/index.html  # Linux
open coverage/index.html       # macOS
```

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.md`](https://github.com/datagouv/passemarche/blob/develop/SUMMARY.md) pour y apparaître.

### 🚀 Pour les Équipes Techniques

* [**📖 Guide de Démarrage**](/passe-marche/docs/00_guide_de_demarrage.md) - Navigation et glossaire de toute la documentation
* [**🏃‍♂️ Démarrage Rapide**](/passe-marche/docs/01_demarrage_rapide.md) - Intégration complète en 30 minutes

### 📋 Documentation Technique Détaillée

#### Authentification et Sécurité

* [**🔐 Authentification OAuth2**](/passe-marche/docs/02_authentification_oauth.md) - Flux Client Credentials, gestion tokens, sécurité
* [**🔔 Webhooks**](/passe-marche/docs/07_webhooks.md) - Notifications temps réel, signatures HMAC, retry intelligent

#### Flux Métier

* [**🏢 Flux Acheteur**](/passe-marche/docs/03_flux_acheteur.md) - Création et configuration des marchés publics
* [**👥 Flux Candidat**](/passe-marche/docs/04_flux_candidat.md) - Soumission et finalisation des candidatures

#### Références Techniques

* [**⚙️ Référence API**](/passe-marche/docs/05_reference_api.md) - Spécifications complètes des endpoints
* [**🏗️ Schémas d'Intégration**](/passe-marche/docs/06_schemas_integration.md) - Architecture et diagrammes techniques

### 💡 Application de Démonstration

* [**🎭 Fake Editor App**](/passe-marche/fake_editor_app.md) - Exemple d'implémentation OAuth2

### Ressources utiles

* [Rails 8.0 Guide](https://guides.rubyonrails.org/)
* [DSFR - Système de Design de l'État](https://www.systeme-de-design.gouv.fr/)
* [RSpec Documentation](https://rspec.info/)
* [Cucumber Guides](https://cucumber.io/docs)

### 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 🚀


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://guides.data.gouv.fr/passe-marche/readme.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
