designtopack/CLAUDE.md

345 lines
12 KiB
Markdown
Raw Permalink Normal View History

2026-01-15 11:03:50 +01:00
# Design to Pack - Vue d'ensemble du projet
Plateforme de gestion de projets de création de flacons de parfum pour Pochet du Courval.
## Stack technique
| Couche | Technologies |
|--------|-------------|
| **Backend** | Kirby CMS 4 (PHP), flat-file database |
| **Frontend** | Vue 3 + Vite 7, Pinia, Vue Router 4, PrimeVue 4.0 |
| **PDF** | @vue-pdf-viewer 2.5 |
| **3D** | Three.js (vue interactive 360) |
| **Déploiement** | GitLab CI/CD, rsync vers serveur |
---
## Structure du projet
```
design-to-pack/
├── src/ # App Vue.js
│ ├── assets/css/ # Styles globaux
│ ├── components/ # Composants réutilisables
│ │ ├── comments/ # Système de commentaires
│ │ ├── design-to-light/ # Feature DTL
│ │ ├── inspirations/ # Galerie inspirations
│ │ ├── notifications/ # Notifications
│ │ └── project/ # Composants projet
│ │ ├── cards/ # Cartes par type d'étape
│ │ ├── brief/ # Brief client (moodboard)
│ │ └── virtual-sample/ # Échantillon virtuel 3D
│ ├── router/ # Vue Router
│ ├── stores/ # Pinia stores
│ ├── utils/ # Utilitaires
│ ├── views/ # Pages principales
│ ├── main.js # Point d'entrée
│ └── App.vue # Composant racine
├── public/ # Kirby CMS
│ ├── content/ # Données (flat-file)
│ │ ├── projects/ # Pages projets
│ │ ├── clients/ # Pages clients
│ │ ├── design-to-light/ # Page DTL
│ │ └── inspirations/ # Galerie inspirations
│ ├── site/
│ │ ├── blueprints/ # Schémas de données
│ │ │ ├── pages/ # Blueprints des pages
│ │ │ ├── users/ # Blueprints utilisateurs
│ │ │ └── files/ # Blueprints fichiers
│ │ ├── templates/ # Templates PHP + JSON
│ │ ├── controllers/ # Contrôleurs
│ │ ├── models/ # Modèles PHP (Project, Client)
│ │ ├── plugins/ # Plugins custom
│ │ ├── snippets/ # Fragments réutilisables
│ │ └── config/ # Configuration + routes
│ └── media/ # Fichiers uploadés
├── package.json
├── vite.config.js
└── .gitlab-ci.yml
```
---
## Plugins Kirby custom
### 1. `classes/` - Classes partagées
Classes de données utilisées par comments et notifications.
| Classe | Rôle |
|--------|------|
| `Author` | Auteur (name, email, uuid, role) |
| `Position` | Position x/y + pageIndex (marqueurs sur PDF) |
| `Location` | Localisation (page, file, parent) |
| `PageDetails` | Détails de page |
| `FileDetails` | Détails de fichier |
| `ProjectDetails` | Détails de projet |
### 2. `comments/` - Système de commentaires
Plugin `adrienpayet/kirby4-comments`
**Classes:**
- `BaseComment` - Classe de base
- `Comment` - Commentaire avec replies
- `Reply` - Réponse à un commentaire
**Routes:**
| Route | Fichier | Description |
|-------|---------|-------------|
| `POST /create-comment.json` | `routes/create.php` | Créer un commentaire |
| `POST /update-comment.json` | `routes/update.php` | Modifier un commentaire |
| `POST /delete-comment.json` | `routes/delete.php` | Supprimer un commentaire |
| `POST /reply-comment.json` | `routes/reply.php` | Répondre à un commentaire |
**Stockage:** Les commentaires sont stockés en YAML dans les métadonnées des fichiers.
### 3. `notifications/` - Système de notifications
Plugin `adrienpayet/pdc-notifications`
**Classes:**
- `Notification` - Notification (type, location, text, author, date, readby[])
- `NotificationsPage` - Base pour pages avec notifications (extends Page)
**Méthodes NotificationsPage:**
- `createNotification($data)` - Créer une notification
- `deleteNotification($id)` - Supprimer une notification
- `readNotification($id)` - Marquer comme lue (ajoute userUuid à readby)
- `readAllNotifications()` - Tout marquer comme lu
**Routes:**
| Route | Description |
|-------|-------------|
| `POST /read-notification.json` | Marquer une notification comme lue |
| `POST /read-all-notifications.json` | Tout marquer comme lu |
### 4. `user-projects/` - Projets autorisés par utilisateur
Plugin `adrienpayet/pdc-authorized-projects`
**User methods:**
- `currentProjects()` - Projets actifs (listed) accessibles à l'utilisateur
- `archivedProjects()` - Projets archivés (unlisted) accessibles
Logique: Admin = tous les projets, autres = seulement projets assignés.
### 5. `helpers/` - Fonctions utilitaires
| Fonction | Description |
|----------|-------------|
| `getFileData($file, $preserveQuality)` | Normalise les données fichier (thumb webp, cover, comments) |
| `getGlobalEvaluation($numberedGrade)` | Convertit note numérique en lettre A-E avec mention |
| `processDTLProposals($page)` | Traite les propositions Design to Light |
| `refreshProjectStepsCache($project, $steps)` | Rafraîchit le cache des étapes |
### 6. `icons/` - Icônes custom panel
Plugin `adrienpayet/pochet-icons` - Icônes personnalisées pour le panel Kirby.
### 7. `kql/` - Kirby Query Language
Plugin externe pour requêtes type GraphQL.
### 8. `refresh-cache-button/` - Bouton refresh cache
Plugin externe ajoutant un bouton de rafraîchissement du cache dans le panel.
---
## Modèles de données
### Utilisateurs (3 rôles)
| Rôle | Accès |
|------|-------|
| `admin` | Tous les projets, panel complet |
| `pochet` | Projets assignés uniquement, panel limité |
| `client` | Ses projets uniquement, pas de panel |
### Projet (ProjectPage)
Hérite de `NotificationsPage`.
**Champs principaux:**
- `title`, `status` (draft/listed/unlisted)
- `client` - Lien vers ClientPage
- `currentStep` - Étape courante
- `isDTLEnabled` - Design to Light activé
**Étapes (children):**
1. `client-brief` - Brief client (PDF + moodboard)
2. `proposal` - Proposition commerciale (PDFs)
3. `extended-brief` - Brief étendu
4. `industrial-ideation` - Idéation industrielle (optionnel)
5. `virtual-sample` - Échantillon virtuel (pistes dynamiques + statiques)
6. `physical-sample` - Échantillon physique (médias)
### Client (ClientPage)
- `logo`, `title`
- `projects()` - Tous les projets
- `projectsListed()` / `projectsUnlisted()` - Filtres par statut
---
## Stores Pinia
| Store | Fichier | Rôle |
|-------|---------|------|
| `api` | `stores/api.js` | Communication API (fetch, post, comments, notifications) |
| `user` | `stores/user.js` | Utilisateur courant, permissions |
| `page` | `stores/page.js` | Données de la page courante |
| `projects` | `stores/projects.js` | Liste des projets |
| `dialog` | `stores/dialog.js` | État des modales (contenu, fichier, commentaires) |
| `brief` | `stores/brief.js` | Gestion du brief client |
| `designToLight` | `stores/designToLight.js` | Feature DTL |
| `notifications` | `stores/notifications.js` | Notifications non lues |
| `virtualSample` | `stores/virtualSample.js` | État échantillon virtuel |
| `addImagesModal` | `stores/addImagesModal.js` | Modal ajout images |
| `project` | `stores/project.js` | Utilitaires projet |
---
## Routes Vue
| Path | Vue | Description |
|------|-----|-------------|
| `/` | `Home.vue` | Liste des projets |
| `/login` | `Login.vue` | Authentification |
| `/account` | `Account.vue` | Compte utilisateur |
| `/notifications` | `Notifications.vue` | Centre de notifications |
| `/inspirations` | `Inspirations.vue` | Galerie d'inspirations |
| `/design-to-light` | `DesignToLight.vue` | Feature DTL |
| `/projects/:id` | `Kanban.vue` | Détail projet (kanban) |
| `/projects/:id/client-brief` | `Brief.vue` | Brief client |
| `/projects/:id/extended-brief` | `Brief.vue` | Brief étendu |
---
## API Endpoints
### Authentification
- `POST /login.json` - Connexion (email, password)
- `GET /logout` - Déconnexion
### Pages (JSON)
- `GET /{uri}.json` - Données page + user
### Commentaires
- `POST /create-comment.json`
- `POST /update-comment.json`
- `POST /delete-comment.json`
- `POST /reply-comment.json`
### Notifications
- `POST /read-notification.json`
- `POST /read-all-notifications.json`
### Fichiers
- `POST /upload-pdf.json`
- `POST /upload-images.json`
- `POST /remove-file.json`
### Actions
- `POST /save-page.json`
- `POST /save-file.json`
- `POST /validate-brief.json`
- `POST /toggle-favorite.json`
- `POST /request-project-creation.json`
- `POST /request-optimization-appointment.json`
---
## Design to Light (DTL)
Système d'évaluation avancée des designs de flacons.
**Notation:**
- Note globale : A (8-10), B (6-8), C (4-6), D (2-4), E (0-2)
- Indicateurs : Design global, Bague, Épaule, Colonnes & Arêtes, Pied, Fond de Verre
- Position : Complexité, Poids
**Propositions DTL liées à:**
- Proposition commerciale (PDF)
- Idéation industrielle (PDF)
- Échantillon virtuel - piste dynamique
- Échantillon virtuel - piste statique
---
## Fichiers clés à connaître
### Frontend
- `src/main.js` - Init app
- `src/router/router.js` - Guard + setup
- `src/router/routes.js` - Définition routes
- `src/stores/api.js` - Toute la comm API
- `src/components/Menu.vue` - Navigation latérale
- `src/components/project/DialogWrapper.vue` - Wrapper modales
### Backend
- `public/site/config/config.php` - Routes, hooks, config
- `public/site/controllers/site.php` - Contrôleur principal
- `public/site/models/project.php` - Logique projet
- `public/site/plugins/helpers/index.php` - Fonctions utilitaires
- `public/site/blueprints/pages/project.yml` - Structure projet
---
## Développement local
```bash
# Backend
cd public
composer install
php -S localhost:8888 kirby/router.php
# Frontend
npm install
npm run dev
```
## Build
```bash
npm run build # Production
npm run build:preprod # Staging (avec sourcemaps)
```
---
## Notes importantes
1. **Cache**: Les étapes projet sont cachées. Invalidation automatique via hooks Kirby.
2. **Permissions**: Filtrées côté serveur selon le rôle utilisateur.
3. **Commentaires**: Positionnés en % (x, y) + pageIndex pour les PDFs multi-pages.
4. **Notifications**: Stockées par projet, trackées par user UUID dans `readby[]`.
5. **Virtual Sample**: Pistes dynamiques = pages enfants, pistes statiques = fichiers.
---
## Préférences de code et standards
### Principes généraux
**Clarté avant tout**
- Privilégier des noms de variables et fonctions explicites
- Éviter les commentaires sauf en cas de nécessité absolue
- Le code doit être auto-documenté par des noms clairs
**Organisation du code**
- Factoriser le code en petites fonctions bien nommées
- Éviter les blocs de code longs et complexes dans les hooks de lifecycle
- Une fonction = une responsabilité claire
**Ce qui est considéré comme "bricolage" (à éviter)**
- Paramètres d'URL pour gérer des états applicatifs
- Commentaires qui expliquent ce que fait le code au lieu de nommer correctement
- Abstractions prématurées ou sur-ingénierie
### Style de communication
**Feedback direct**
- Pas de politesses inutiles
- Dire immédiatement si quelque chose ne va pas
- Tester tout de suite et signaler les problèmes
**Qualité attendue**
- Standards élevés sur la qualité du code
- Pas de code médiocre accepté
- Exigence de clarté et d'explicité constante