Update project documentation in 10-stack.mdc with JIRA prefix details, add new routes for Radar functionality in Routes.php, and include Radar link in the sidebar menu of men_list.php.

This commit is contained in:
2026-08-20 17:09:59 -04:00
parent d41bdad079
commit 30998edad5
10 changed files with 496 additions and 1 deletions

129
sql/IDEE-4-radar-proto.sql Normal file
View File

@ -0,0 +1,129 @@
-- IDEE-4 / IDEE-5 — Radar mail proto (CRM)
-- Tables pour lécran /v4/radar. Moteur Gmail Push + Gemini : story suivante.
-- Exécuter sur la BD CRM de DEV (devcrmms1_dev), pas en prod.
CREATE TABLE IF NOT EXISTS radar_exceptions (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
kind ENUM('mailbox', 'sender') NOT NULL DEFAULT 'mailbox',
value VARCHAR(190) NOT NULL,
note VARCHAR(255) NOT NULL DEFAULT '',
active TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_radar_exc (kind, value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS radar_threads (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
gmail_thread_id VARCHAR(64) NOT NULL,
mailbox VARCHAR(190) NOT NULL DEFAULT '',
subject VARCHAR(255) NOT NULL DEFAULT '',
from_email VARCHAR(190) NOT NULL DEFAULT '',
from_name VARCHAR(190) NOT NULL DEFAULT '',
gmail_url VARCHAR(500) NOT NULL DEFAULT '',
client_id INT UNSIGNED NULL DEFAULT NULL,
projet_id INT UNSIGNED NULL DEFAULT NULL,
proposed_client_no VARCHAR(32) NOT NULL DEFAULT '',
status VARCHAR(32) NOT NULL DEFAULT 'a_classer',
summary VARCHAR(500) NOT NULL DEFAULT '',
confidence TINYINT UNSIGNED NOT NULL DEFAULT 0,
is_example TINYINT(1) NOT NULL DEFAULT 0,
received_at DATETIME NULL DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_radar_thread (gmail_thread_id),
KEY idx_radar_status (status),
KEY idx_radar_received (received_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS radar_thread_skills (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
thread_id INT UNSIGNED NOT NULL,
skill VARCHAR(32) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uq_radar_skill (thread_id, skill),
KEY idx_radar_skill (skill)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS radar_rules (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
match_type ENUM('email', 'domain') NOT NULL DEFAULT 'email',
match_value VARCHAR(190) NOT NULL,
client_id INT UNSIGNED NULL DEFAULT NULL,
projet_id INT UNSIGNED NULL DEFAULT NULL,
skill VARCHAR(32) NOT NULL DEFAULT '',
source VARCHAR(32) NOT NULL DEFAULT 'human',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_radar_rule (match_type, match_value, skill)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO radar_exceptions (kind, value, note, active)
SELECT 'mailbox', 'confirmation@ms1timing.com', 'Mails transactionnels inscription — ne pas ouvrir', 1
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM radar_exceptions
WHERE kind = 'mailbox' AND value = 'confirmation@ms1timing.com'
);
INSERT INTO radar_threads (
gmail_thread_id, mailbox, subject, from_email, from_name, gmail_url,
proposed_client_no, status, summary, confidence, is_example, received_at
)
SELECT
'proto-ex-1',
'desjardins.lp@ms1timing.com',
'Logos dossards + fichiers départ site',
'marie@course-exemple.ca',
'Marie Exemple',
'',
'1842',
'a_classer',
'Deux sujets dans le même fil : logos pour limprimeur, et fichiers à déposer pour le site dinscription.',
72,
1,
NOW()
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM radar_threads WHERE gmail_thread_id = 'proto-ex-1');
INSERT INTO radar_thread_skills (thread_id, skill)
SELECT t.id, 'dossards' FROM radar_threads t
WHERE t.gmail_thread_id = 'proto-ex-1'
AND NOT EXISTS (
SELECT 1 FROM radar_thread_skills s WHERE s.thread_id = t.id AND s.skill = 'dossards'
);
INSERT INTO radar_thread_skills (thread_id, skill)
SELECT t.id, 'site' FROM radar_threads t
WHERE t.gmail_thread_id = 'proto-ex-1'
AND NOT EXISTS (
SELECT 1 FROM radar_thread_skills s WHERE s.thread_id = t.id AND s.skill = 'site'
);
INSERT INTO radar_threads (
gmail_thread_id, mailbox, subject, from_email, from_name, gmail_url,
proposed_client_no, status, summary, confidence, is_example, received_at
)
SELECT
'proto-ex-2',
'info@ms1timing.com',
'Question impression dossards',
'nouveau@inconnu.example',
'Contact inconnu',
'',
'',
'a_mettre_dans_crm',
'Adresse absente du CRM. Créer le contact / projet, puis relancer — le fil doit se recoller tout seul.',
40,
1,
DATE_SUB(NOW(), INTERVAL 25 MINUTE)
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM radar_threads WHERE gmail_thread_id = 'proto-ex-2');
INSERT INTO radar_thread_skills (thread_id, skill)
SELECT t.id, 'dossards' FROM radar_threads t
WHERE t.gmail_thread_id = 'proto-ex-2'
AND NOT EXISTS (
SELECT 1 FROM radar_thread_skills s WHERE s.thread_id = t.id AND s.skill = 'dossards'
);