Compare commits
2 Commits
feat/outil
...
a073b14a81
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a073b14a81 | ||
|
|
a05db54d7a |
56
pages/trouver-du-taf.vue
Normal file
56
pages/trouver-du-taf.vue
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<template>
|
||||||
|
<div class="trouver-du-taf-page">
|
||||||
|
<!-- Squelette V1 - sera étoffé par T4 (front Nuxt cascade TAFF) -->
|
||||||
|
<section class="intro">
|
||||||
|
<h1>Trouver du taf en archi</h1>
|
||||||
|
<p class="intro-text">
|
||||||
|
Annuaire critique des plateformes de mise en relation archi - particulier.
|
||||||
|
Évaluations sur 5 axes : rémunération, transparence, pratiques pro, écologie, qualité du matching.
|
||||||
|
</p>
|
||||||
|
<p class="intro-disclaimer">
|
||||||
|
Page en construction. Données à venir : T2 scoring 5 axes en cours après livraison T1.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Filtres : à brancher par T4 (FiltreSecteur, FiltreTag) -->
|
||||||
|
<!-- Liste plateformes : à brancher par T4 (FichePlateforme) -->
|
||||||
|
<!-- Chatbot d'aiguillage : à brancher par T6 (ChatbotTaff réutilise ChatbotSheet.vue) -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
// Types disponibles : import type { PlateformeTaff, ScoringTaff, TagGlobal } from '~/types/plateforme-taff'
|
||||||
|
// Data attendue : public/data/plateformes-taff.json (livrée par T2 + T3 après T1)
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
title: 'Trouver du taf en archi - AEP',
|
||||||
|
meta: [
|
||||||
|
{ name: 'description', content: "Annuaire critique des plateformes B2C archi - particulier. Évaluations éthiques sur 5 axes." }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.trouver-du-taf-page {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem 1rem;
|
||||||
|
}
|
||||||
|
.intro h1 {
|
||||||
|
font-size: 2rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--nav-text);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.intro-text {
|
||||||
|
font-size: 1rem;
|
||||||
|
color: var(--nav-text);
|
||||||
|
line-height: 1.6;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.intro-disclaimer {
|
||||||
|
font-size: 0.875rem;
|
||||||
|
color: var(--nav-text-muted);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
106
types/plateforme-taff.ts
Normal file
106
types/plateforme-taff.ts
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* Types V1 — Carte 3 AEP "Trouver du taf en archi"
|
||||||
|
* Source : public/data/plateformes-taff.json
|
||||||
|
* Spec figée : 0 INBOX/PROMPTS/cascade-megaboum/MP-TAFF-app-trouver-du-taf.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type AxeScore = "✅" | "⚠️" | "❌";
|
||||||
|
|
||||||
|
export type TagGlobal = "recommande" | "sous-reserve" | "a-eviter";
|
||||||
|
|
||||||
|
export type Secteur =
|
||||||
|
| "renovation"
|
||||||
|
| "construction-neuve"
|
||||||
|
| "urbanisme"
|
||||||
|
| "architecture-interieure"
|
||||||
|
| "paysage"
|
||||||
|
| "mar-conseil"
|
||||||
|
| "transversal";
|
||||||
|
|
||||||
|
export type TypePlateforme =
|
||||||
|
| "b2c-mise-en-relation" // V1 cible (Travaux.com, Habitatpresto, etc.)
|
||||||
|
| "appel-offre-public" // V1 onglet bonus light
|
||||||
|
| "communaute-pro"; // backlog V2 (Welow, etc.)
|
||||||
|
|
||||||
|
export type CoutEntree = "gratuit" | "freemium" | "abonnement" | "lead-paye" | "commission";
|
||||||
|
|
||||||
|
export type ZoneGeo = "france-entiere" | "regional" | string;
|
||||||
|
|
||||||
|
export interface ScoringTaff {
|
||||||
|
// Pour b2c-mise-en-relation : tous les 5 axes sont remplis.
|
||||||
|
// Pour appel-offre-public : seuls transparence + matching sont remplis,
|
||||||
|
// les 3 autres sont null (scoring simplifié décision F du MP).
|
||||||
|
remuneration: AxeScore | null;
|
||||||
|
transparence: AxeScore;
|
||||||
|
pratiques: AxeScore | null;
|
||||||
|
ecologie: AxeScore | null;
|
||||||
|
matching: AxeScore;
|
||||||
|
tag_global: TagGlobal;
|
||||||
|
justification_tag: string; // 1-2 phrases pourquoi ce tag
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Commentaire {
|
||||||
|
id: string;
|
||||||
|
date: string;
|
||||||
|
auteur_pseudo: string;
|
||||||
|
contenu: string;
|
||||||
|
modere: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlateformeTaff {
|
||||||
|
id: string; // slug-kebab
|
||||||
|
nom: string;
|
||||||
|
url: string;
|
||||||
|
type: TypePlateforme;
|
||||||
|
description: string; // IA 250 mots (5 sections fixes ≤50 mots)
|
||||||
|
description_courte: string; // IA 30 mots (carte preview)
|
||||||
|
|
||||||
|
scoring: ScoringTaff;
|
||||||
|
|
||||||
|
secteurs_servis: Secteur[];
|
||||||
|
zone_geo: ZoneGeo; // si "regional", précise zones
|
||||||
|
cout_entree: CoutEntree;
|
||||||
|
|
||||||
|
date_creation_fiche: string; // ISO
|
||||||
|
date_derniere_maj: string; // ISO — pour pipeline trimestriel
|
||||||
|
source_donnees: string[]; // URLs scrapées
|
||||||
|
flag_validation_jules: boolean; // true si tag ❌ validé manuellement
|
||||||
|
|
||||||
|
commentaires?: Commentaire[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlateformesTaffData {
|
||||||
|
meta: {
|
||||||
|
version: string;
|
||||||
|
date_generation: string; // ISO
|
||||||
|
total: number;
|
||||||
|
repartition: {
|
||||||
|
recommande: number;
|
||||||
|
sous_reserve: number;
|
||||||
|
a_eviter: number;
|
||||||
|
};
|
||||||
|
repartition_type: {
|
||||||
|
b2c: number;
|
||||||
|
appel_offre_public: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
plateformes: PlateformeTaff[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Helpers ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export const FAMILLES_SECTEUR: { id: Secteur; label: string; color: string }[] = [
|
||||||
|
{ id: "renovation", label: "Rénovation", color: "#5a7a4a" },
|
||||||
|
{ id: "construction-neuve", label: "Construction neuve", color: "#3d6a8c" },
|
||||||
|
{ id: "urbanisme", label: "Urbanisme", color: "#6b3fa0" },
|
||||||
|
{ id: "architecture-interieure", label: "Archi intérieure", color: "#a85d3e" },
|
||||||
|
{ id: "paysage", label: "Paysage", color: "#5a7a4a" },
|
||||||
|
{ id: "mar-conseil", label: "MAR / Conseil", color: "#c4a472" },
|
||||||
|
{ id: "transversal", label: "Transversal", color: "#888888" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const TAG_LABELS: Record<TagGlobal, { label: string; emoji: string; color: string }> = {
|
||||||
|
"recommande": { label: "Recommandé AEP", emoji: "✅", color: "#5a7a4a" },
|
||||||
|
"sous-reserve": { label: "Sous réserve", emoji: "⚠️", color: "#c4a472" },
|
||||||
|
"a-eviter": { label: "À éviter", emoji: "❌", color: "#a85d3e" },
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user