From a1270ee103301b87f3b956a4bd753faae1e46be4 Mon Sep 17 00:00:00 2001 From: Opus-Yacine Date: Fri, 17 Apr 2026 14:57:43 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Consolidation=20module=20Candidats=20(L?= =?UTF-8?q?ean=206=CF=83,=20ZERO=20=C3=A9crasement)=20=E2=80=94=20(1)=20/c?= =?UTF-8?q?onsultants-list.html=20nouvelle=20page=20+=20(2)=20missions=20L?= =?UTF-8?q?EFT=20JOIN=20crm.deals=20(deal=5Ftitle/stage/value=20expos?= =?UTF-8?q?=C3=A9s,=20lecture=20seule)=20+=20(3)=20vsm-hub=20dept=20rh=20e?= =?UTF-8?q?nrichi=20+3=20liens=20(injection=20ternaire,=202262=E2=86=92305?= =?UTF-8?q?5=20bytes)=20=E2=80=94=20doctrines=2055+56=20=E2=80=94=20NR=201?= =?UTF-8?q?53/153?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/em-api.php | 6 +- api/plan-action-dp.md | 44 ++++++++++++++ consultants-list.html | 135 ++++++++++++++++++++++++++++++++++++++++++ vsm-hub.html | 1 + 4 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 consultants-list.html diff --git a/api/em-api.php b/api/em-api.php index 79dddd883..640619d51 100644 --- a/api/em-api.php +++ b/api/em-api.php @@ -570,7 +570,7 @@ case "missions": } if ($id) { - $stmt = $pdo->prepare("SELECT m.*, c.full_name as consultant_name, c.role as consultant_role FROM weval.missions m LEFT JOIN weval.consultants c ON c.id = m.consultant_id WHERE m.id=? AND m.tenant_id=?"); + $stmt = $pdo->prepare("SELECT m.*, c.full_name as consultant_name, c.role as consultant_role, d.title as deal_title, d.stage as deal_stage, d.value as deal_value, d.currency as deal_currency, d.expected_close as deal_close FROM weval.missions m LEFT JOIN weval.consultants c ON c.id = m.consultant_id LEFT JOIN crm.deals d ON d.id = m.deal_id WHERE m.id=? AND m.tenant_id=?"); $stmt->execute([$id, $tenant]); $row = $stmt->fetch(PDO::FETCH_ASSOC); if (!$row) { http_response_code(404); echo json_encode(["error"=>"not_found"]); break; } @@ -584,8 +584,8 @@ case "missions": break; } - // List missions - $stmt = $pdo->prepare("SELECT m.id, m.mission_code, m.client_code, m.client_name, m.role, m.tjm, m.start_date, m.end_date, m.status, c.full_name as consultant_name FROM weval.missions m LEFT JOIN weval.consultants c ON c.id = m.consultant_id WHERE m.tenant_id=? ORDER BY m.start_date DESC"); + // List missions + LEFT JOIN crm.deals (consolidation 17avr 15h05, lecture seule) + $stmt = $pdo->prepare("SELECT m.id, m.mission_code, m.client_code, m.client_name, m.role, m.tjm, m.start_date, m.end_date, m.status, m.deal_id, c.full_name as consultant_name, d.title as deal_title, d.stage as deal_stage, d.value as deal_value, d.currency as deal_currency FROM weval.missions m LEFT JOIN weval.consultants c ON c.id = m.consultant_id LEFT JOIN crm.deals d ON d.id = m.deal_id WHERE m.tenant_id=? ORDER BY m.start_date DESC"); $stmt->execute([$tenant]); echo json_encode(["tenant"=>$tenant, "missions"=>$stmt->fetchAll(PDO::FETCH_ASSOC)]); break; diff --git a/api/plan-action-dp.md b/api/plan-action-dp.md index aa962438a..ebbb4842f 100644 --- a/api/plan-action-dp.md +++ b/api/plan-action-dp.md @@ -1926,3 +1926,47 @@ WEVIA tombait en LLM fallback (llama3.1-8b) sur des questions business triviales ### Doctrine 53 Format "full" module = 7 tables + router-cases + 3 pages + 8 intents + seed depuis Excel source. Toujours GOLD vault avant chaque étape. Toujours lint PHP après chaque patch. Toujours NR check avant commit. + +--- + +## MISE À JOUR 17avr 15h05 — CONSOLIDATION MODULE CANDIDATS (Lean 6σ, ZERO écrasement) + +### 3 intégrations livrées (anti-régression stricte, NR check entre chaque) + +**1/ Page /consultants-list.html créée** (7.4KB) +- Grille consultants avec filtres statut/séniorité/search +- Stats: total, actifs, seniors, juniors, TJM moyen +- Badges seniority (junior/confirmed/senior) +- Lien vers mission-billing par consultant +- ZERO écrasement (page nouvelle, pas existante) + +**2/ API Missions ↔ CRM deals (LEFT JOIN lecture seule)** +- `GET /api/em/missions` retourne maintenant: `deal_title`, `deal_stage`, `deal_value`, `deal_currency` +- `GET /api/em/missions/{id}` retourne en plus: `deal_close` +- Table `crm.deals` (pas `admin.pipeline_deals` — doctrine: vérifier schéma réel avant FK) +- Mission WEVAL_CGI_ODI_2026 liée à deal #1 Referral Partner Northern Africa (50K USD negotiation) +- ZERO modification schéma, ZERO écriture dans crm.deals (lecture seule) +- GOLD: em-api.php.GOLD-20260417-125610-pre-crm-leftjoin + +**3/ VSM-Hub dept 'rh' enrichi** +- Injection chirurgicale ternaire `${x.dept_code==='rh' ? ... : ''}` +- 3 liens ajoutés sur la card rh: 👥 Candidates / 👔 Consultants / 💰 Missions +- Taille: 2262 → 3055 bytes (+800 ajout, ZERO suppression) +- GOLD: vsm-hub.html.GOLD-20260417-125720-pre-rh-link + +### Doctrine 55 ajoutée +ENRICHISSEMENT CHIRURGICAL : quand une page existe déjà et doit être étendue, utiliser injection ternaire JS (`${cond ? block : ''}`) jamais réécriture complète. Taille doit augmenter, jamais diminuer. GOLD obligatoire avant chaque patch HTML. + +### Doctrine 56 ajoutée +FK CROSS-SCHEMA : vérifier le VRAI schéma DB avec `\dt pattern` avant de documenter un FK. Les noms de schéma changent (admin vs crm). weval.missions.deal_id référence crm.deals(id), PAS admin.pipeline_deals. + +### Conflits évités (doctrine 59) +- Claude autre travaille sur Visual Management + Andon KPI (dept production) commit 498df9e4 à 14h53 +- Zéro overlap: je ne touche pas andon/production/visual-management +- Pas touché à B2B pipeline (commits récents autre Claude 60k contacts) + +### Tests E2E validés +- ✅ /consultants-list.html HTTP 200 +- ✅ API missions deal_title: "Referral Partner Northern Africa - 15% ACV" +- ✅ vsm-hub.html injection rh: 1 occurrence(s) lien candidates-pool + diff --git a/consultants-list.html b/consultants-list.html new file mode 100644 index 000000000..9e4648295 --- /dev/null +++ b/consultants-list.html @@ -0,0 +1,135 @@ +Consultants — WEVAL + + + +

👔 Consultants WEVAL

+
Équipe active — candidats validés passés au statut consultant
+ +
+ +
+ + + +
+ + + +
CodeConsultantRôleEntitéSénioritéTJMCommissionStatutEmbaucheMissions
Loading...
+ + diff --git a/vsm-hub.html b/vsm-hub.html index 7301609e7..e361a65bc 100644 --- a/vsm-hub.html +++ b/vsm-hub.html @@ -32,6 +32,7 @@ fetch(`/api/em/vsm?tenant=${TENANT}`).then(r=>r.json()).then(d=>{
${(x.kpis||[]).slice(0,2).map(k=>`
${k.name}: ${k.target}${k.unit}
`).join('')}
+ ${x.dept_code==='rh' ? `
👥 Candidates👔 Consultants💰 Missions
` : ''} `).join(''); }).catch(e=>{document.getElementById('grid').innerHTML='
Erreur: '+e.message+'
'});