This commit is contained in:
@@ -1,5 +0,0 @@
|
||||
# Copier ce fichier en .env et adapter les valeurs
|
||||
DB_NAME=househub
|
||||
DB_USER=househub
|
||||
DB_PASS=changeme
|
||||
DB_ROOT_PASS=rootchangeme
|
||||
@@ -35,20 +35,23 @@ Aucun compte par défaut — le premier utilisateur s'inscrit via `/register.php
|
||||
|
||||
HouseHub supporte plusieurs familles indépendantes sur la même instance.
|
||||
|
||||
| URL | Description |
|
||||
|-----|-------------|
|
||||
| URL | Description |
|
||||
| --------------- | ------------------------------------------------------------------- |
|
||||
| `/register.php` | Créer un compte + nouvel espace, ou rejoindre via code d'invitation |
|
||||
| `/login.php` | Connexion |
|
||||
| `/settings.php` | Profil, mot de passe, langue, modules actifs, code d'invitation |
|
||||
| `/admin/` | Panneau d'administration (admin uniquement) |
|
||||
| `/login.php` | Connexion |
|
||||
| `/settings.php` | Profil, mot de passe, langue, modules actifs, code d'invitation |
|
||||
| `/admin/` | Panneau d'administration (admin uniquement) |
|
||||
|
||||
### Inviter quelqu'un dans son espace
|
||||
|
||||
1. Aller sur `/settings.php` → copier le code d'invitation
|
||||
2. La personne va sur `/register.php` → onglet "Rejoindre" → coller le code
|
||||
3. Les deux comptes partagent le même environnement de données
|
||||
|
||||
### Rôle admin
|
||||
|
||||
Le premier utilisateur inscrit doit être promu admin manuellement :
|
||||
|
||||
```sql
|
||||
UPDATE househub_meta.users SET is_admin = 1 WHERE username = 'ton_username';
|
||||
```
|
||||
@@ -59,19 +62,19 @@ UPDATE househub_meta.users SET is_admin = 1 WHERE username = 'ton_username';
|
||||
|
||||
Tous les modules sont activables/désactivables par famille depuis `/settings.php`.
|
||||
|
||||
| Module | Route | Description |
|
||||
|--------|-------|-------------|
|
||||
| 💰 Budget | `/budget.php` | Suivi mensuel, prévisionnel, épargne, import CSV bancaire |
|
||||
| 📅 Calendrier | `/family-calendar.php` | Congés (CP/JRA/JA), modes de garde, planning hebdo, vacances scolaires |
|
||||
| 🗓️ Calendrier iOS | `/calendar-ios.php` | Synchronisation CalDAV avec iPhone/iPad |
|
||||
| 🏖️ Voyages | `/holidays.php` | Roadtrips, cartographie Leaflet, itinéraires OSRM, météo Open-Meteo |
|
||||
| 🎁 Cadeaux | `/gift-list.php` | Listes Noël / anniversaires, intégration Tricount |
|
||||
| 🚗 Garage | `/garage.php` | Véhicules, historique entretiens, pièces détachées |
|
||||
| 🛒 Courses | `/groceries.php` | Liste de courses partagée en temps réel |
|
||||
| ✅ Todo | `/todo.php` | Listes de tâches avec rappels quotidiens via Discord webhook |
|
||||
| 📝 Mémo | `/memo.php` | Notes personnelles / familiales avec éditeur riche |
|
||||
| 🖨️ PrintVault | `/printvault.php` | Gestionnaire de fichiers d'impression 3D (STL, 3MF, GCode) avec viewer Three.js |
|
||||
| 📋 Planka | `/planka.php` | Kanban natif connecté à Planka — boards, listes, cartes, drag & drop, checklist |
|
||||
| Module | Route | Description |
|
||||
| ----------------- | ---------------------- | ------------------------------------------------------------------------------- |
|
||||
| 💰 Budget | `/budget.php` | Suivi mensuel, prévisionnel, épargne, import CSV bancaire |
|
||||
| 📅 Calendrier | `/family-calendar.php` | Congés (CP/JRA/JA), modes de garde, planning hebdo, vacances scolaires |
|
||||
| 🗓️ Calendrier iOS | `/calendar-ios.php` | Synchronisation CalDAV avec iPhone/iPad |
|
||||
| 🏖️ Voyages | `/holidays.php` | Roadtrips, cartographie Leaflet, itinéraires OSRM, météo Open-Meteo |
|
||||
| 🎁 Cadeaux | `/gift-list.php` | Listes Noël / anniversaires, intégration Tricount |
|
||||
| 🚗 Garage | `/garage.php` | Véhicules, historique entretiens, pièces détachées |
|
||||
| 🛒 Courses | `/groceries.php` | Liste de courses partagée en temps réel |
|
||||
| ✅ Todo | `/todo.php` | Listes de tâches avec rappels quotidiens via Discord webhook |
|
||||
| 📝 Mémo | `/memo.php` | Notes personnelles / familiales avec éditeur riche |
|
||||
| 🖨️ PrintVault | `/printvault.php` | Gestionnaire de fichiers d'impression 3D (STL, 3MF, GCode) avec viewer Three.js |
|
||||
| 📋 Planka | `/planka.php` | Kanban natif connecté à Planka — boards, listes, cartes, drag & drop, checklist |
|
||||
|
||||
---
|
||||
|
||||
@@ -117,28 +120,54 @@ Le cron tourne chaque minute et envoie une notification Discord à l'heure exact
|
||||
|
||||
## 🛠️ Stack technique
|
||||
|
||||
| Composant | Technologie |
|
||||
|-----------|-------------|
|
||||
| Backend | PHP 8.2 (Apache) |
|
||||
| Base de données | MariaDB 11 |
|
||||
| Frontend | Vanilla JS, CSS custom (dark mode natif) |
|
||||
| Viewer 3D | Three.js (ES modules via importmap CDN) |
|
||||
| Cartographie | Leaflet + OSRM |
|
||||
| Conteneurisation | Docker + Docker Compose |
|
||||
| Reverse proxy | Traefik |
|
||||
| Internationalisation | FR / CA |
|
||||
| Composant | Technologie |
|
||||
| -------------------- | ---------------------------------------- |
|
||||
| Backend | PHP 8.2 (Apache) |
|
||||
| Base de données | MariaDB 11 |
|
||||
| Frontend | Vanilla JS, CSS custom (dark mode natif) |
|
||||
| Viewer 3D | Three.js (ES modules via importmap CDN) |
|
||||
| Cartographie | Leaflet + OSRM |
|
||||
| Conteneurisation | Docker + Docker Compose |
|
||||
| Reverse proxy | Traefik |
|
||||
| Internationalisation | FR / CA |
|
||||
|
||||
---
|
||||
|
||||
## 🗺️ Roadmap de Variabilisation (Migration Multi-Tenant)
|
||||
|
||||
Afin de transformer complètement l'application héritée de Pacha Family en un produit générique et autonome pour chaque espace familial, les chantiers suivants doivent être menés.
|
||||
|
||||
🟢 Niveau 1 : Facile (Constantes et configurations globales)
|
||||
[ ] Configuration de base : Extraire la devise (CURRENCY) et la zone de vacances scolaires (ZONE_SCOLAIRE) du fichier config.php pour les stocker dans les paramètres d'espace en BDD.
|
||||
[ ] Filtres API Éducation Nationale : Rendre dynamique la zone de l'API (zones LIKE '%Zone C%' dans family-calendar.js) pour s'adapter à la région de chaque foyer.
|
||||
[ ] Identifiant Planka : Variabiliser le project_id Planka par défaut écrit en dur dans planka/api.php.
|
||||
[ ] Suppression des IDs statiques : Supprimer les IDs parents fixes (ID_ALEX = 2, ID_LAIA = 3) dans config.php au profit d'une lecture dynamique basée sur les utilisateurs réels de la famille connectée.
|
||||
|
||||
🟡 Niveau 2 : Intermédiaire (Listes et dictionnaires en dur)
|
||||
[ ] Gestion des membres (Cadeaux) : Dans gift-list.php, remplacer la liste d'enfants ($children) et d'adultes ($baseAdults, $extraAdults) codée en dur par une lecture dynamique des membres du foyer déclarés en BDD.
|
||||
[ ] Occasions festives (Cadeaux) : Rendre configurables les occasions spéciales (TIO, NOEL, ROIS, ANNIV, SANT).
|
||||
[ ] Configuration des catégories (Budget) : Dans budget/views/suivi.php, migrer le tableau $categoriesConfig (FMCG, Essence, École, etc.), leurs couleurs et leurs suggestions de magasins associés vers un stockage paramétrable.
|
||||
[ ] Déductions du Reste à venir (Budget) : Rendre dynamiques les libellés de catégories ciblés pour le calcul automatique du reste à venir (Estimacio escola, Estimation gasolina, etc.).
|
||||
[ ] Types de carburants (Garage) : Variabiliser la liste statique des carburants dans garage.php.
|
||||
|
||||
🔴 Niveau 3 : Complexe (Logique métier et Schéma SQL)
|
||||
[ ] Refonte relationnelle de la répartition (Budget) : Modifier la structure de la table pf_alloc_values pour supprimer les colonnes figées amount_alex et amount_laia et basculer sur un modèle relationnel (alloc_id, user_id, amount) capable de gérer n'importe quel nombre d'adultes (1, 2, 3 ou plus).
|
||||
[ ] Destinations de transferts (Budget) : Rendre dynamiques les cibles de virements prévisionnels (vers L.Pol, vers L.Pep, etc.) en fonction des comptes épargne créés par la famille.
|
||||
[ ] Onglets d'Épargne : Générer dynamiquement les sous-onglets de la vue epargne.php à partir des membres réels au lieu des blocs statiques Alex, Laia et Nens.
|
||||
[ ] Types de Garde (Calendrier) : Supprimer les types d'événements et compteurs codés en dur (OFF_CAROLE, EXTRA_OFF_CAROLE, CENTRE, AVIS, PEP_SICK) pour permettre à chaque foyer de définir ses propres modalités de garde et compteurs de congés associés.
|
||||
[ ] Cycles de Congés : Rendre configurables les mois de début de calcul des droits aux congés (Août pour les CP, date d'anniversaire personnalisée pour les JA) par profil utilisateur.
|
||||
|
||||
---
|
||||
|
||||
## 📌 Versioning
|
||||
|
||||
| Version | Changements |
|
||||
|---------|-------------|
|
||||
| v2.1.0 | Module Planka : Kanban natif connecté à Planka via API proxy PHP |
|
||||
| v2.0.0 | Module PrintVault : viewer 3D STL/3MF/GCode, stockage local, trajectoires GCode illimitées |
|
||||
| v1.5.0 | Modules Todo (rappels Discord), Mémo, Courses (liste partagée) |
|
||||
| v1.4.0 | Synchronisation CalDAV iOS |
|
||||
| v1.3.0 | Optimisation SQL — suppression des requêtes N+1, temps de réponse ÷3 |
|
||||
| v1.2.0 | Modernisation UI — Toasts, confirmations sur-mesure |
|
||||
| v1.1.0 | Refonte expérience mobile (Bottom Sheets) |
|
||||
| v1.0.0 | Version stable initiale — Budget, Calendrier, Voyages, Cadeaux, Garage |
|
||||
| Version | Changements |
|
||||
| ------- | ------------------------------------------------------------------------------------------ |
|
||||
| v2.1.0 | Module Planka : Kanban natif connecté à Planka via API proxy PHP |
|
||||
| v2.0.0 | Module PrintVault : viewer 3D STL/3MF/GCode, stockage local, trajectoires GCode illimitées |
|
||||
| v1.5.0 | Modules Todo (rappels Discord), Mémo, Courses (liste partagée) |
|
||||
| v1.4.0 | Synchronisation CalDAV iOS |
|
||||
| v1.3.0 | Optimisation SQL — suppression des requêtes N+1, temps de réponse ÷3 |
|
||||
| v1.2.0 | Modernisation UI — Toasts, confirmations sur-mesure |
|
||||
| v1.1.0 | Refonte expérience mobile (Bottom Sheets) |
|
||||
| v1.0.0 | Version stable initiale — Budget, Calendrier, Voyages, Cadeaux, Garage |
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
/**
|
||||
* HouseHub OS - Source Extractor 🦙🚀
|
||||
* Génère un fichier Markdown contenant tout le code source du projet.
|
||||
* Idéal pour alimenter une GEM ou un LLM.
|
||||
*/
|
||||
|
||||
// 1. 🚨 SÉCURITÉ : Ne jamais laisser ce fichier accessible publiquement sans protection !
|
||||
// Appelle le script via : https://househub.nas.../extract_source.php?key=TON_MOT_DE_PASSE
|
||||
$secretKey = 'mR83s7MmXbP$jer$9C4HnGkry6xhGL6';
|
||||
|
||||
if (!isset($_GET['key']) || $_GET['key'] !== $secretKey) {
|
||||
http_response_code(403);
|
||||
die("⛔ Accès refusé. Veuillez fournir la clé de sécurité.");
|
||||
}
|
||||
|
||||
// Forcer l'affichage en texte brut dans le navigateur pour un copier-coller facile
|
||||
header('Content-Type: text/plain; charset=utf-8');
|
||||
|
||||
$root = __DIR__;
|
||||
|
||||
// 2. CONFIGURATION DU FILTRAGE
|
||||
// Dossiers à exclure (ne mets pas de slash au début)
|
||||
$excludeDirs = [
|
||||
'.git',
|
||||
'.gitea',
|
||||
'.devtools',
|
||||
'vendor',
|
||||
'node_modules',
|
||||
'assets/img',
|
||||
'modules/holidays/assets/img',
|
||||
'modules/family-calendar/assets/img',
|
||||
'modules/gift-list/assets/img'
|
||||
];
|
||||
|
||||
// Fichiers spécifiques à exclure (Sécurité & Bruit)
|
||||
$excludeFiles = [
|
||||
'.env',
|
||||
'.env.example',
|
||||
'extract_source.php', // On s'exclut soi-même
|
||||
'pachafamily_source.md',
|
||||
'docker-compose.override.yml'
|
||||
];
|
||||
|
||||
// Extensions autorisées (on ignore les images, pdf, zip, etc.)
|
||||
$allowedExtensions = ['php', 'js', 'css', 'sql', 'json', 'yml', 'yaml', 'md', 'sh'];
|
||||
|
||||
// 3. INITIALISATION DU PARCOURS
|
||||
$iterator = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::SELF_FIRST
|
||||
);
|
||||
|
||||
$report = "# 🦙 Source Code HouseHub OS\n\n";
|
||||
$report .= "> *Généré le " . date('Y-m-d H:i:s') . "*\n\n";
|
||||
$report .= "---\n\n";
|
||||
|
||||
// 4. BOUCLE D'EXTRACTION
|
||||
foreach ($iterator as $file) {
|
||||
if ($file->isDir()) continue;
|
||||
|
||||
$filePath = $file->getPathname();
|
||||
$relativePath = str_replace($root . DIRECTORY_SEPARATOR, '', $filePath);
|
||||
$relativePath = str_replace('\\', '/', $relativePath); // Uniformisation Windows/Linux
|
||||
|
||||
// Extraction de l'extension
|
||||
$ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
|
||||
|
||||
// A. Filtrage par dossier
|
||||
$skip = false;
|
||||
foreach ($excludeDirs as $dir) {
|
||||
// Si le chemin commence par ce dossier, ou contient /ce_dossier/
|
||||
if (strpos($relativePath, $dir . '/') === 0 || strpos($relativePath, '/' . $dir . '/') !== false) {
|
||||
$skip = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($skip) continue;
|
||||
|
||||
// B. Filtrage par nom de fichier
|
||||
if (in_array(basename($filePath), $excludeFiles)) continue;
|
||||
|
||||
// C. Filtrage par extension
|
||||
if (!in_array($ext, $allowedExtensions)) continue;
|
||||
|
||||
// 5. LECTURE ET FORMATAGE
|
||||
$content = file_get_contents($filePath);
|
||||
|
||||
if ($content === false) {
|
||||
$content = "// Erreur lors de la lecture de ce fichier.";
|
||||
}
|
||||
|
||||
// Ajustement du tag de langage pour le Markdown
|
||||
$lang = $ext;
|
||||
if ($ext === 'js') $lang = 'javascript';
|
||||
if ($ext === 'yml') $lang = 'yaml';
|
||||
|
||||
$report .= "### 📄 Fichier : `$relativePath`\n";
|
||||
$report .= "```$lang\n";
|
||||
$report .= trim($content) . "\n";
|
||||
$report .= "```\n\n---\n\n";
|
||||
}
|
||||
|
||||
// 6. SORTIE
|
||||
echo $report;
|
||||
Reference in New Issue
Block a user