Développement Solution
Projets Parcours Contact Mon CV
Marchés en Vue

Fiche projet

Marchés en Vue

Marchés en Vue aide les petites entreprises (artisans, PME du bâtiment, des services, du conseil…) à repérer les marchés publics de leur métier avant leurs concurrents.

Chaque matin, le site lit les nouveaux appels d'offres publiés au BOAMP, ne garde que ceux qui correspondent au métier et à la zone de l'entreprise, et les note sur 100 en expliquant la note. Il repère aussi les marchés qui arrivent à échéance, avec le titulaire actuel et le montant, pour se présenter à l'acheteur avant la nouvelle consultation.

41 métiers sont couverts, sur toute la France. Le site est en ligne en bêta gratuite.

Détails techniques

Objectif

Faire gagner du temps aux petites entreprises qui veulent travailler avec les acheteurs publics. Le BOAMP publie environ 125 000 avis par an : impossible pour un artisan de tout lire. Les PME remportent 60 % des marchés publics en nombre, mais seulement 25 % du montant, souvent parce qu'elles découvrent les annonces trop tard.

Le site répond à deux besoins : recevoir chaque matin seulement les appels d'offres utiles, et anticiper les renouvellements de marchés pour se présenter avant la publication.

À terme, c'est un service par abonnement (39 € par mois, essai de 14 jours sans carte bancaire). Il est pour l'instant en bêta gratuite.

Interface

- Thème sombre « radar », couleur d'accent turquoise, polices hébergées sur le site (aucun appel à Google, plus simple pour le RGPD).
- Animations sobres : graphique qui se dessine, cartes et boutons qui réagissent au survol. Tout s'arrête si l'appareil demande moins d'animations.
- Pensé d'abord pour le téléphone : menu qui glisse, grandes zones à toucher, bandeau d'inscription fixé en bas de l'écran.
- Le site s'installe comme une application (PWA), avec notifications push et une page hors connexion.
- Chaque marché affiche sa note sur 100 et la raison de la note (catégorie, mots-clés, zone, délai), pour que l'utilisateur fasse confiance au tri.
- Sélecteur de départements par région, avec des tuiles à cocher et des compteurs.
- Assistant IA dans une bulle, qui répond aux questions sur le site et sur les marchés publics.

Contenu

Pages publiques : accueil, page « Pourquoi les marchés publics » (chiffres officiels sourcés, atouts pour une PME, FAQ), mentions légales, CGV, confidentialité.

Espace client, après inscription :
- Appels d'offres ouverts, triés par note, avec suivi (« je réponds », « pas pour moi »).
- Renouvellements : marchés qui se terminent dans 3 à 9 mois, avec titulaire et montant.
- Attributions : qui a gagné quoi dans la zone, et à quel prix.
- Profil : métier parmi 41, départements, mots-clés à ajouter ou exclure, seuil d'alerte, e-mail du matin et notifications.
- Abonnement : paiement Stripe et portail client (factures, carte, résiliation).

Comptes : inscription, connexion protégée contre les essais répétés, mot de passe oublié par lien à usage unique, suppression complète du compte.

Chaque nuit, des tâches planifiées importent les nouveaux avis, recalculent les notes et envoient l'alerte de 7 h.

Maintenance

Base technique :
- Symfony 7.4 (version maintenue à long terme), PHP 8.3, PostgreSQL.
- Données ouvertes et gratuites de l'État : API BOAMP, et fichier des marchés attribués (2,6 Go) lu en flux, sans le charger en mémoire.
- Symfony Messenger et Scheduler : un seul service en tâche de fond pour les imports de la nuit et les e-mails.
- Stripe (webhooks signés), Brevo pour les e-mails (SPF, DKIM, DMARC), Web Push, OVHcloud AI Endpoints (modèle Mistral) pour l'assistant.
- Hébergé sur un VPS : Nginx, HTTPS Let's Encrypt, service systemd, sauvegarde quotidienne vérifiée de la base, journaux d'erreurs par jour.
- 74 tests automatisés, dont des tests sur de vraies réponses du BOAMP. Mise à jour en une commande depuis GitHub.

Évolutions prévues :
- Ouverture des abonnements payants, avec tarif fondateur pour les inscrits de la bêta.
- Nouvelles sources d'appels d'offres (profils d'acheteurs, petits marchés qui ne passent pas par le BOAMP).
- Aide à la rédaction des réponses avec l'IA, à partir du dossier de consultation.

Un extrait du code

public function calculer(AvisBoamp $avis, EntrepriseCliente $entreprise, \DateTimeImmutable $maintenant = new \DateTimeImmutable()): ResultatScore
{
    $niche = $entreprise->getNiche();
    $poids = $niche->getPoids();
    $texte = self::normaliser($avis->getObjet());

    // Un mot exclu (ex. « maîtrise d'œuvre » pour un électricien) : le marché ne le concerne pas.
    foreach ($niche->getMotsExclus() as $exclu) {
        if (self::contientMot($texte, $exclu)) {
            return new ResultatScore(0, [sprintf('exclu : contient « %s »', $exclu)]);
        }
    }

    $points = 0;
    $raisons = [];

    // Catégories BOAMP du métier
    if (array_intersect($avis->getDescripteurs(), $niche->getDescripteursBoamp())) {
        $points += $poids['descripteurs'];
        $raisons[] = sprintf('catégorie du métier (+%d)', $poids['descripteurs']);
    }

    // Zone : hors des départements de l'entreprise, la note est plafonnée et n'alerte jamais
    $dansZone = array_intersect($avis->getDepartements(), $entreprise->getZone());
    if ($dansZone) {
        $points += $poids['distance'];
        $raisons[] = sprintf('dans votre zone (%s) (+%d)', implode(', ', $dansZone), $poids['distance']);
    }
    // … mots-clés, délai de réponse, taille du marché, puis plafond hors zone

    return new ResultatScore($points, $raisons);
}