Fonctionnalités principales : 1. Marchés hybrides - Onglet Mercurial - Ajout onglet Mercurial avec style distinct (vert, gras, blanc) - Affichage des produits mercuriaux pour marchés hybrides - Filtrage automatique des produits "Hors Marché 999" - Documentation Phase 2 avec CAS 1 et CAS 2 de marchés hybrides - Règles métier pour validation différenciée (devis 100% mercurial vs mixte) 2. Corrections bugs - Fix flag chkChange sur onglet "Sélection Produits" (callback asynchrone) - Plus d'alerte intempestive après sauvegarde des produits 3. Outils de déploiement - Nouveau script deploy-file.sh pour déploiement unitaire (DEV/PROD) - Amélioration deploy-cleo.sh 4. Gestion multi-contacts (v2.0.3) - Contrôleur AJAX cjxcontacts.php - Script migration clients_contacts - Documentation complète 5. Documentation - Mise à jour TODO.md avec Phase 2 marchés hybrides - Mise à jour README.md v2.0.3 - Ajout RULES.md - Ajout migration_clients_contacts.sql 6. Nettoyage - Suppression fichiers obsolètes (conf_new.php, conf_old.php, uof_linet_20250911.sql) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
16 KiB
TODO - Évolutions CLEO
Fonctionnalités à développer
Module Devis
8. Dupliquer une ligne produit
Priorité: Moyenne
Description: Permettre la duplication d'une ligne produit dans un même devis (utile pour les gratuités).
Tâches:
- Ajouter un bouton "Dupliquer" sur chaque ligne produit
- Gérer la duplication avec prix à 0 pour les gratuités
- Conserver l'ordre des lignes après duplication
- Mettre à jour automatiquement les totaux
16. Système de recherche avancée
Priorité: Haute
Description: Ajouter une recherche multi-critères pour les devis en cours et archivés.
Tâches:
- Créer une interface de recherche unifiée
- Implémenter la recherche par :
- Numéro de devis
- Nom d'établissement/client
- Référence produit
- Numéro d'opportunité
- Ajouter des filtres par statut (en cours/archivé)
- Paginer les résultats de recherche
- Export des résultats en Excel
21. Actualisation tarifaire
Priorité: Moyenne Description: Permettre l'actualisation des prix selon la dernière grille tarifaire. Tâches:
- Ajouter un bouton "Actualiser les tarifs"
- Comparer les prix actuels avec la grille en vigueur
- Afficher les différences avant validation
- Recalculer automatiquement les marges
- Tracer l'actualisation dans l'historique
22. Marchés hybrides et onglet Mercurial
Priorité: Haute Description: Ajouter un onglet "Mercurial" dans la page devis pour les marchés de type hybride, listant tous les produits du marché.
Tâches - Phase 1 (Onglet Mercurial) :
- Identifier le type de marché du devis sélectionné
- Détecter si le marché est de type "hybride"
- Ajouter un nouvel onglet "Mercurial" dans l'interface devis (au niveau de l'onglet Produits)
- Récupérer tous les produits associés au marché
- Filtrer les produits "Hors Marché 999"
- Afficher la liste des produits dans l'onglet Mercurial
- Gérer l'affichage/masquage de l'onglet selon le type de marché
Tâches - Phase 2 (Améliorations visuelles et règles métier) :
- Visibilité de l'onglet Mercurial : Rendre l'onglet "Mercurial" visuellement distinct (couleur de fond différente, par exemple) pour qu'il soit clairement identifiable par les commerciaux
Types de marchés hybrides : Deux cas de marchés hybrides doivent être gérés différemment :
CAS 1 - Mercuriale sans remise :
- Liste mercuriale en prix nets SANS remise applicable sur ces références
- Reste du catalogue disponible avec possibilité de remises en autonomie
CAS 2 - Mercuriale avec remise possible :
- Liste mercuriale en prix nets AVEC possibilité de remises sur ces références
- Reste du catalogue disponible avec possibilité de remises en autonomie
Règles communes aux 2 cas :
- Quand le devis contient UNIQUEMENT des références mercuriales → pas de demande d'accord nécessaire, le RR peut valider directement
- Quand le devis contient références mercuriales + catalogue général → seules les références du catalogue sont concernées par les seuils de marge et peuvent générer une demande d'accord
- Si geste commercial souhaité sur un devis 100% mercurial → utiliser le champ "Demande geste commercial" existant
Tâches - Paramétrage base de données :
- Ajouter un champ dans la table
marchespour définir le type de marché hybride :type_mercurial(ENUM ou INT) : NULL = non hybride, 1 = CAS 1 (sans remise), 2 = CAS 2 (avec remise)
- Modifier la fiche marché pour permettre la sélection du type de marché hybride
Tâches - Logique métier de validation :
- Détecter si un devis contient uniquement des produits mercuriaux
- Détecter si un devis contient un mix mercurial + catalogue
- Adapter le calcul des seuils de marge :
- Si devis 100% mercurial → pas de vérification de seuil, validation RR directe
- Si devis mixte → calculer les seuils uniquement sur les produits du catalogue général
- Bloquer/autoriser les remises sur produits mercuriaux selon le type de marché (CAS 1 vs CAS 2)
- Tester le workflow complet avec les 2 types de marchés hybrides
Module SAP
13. Import et contrôle des clients SAP
Priorité: Haute Description: Contrôler les nouveaux clients créés dans la base CLEO et vérifier la correspondance avec la base SAP. Tâches:
- Identifier le script/contrôleur d'import des clients SAP
- Analyser la structure des données importées
- Mettre en place un système de contrôle de correspondance
- Vérifier l'unicité du
clients.code(identifiant SAP) - Détecter les doublons potentiels (nom, adresse)
- Signaler les incohérences entre SAP et CLEO
- Vérifier l'unicité du
- Créer un rapport d'import avec :
- Nombre de clients importés
- Nombre de clients mis à jour
- Nombre d'anomalies détectées
- Gestion des cas particuliers :
- Client existe dans CLEO mais pas dans SAP
- Client existe dans SAP mais code différent dans CLEO
- Contacts orphelins après import
14. Gestion de la prise en charge
Priorité: Haute
Description: Ajouter la traçabilité de la prise en charge et du transfert EDI.
Tâches:
- Ajouter les champs en base de données :
chk_prise_en_charge(boolean)fk_user_prise_en_charge(int)date_prise_en_charge(datetime)fk_user_transfert_edi(int)date_transfert_edi(datetime)erreur_transfert_edi(text)
- Interface de prise en charge avec case à cocher
- Affichage du nom du gestionnaire (ex: "Angela Monteiro")
- Possibilité de décocher en cas d'erreur
- Log des transferts EDI
- Gestion et affichage des erreurs EDI
16. Recherche dans le module SAP
Priorité: Moyenne
Description: Implémenter la recherche dans le module SAP (voir point 16 des Devis).
Tâches:
- Réutiliser le composant de recherche des devis
- Adapter aux spécificités SAP
- Filtres supplémentaires (état EDI, prise en charge)
Migration Infrastructure - Séparation Application/Base de données
✅ PHASE 1 COMPLÉTÉE (12 septembre 2025)
Description: Migration réussie de l'architecture DEV/RECETTE vers la nouvelle structure avec séparation application/base de données.
Architecture actuelle (après migration DEV)
- DEV/RECETTE: Host IN3 ✅
- Container
dva-front(application PHP uniquement) ✅ - Container
maria3(MariaDB dédié avec basecleo) ✅
- Container
- PROD: Host IN2 (actuel, à migrer)
- Container
nx4(application + BDD intégrées) - Bases de données:
uof_frontaletuof_linet
- Container
Architecture cible PROD (à faire)
- PROD: Host IN4 (nouveau)
- Container
pra-front(import depuis IN3.dva-front) - Container
maria4(import depuis IN3.maria3)
- Container
- Décommissionnement: Host IN2 (après migration PROD)
✅ Refactoring de la base de données (COMPLÉTÉ)
Changements réalisés:
- ✅ Suppression de la base
uof_frontal- Configuration externalisée dans
.env - Table
y_pagesmigrée verscleo
- Configuration externalisée dans
- ✅ Fusion
uof_frontal+uof_linet→cleo- Une seule base de données
- Connexion PDO avec pattern Singleton
- ✅ Intégration des logs
- Table
z_logsdans la basecleo - Tables
z_sessionsetz_statscréées
- Table
Plan de migration - État d'avancement
✅ Migration complétée - Toutes les phases (0 à 4) sont terminées.
Configuration technique
Variables d'environnement
DEV (IN3) - Actuel:
DB_HOST=13.23.33.4 # IP de maria3
DB_PORT=3306
DB_DATABASE=cleo
DB_USERNAME=cleo_user
DB_PASSWORD=CleoDev2025!
PROD (IN4) - À configurer:
DB_HOST=<IP_maria4> # À définir sur IN4
DB_PORT=3306
DB_DATABASE=cleo
DB_USERNAME=cleo_user
DB_PASSWORD=<PROD_PASSWORD> # À sécuriser
Sécurité réseau
- ✅ Connexions uniquement depuis les containers applicatifs
- ✅ Pas d'exposition directe des ports MariaDB
- Firewall entre containers à configurer sur IN4
Backup et restauration
- Scripts de backup automatisés à mettre en place
- Réplication master-slave pour haute disponibilité (optionnel)
Modification Contacts Clients - Migration vers clients.code
Contexte
La relation entre clients_contacts et clients utilise actuellement clients.rowid comme clé étrangère.
Cela pose problème lors des imports SAP qui peuvent écraser ou modifier les rowid.
Il faut migrer vers clients.code (identifiant SAP immuable) pour garantir l'intégrité des relations.
Plan de correction
1. Vérification préalable
- Lire la structure actuelle de la table
clients- Confirmer que
codeest de type INT - Vérifier la contrainte UNIQUE sur
code - Vérifier l'index sur
code
- Confirmer que
- Lire la structure de
clients_contacts- État actuel de
fk_client - Contraintes de clé étrangère existantes
- État actuel de
- Vérifier les données existantes
- Nombre de contacts déjà enregistrés
- Cohérence des relations actuelles
2. Modification de la structure
- Supprimer la contrainte FK actuelle sur
clients_contacts.fk_client - Modifier le type de
clients_contacts.fk_clientpour correspondre àclients.code - Ajouter la nouvelle contrainte FK référençant
clients.codeON DELETE CASCADEON UPDATE CASCADE
- Vérifier/ajouter index UNIQUE sur
clients.codesi nécessaire
3. Migration des données
- Créer un script de migration SQL
- Sauvegarder les données actuelles de
clients_contacts - Convertir les
fk_client(rowid → code) - Valider la cohérence des données migrées
- Tester l'intégrité référentielle
4. Adaptation du code applicatif
- ✅ Contrôleur
cjxcontacts.php- Aucune modification nécessaire (utilise déjà
fk_clientde manière générique)
- Aucune modification nécessaire (utilise déjà
- ✅ Contrôleur
cjxdevis.phpload_clients_devis: modifié pour retournerclients.codesave_new_client: modifié pour utilisernewCodeau lieu denewClientId
- ✅ JavaScript
jdevis.js- Fonction
autocompleteClient: modifiée pour utiliserlist[i]['code']au lieu delist[i]['rowid'] loadContactsClient(list[i]['code']): passe maintenant le code SAP
- Fonction
- Import clients SAP : À TRAITER EN PRIORITÉ
- Fichier concerné : identifier le contrôleur/script d'import
- Lors de l'import, si un client existe déjà (même
code), mettre à jour ses infos SANS changer lecode - Gérer la mise à jour des contacts : les contacts existants doivent conserver leur lien via
fk_client = code - Si import d'un nouveau client : créer avec le
codeSAP fourni - IMPORTANT : Ne jamais modifier
clients.codeaprès création (immuable)
5. Tests et validation
- Tests de création de contact
- Tests de modification de contact
- Tests de suppression de contact (soft delete)
- Tests de sélection de contact dans un devis
- Simuler un import SAP et vérifier la stabilité des relations
Notes techniques
-- Exemple de modification FK
ALTER TABLE clients_contacts
DROP FOREIGN KEY fk_clients_contacts_client;
ALTER TABLE clients_contacts
ADD CONSTRAINT fk_clients_contacts_client
FOREIGN KEY (fk_client)
REFERENCES clients(code)
ON DELETE CASCADE
ON UPDATE CASCADE;
Améliorations techniques prioritaires
Sécurité
- ✅ Migrer les credentials DB vers des variables d'environnement
- ✅ Classe Database avec requêtes préparées PDO
- ✅ Audit complet et correction de toutes les injections SQL (14 vulnérabilités corrigées)
- Correction des failles XSS potentielles
- Implémentation des tokens CSRF
- Tests de sécurité automatisés
Performance
- Implémenter la pagination côté serveur pour toutes les listes
- Ajouter des index sur les colonnes fréquemment recherchées
- Mettre en cache les requêtes récurrentes
Qualité du code
- Ajouter la documentation PHPDoc sur les fonctions principales
- Créer des tests unitaires pour les fonctions critiques
- Standardiser la gestion des erreurs
Planning prévisionnel
Sprint 1 (2 semaines) - Sécurité
- Correction des vulnérabilités critiques
- Migration des configurations sensibles
Sprint 2 (3 semaines) - Fonctionnalités prioritaires
- Point 6 : Modification devis archivés
- Point 14 : Prise en charge SAP
- Point 16 : Recherche avancée
Sprint 3 (3 semaines) - Gestion des contacts
- Point 19 : Contacts multiples
- Migration des données existantes
Sprint 4 (2 semaines) - Améliorations
- Point 8 : Duplication lignes produits
- Point 21 : Actualisation tarifaire
Sprint 5 (2 semaines) - Optimisations
- Performances et pagination
- Tests et documentation
Notes de développement
✅ Structure de la table clients_contacts (CRÉÉE - v2.0.3)
Table créée et opérationnelle avec :
- Clé étrangère vers
clientsavec CASCADE - Gestion du contact principal (un seul par client)
- Soft delete via champ
active - Traçabilité (date_creat, fk_user_creat, date_modif, fk_user_modif)
- Index sur fk_client, principal et email
- Contrainte UNIQUE sur rowid
- Voir
docs/migration_clients_contacts.sqlpour la structure complète
Modifications table devis pour SAP
ALTER TABLE devis ADD COLUMN chk_prise_en_charge TINYINT DEFAULT 0;
ALTER TABLE devis ADD COLUMN fk_user_prise_en_charge INT;
ALTER TABLE devis ADD COLUMN date_prise_en_charge DATETIME;
ALTER TABLE devis ADD COLUMN fk_user_transfert_edi INT;
ALTER TABLE devis ADD COLUMN date_transfert_edi DATETIME;
ALTER TABLE devis ADD COLUMN erreur_transfert_edi TEXT;
Résumé de l'état actuel
✅ Réalisations
v2.0.1 (12 septembre 2025)
- Migration DEV complétée : Architecture séparée application/BDD
- Base unique
cleo: Fusion réussie de 3 bases en une seule - Sécurité renforcée : PDO, requêtes préparées, variables d'environnement
- Container
dva-front: MariaDB supprimé, application PHP uniquement - Container
maria3: Base de données centralisée opérationnelle
v2.0.2 (12 septembre 2025)
- Audit de sécurité complété : 14 vulnérabilités SQL identifiées et corrigées
- 8 critiques (fonction autocomplete, injections dans cjxpost.php, mclients.php, mdevis.php)
- 6 moyennes (cjxdevis.php, cjxexport.php, cjximport.php, mexpxls.php)
- Fonctionnalité Réactivation devis : Bouton permettant de réactiver les devis archivés (statut 20 → 1)
v2.0.3 (21 octobre 2025)
- Gestion multi-contacts par client : Table
clients_contactsopérationnelle - Interface CRUD complète : Modale Bootstrap avec création/modification/suppression de contacts
- Contrôleur AJAX
cjxcontacts.php: 5 endpoints sécurisés avec requêtes préparées - Intégration dans les devis : Sélecteur de contact avec affichage des infos en lecture seule
- Gestion automatique du contact principal : Un seul contact principal par client
- Soft delete : Prévention de la suppression du dernier contact actif
🎯 Prochaines étapes prioritaires
- Nettoyage BDD : Supprimer les anciens champs contact de la table
clients(après validation) - Migration PROD vers IN4 : Export/Import des containers vers
pra-frontetmaria4 - Fonctionnalités métier : Points 8, 14, 16, 21 (voir sections ci-dessus)
- Sécurité XSS : Audit et correction des failles XSS potentielles
- Tests : Mise en place de tests automatisés de sécurité
Document mis à jour le 21 octobre 2025 Version 2.0.3 - Gestion multi-contacts