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>
111 lines
4.3 KiB
Markdown
111 lines
4.3 KiB
Markdown
# Règles métier - Application CLEO
|
|
|
|
Ce document recense les règles métier et de développement identifiées dans l'application CLEO.
|
|
|
|
## 1. Gestion des rôles et permissions
|
|
|
|
### 1.1 Hiérarchie des rôles
|
|
- **DIR-CO** (fk_role = 1) : Direction commerciale
|
|
- Accès complet aux devis (propres + statut >= 2)
|
|
- Vision globale de l'activité
|
|
|
|
- **DV** (fk_role = 2) : Directeur des ventes
|
|
- Accès à ses propres devis
|
|
- Accès aux devis de ses RR subordonnés (statut >= 3)
|
|
- Récupération des RR via `fk_parent` dans la table `users`
|
|
|
|
- **RR** (fk_role = 3) : Responsable régional
|
|
- Accès uniquement à ses propres devis
|
|
|
|
- **Admin** (fk_role = 90) : Administration système
|
|
- Accès complet à l'administration
|
|
|
|
### 1.2 Visibilité des devis (mdevis.php)
|
|
La clause WHERE pour filtrer les devis dépend du rôle :
|
|
- **DIR-CO** : `d.fk_user = :fkUser OR d.fk_statut_devis >= 2`
|
|
- **DV** : `d.fk_user = :fkUser OR (d.fk_statut_devis >= 3 AND d.fk_user IN ([RR_IDS]))`
|
|
- **RR** : `d.fk_user = :fkUser`
|
|
|
|
## 2. Gestion des marchés et produits
|
|
|
|
### 2.1 Types de marchés
|
|
- **Marché standard** : Contient ses propres produits uniquement
|
|
- **Marché hybride** (`chk_marche_hybride = 1`) : Combine les produits du marché + produits du marché 999
|
|
- **Marché avec remise sur TG** (`chk_remise_sur_tg = 1`) : Charge uniquement les produits du marché 999
|
|
- **Marché 999** : Marché "Hors marché" ou "Tarif général"
|
|
|
|
### 2.2 Chargement des produits (load_devis_marche_produits)
|
|
|
|
| Type de marché | chk_remise_sur_tg | chk_marche_hybride | Produits chargés |
|
|
|---------------|-------------------|-------------------|------------------|
|
|
| Spécifique | 1 | - | Tous les produits du marché 999 |
|
|
| Spécifique | 0 | 0 | Produits du marché uniquement |
|
|
| Spécifique | 0 | 1 | Produits du marché + produits du 999 non présents |
|
|
| 999 (Hors marché) | - | - | Tous les produits du marché 999 |
|
|
|
|
### 2.3 Terme "Purchasing"
|
|
Quand `terme_achat = 'Purchasing'` dans `marches_listes` :
|
|
- Récupère les prix d'achat nets depuis le marché 999
|
|
- Applique les paliers de remise du marché 999
|
|
|
|
## 3. Sécurité et développement
|
|
|
|
### 3.1 Accès base de données
|
|
- **Obligatoire** : Utiliser la classe `Database` avec ses méthodes
|
|
- **Interdit** : Appeler directement `$db->prepare()` sur l'objet Database
|
|
- **Méthodes disponibles** :
|
|
- `$db->fetchAll($sql, $params)` : Récupérer plusieurs lignes
|
|
- `$db->fetchOne($sql, $params)` : Récupérer une ligne
|
|
- `$db->query($sql, $params)` : Exécuter une requête
|
|
- `$db->lastInsertId()` : Récupérer le dernier ID inséré
|
|
|
|
### 3.2 Protection contre les injections SQL
|
|
- Utiliser `intval()` pour les entiers dans les requêtes non préparées
|
|
- Utiliser `nettoie_input()` pour nettoyer les entrées utilisateur
|
|
- Privilégier les requêtes préparées via la classe Database
|
|
|
|
### 3.3 Variables de sécurité
|
|
- `$cidSafe = intval($cid)` : Version sécurisée pour les requêtes SQL
|
|
- Attention lors de la modification de variables : recalculer ou utiliser directement `intval()`
|
|
|
|
## 4. Statuts des devis
|
|
|
|
### 4.1 Statuts principaux
|
|
- **1** : En cours
|
|
- **2** : Validé niveau 1
|
|
- **3** : Validé niveau 2
|
|
- **20** : Archivé
|
|
|
|
### 4.2 Réactivation des devis
|
|
- Un devis archivé (statut 20) peut être réactivé (statut 1)
|
|
- La réactivation est tracée dans `devis_histo`
|
|
- Disponible selon les droits du rôle
|
|
|
|
## 5. Conventions de nommage
|
|
|
|
### 5.1 Fichiers
|
|
- **Contrôleurs** : `c*.php` pour les standards, `cjx*.php` pour AJAX
|
|
- **Modèles** : `m*.php`
|
|
- **Vues** : `v*.php`
|
|
|
|
### 5.2 Tables de base de données
|
|
- **Tables principales** : Nom simple (`devis`, `clients`, `produits`)
|
|
- **Tables de référence** : Préfixe `x_` (`x_familles`, `x_statuts`)
|
|
- **Tables système** : Préfixe `y_` (`y_pages`) ou `z_` (`z_logs`, `z_sessions`)
|
|
|
|
## 6. Gestion des prix et marges
|
|
|
|
### 6.1 Prix nets
|
|
- `chk_prix_net = 1` : Prix non modifiable (marché hybride)
|
|
- `chk_prix_net = 0` : Prix modifiable avec marges
|
|
|
|
### 6.2 Paliers de remise
|
|
Les produits peuvent avoir jusqu'à 6 paliers de remise :
|
|
- `prc_discount_1` avec `quantite_1`
|
|
- `prc_discount_2` avec `quantite_2`
|
|
- ... jusqu'à 6
|
|
|
|
---
|
|
|
|
*Document créé le 16 septembre 2025*
|
|
*À mettre à jour au fur et à mesure des découvertes* |