# WooCommerce Projects

## Présentation

WooCommerce Projects est un plugin WordPress qui ajoute une gestion avancée de projets personnalisés à WooCommerce. Il permet aux utilisateurs de sauvegarder des configurations de produits variables sous forme de "projets", de les retrouver dans leur espace client, et de les ajouter au panier en un clic. Il propose également une interface d'administration complète pour la gestion, la maintenance et la personnalisation des projets.

**Compatible avec Product Configurator** : Le plugin s'intègre parfaitement avec le plugin Product Configurator pour capturer les configurations avancées (popups Gutenberg, produits recommandés, dimensions, prix dynamiques).

---

## Table des matières
- [Installation](#installation)
- [Fonctionnalités principales](#fonctionnalités-principales)
- [Intégration Product Configurator](#intégration-product-configurator)
- [Architecture du plugin](#architecture-du-plugin)
- [Fonctionnalités côté utilisateur (Frontend)](#fonctionnalités-côté-utilisateur-frontend)
- [Fonctionnalités côté administration (Backend)](#fonctionnalités-côté-administration-backend)
- [Développement et extension](#développement-et-extension)
- [Sécurité](#sécurité)
- [Maintenance et désinstallation](#maintenance-et-désinstallation)

---

## Installation

1. Téléversez le dossier `woocommerce-projects` dans le répertoire `wp-content/plugins/` de votre site WordPress.
2. Activez le plugin via le menu Extensions de WordPress.
3. Assurez-vous que WooCommerce est installé et activé.
4. (Optionnel) Installez et activez le plugin Product Configurator pour les fonctionnalités avancées.

---

## Fonctionnalités principales
- Sauvegarde de projets personnalisés à partir de produits variables WooCommerce.
- Espace "Mes projets" dans le compte client WooCommerce.
- Ajout rapide d'un projet au panier avec ses attributs et variations.
- Gestion des projets dans l'admin WooCommerce (CPT "project").
- Métaboxes d'édition avancées pour chaque projet.
- Maintenance et nettoyage automatique des projets orphelins.
- **Intégration complète avec Product Configurator** (nouveau).
- Sécurité renforcée (nonces, permissions, logs, rate limiting).

---

## Intégration Product Configurator

Le plugin WooCommerce Projects s'intègre parfaitement avec Product Configurator pour capturer :

### Données capturées
- **Sélections des popups Gutenberg** : Toutes les sélections faites via les popups de configuration sont sauvegardées.
- **Produits recommandés** : Les accessoires ajoutés au panier via les popups sont enregistrés avec le projet.
- **Dimensions** : Largeur et hauteur configurées sont stockées.
- **Prix calculé** : Le prix au moment de la sauvegarde est mémorisé.

### Fonctionnement
1. L'utilisateur configure son produit via les popups Product Configurator.
2. Il peut ajouter des produits recommandés/accessoires via les popups.
3. En cliquant sur "Enregistrer ce projet", toute la configuration est sauvegardée.
4. Depuis "Mes projets", l'ajout au panier :
   - Ajoute le produit principal avec tous ses attributs
   - Ajoute automatiquement les produits recommandés associés
   - Affiche une notification indiquant le nombre d'accessoires ajoutés

### Métadonnées stockées
| Métadonnée | Description |
|------------|-------------|
| `all_attributes` | Tous les attributs du produit |
| `pc_dimensions` | Dimensions (width, height) |
| `pc_recommended_products` | Liste des produits recommandés |
| `pc_calculated_price` | Prix calculé au moment de la sauvegarde |
| `pc_selections` | Sélections spécifiques Product Configurator |
| `uses_product_configurator` | Flag indiquant l'utilisation de PC |

---

## Architecture du plugin

### Fichiers principaux
- `woocommerce-projects.php` : Point d'entrée du plugin, vérification de WooCommerce, chargement des classes.
- `uninstall.php` : Nettoyage complet lors de la désinstallation.

### Structure des dossiers
- `includes/` : Classes principales du plugin.
  - `class-autoloader.php` : Autoloader PSR-4 pour les classes du plugin.
  - `class-woocommerce-projects.php` : Singleton principal, hooks globaux, initialisation.
  - `class-project-post-type.php` : Déclaration du Custom Post Type "project" et colonnes personnalisées.
  - `class-utils.php` : Fonctions utilitaires (génération d'ID, validation, logs).
  - `backend/` : Fonctions et assets pour l'administration.
    - `class-admin-metabox.php` : Métaboxes d'édition, page de maintenance, AJAX admin.
    - `class-backend-assets.php` : Enregistrement et chargement des assets admin (CSS/JS).
    - `assets/` :
      - `css/admin.css` : Styles admin.
      - `js/admin-metabox.js` : JS pour métaboxes dynamiques.
  - `frontend/` : Fonctions et assets pour l'espace client.
    - `class-frontend-assets.php` : Enregistrement et chargement des assets frontend (CSS/JS).
    - `class-project-save.php` : Bouton "Enregistrer ce projet", gestion AJAX, création de projet.
    - `class-my-account.php` : Endpoint "Mes projets", affichage, ajout au panier, notifications.
    - `assets/` :
      - `css/frontend.css` : Styles utilisateur.
      - `js/project-save.js` : JS pour la sauvegarde de projet.

---

## Fonctionnalités côté utilisateur (Frontend)

- **Bouton "Enregistrer ce projet"** :
  - Affiché sur les produits variables pour les utilisateurs connectés.
  - Capture les variations et attributs sélectionnés.
  - Envoie les données via AJAX pour créer un projet personnalisé.
- **Espace "Mes projets" dans Mon compte** :
  - Nouvel onglet listant tous les projets de l'utilisateur.
  - Affichage des attributs globaux (taxonomies WooCommerce) et personnalisés.
  - Affichage du prix dynamique si le plugin "dynamic-price-for-woocommerce" est actif.
  - Bouton "Ajouter au panier" pour chaque projet (récupère toutes les données et ajoute le produit/variation au panier).
  - Notifications WooCommerce pour succès/erreur.
- **Assets frontend** :
  - `frontend.css` : Styles des boutons, tableaux, notifications.
  - `project-save.js` : Gestion AJAX, validation, messages utilisateur.

---

## Fonctionnalités côté administration (Backend)

- **Custom Post Type "project"** :
  - Accessible dans le menu WooCommerce.
  - Colonnes personnalisées : ID projet, utilisateur, produit lié.
  - Tri et recherche avancés.
- **Métabox d'édition avancée** :
  - Sélecteur de produit lié et variation (dynamique via JS).
  - Ajout/édition des attributs simulés (clé/valeur).
  - Validation et sanitation des données à la sauvegarde.
- **Page de maintenance** :
  - Nettoyage des projets orphelins (produit/variation manquant).
  - Correction des métadonnées invalides.
  - Régénération des IDs manquants.
  - Journalisation des actions.
- **Assets admin** :
  - `admin.css` : Styles des métaboxes et formulaires.
  - `admin-metabox.js` : Sélecteurs dynamiques, validation.

---

## Développement et extension

- **Autoloader** : Toutes les classes sont chargées automatiquement (PSR-4).
- **Hooks principaux** :
  - `init` : Initialisation du plugin, enregistrement du CPT, endpoints, etc.
  - `wp_ajax_save_project` : AJAX pour la sauvegarde de projet.
  - `woocommerce_account_projects_endpoint` : Affichage de l'espace "Mes projets".
  - `delete_user` : Suppression ou réassignation des projets lors de la suppression d'un utilisateur.
- **Utilitaires développeur** :
  - Génération d'ID unique pour chaque projet (`PRJ-xxxx-xxxx`).
  - Validation/sanitation centralisée (`Validator`).
  - Journalisation des événements de sécurité.
- **Intégration avec d'autres plugins** :
  - Détection automatique de "dynamic-price-for-woocommerce".
  - Gestion des attributs simulés pour la compatibilité avec les prix dynamiques.

---

## Sécurité

- Utilisation systématique de nonces pour tous les formulaires et requêtes AJAX.
- Vérification des permissions utilisateur avant chaque action sensible.
- Limitation du nombre de requêtes AJAX par utilisateur.
- Validation et sanitation de toutes les entrées utilisateur.
- Journalisation des tentatives suspectes dans les logs PHP.

---

## Maintenance et désinstallation

- **Maintenance** :
  - Outil admin pour nettoyer les projets orphelins, corriger les métadonnées, régénérer les IDs.
- **Désinstallation** :
  - Suppression de tous les projets et métadonnées associées (`uninstall.php`).
  - Nettoyage des métadonnées orphelines dans la base.

---

## Bonnes pratiques et recommandations développeur

- Respecter les conventions WordPress (noms, hooks, sécurité).
- Documenter toutes les fonctions et classes avec des DocBlocks.
- Préfixer toutes les fonctions/classes pour éviter les conflits.
- Utiliser les utilitaires fournis pour la validation et la génération d'ID.
- Tester l'intégration avec WooCommerce et les plugins de prix dynamiques.

---

## Ressources complémentaires
- [Documentation WooCommerce](https://docs.woocommerce.com/)
- [WordPress Plugin Developer Handbook](https://developer.wordpress.org/plugins/)
- [Dynamic Price for WooCommerce](https://fr.wordpress.org/plugins/dynamic-price-for-woocommerce/)

---

*Pour toute question ou contribution, contactez l'auteur du plugin ou ouvrez une issue sur le dépôt associé.* 