From cdd2abaa96819548a6eb3a6b58d4959f095240d7 Mon Sep 17 00:00:00 2001 From: "fefe.clochette" Date: Mon, 4 May 2026 18:19:42 +0200 Subject: [PATCH] Centralisation des constantes --- README.md | 76 +- family-calendar.php | 16 +- generate_prompt.php | 72 + global.css | 36 + header.php | 65 +- includes/auth.php | 10 +- includes/config.php | 8 + includes/db.php | 4 +- index.php | 2 + modules/budget/views/budget_prev.php | 45 +- modules/budget/views/suivi.php | 29 +- modules/family-calendar/family-calendar.css | 105 +- modules/family-calendar/family-calendar.js | 28 +- pachafamily_source.md | 16038 ++++++++++++++++++ 14 files changed, 16391 insertions(+), 143 deletions(-) create mode 100644 generate_prompt.php create mode 100644 includes/config.php create mode 100644 pachafamily_source.md diff --git a/README.md b/README.md index 72949ab..3fa3bd4 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,58 @@ -# 🦙 PachaFamily - Dashboard Familial Sur-Mesure +🦙 PachaFamily OS +Système de gestion familiale sur-mesure : Budget, Calendrier, Voyages et Cadeaux. -PachaFamily est une application web privée de gestion familiale. Développée sans framework lourd (Vanilla JS / PHP Natif), elle garantit des performances optimales, une maintenance simplifiée et une personnalisation totale. +📝 Présentation du projet +PachaFamily est une application web privée conçue pour centraliser l'organisation de la tribu. Elle repose sur une stack légère (PHP natif / Vanilla JS) pour garantir rapidité et portabilité, avec un support complet de l'internationalisation (FR/CA). -## 🌟 Modules & Fonctionnalités +🛠️ Fonctionnalités Principales +💰 Module Budget +Suivi Mensuel : Interface de gestion des dépenses réelles avec import CSV bancaire et catégorisation automatique. -### 💰 1. Module Budget (`/modules/budget/`) +Budget Prévisionnel : Planification des revenus et répartition automatique vers les différents comptes (Commune, Livrets, Épargne). -Gestion asynchrone (SPA-like) des finances de la famille. +Épargne : Visualisation des soldes bancaires et ventilation par postes de dépenses avec mode "Addition Rapide". -- **Suivi Mensuel** : Saisie rapide des dépenses avec répartition automatique (Alex/Laia/Commun). -- **Budget Prévisionnel** : Configuration des salaires, charges fixes, et calcul des restes à vivre. Mode "Calculatrice" flottant intégré. -- **Épargne** : Suivi des cagnottes par personne et par catégorie (Vacances, Nens, Perso). -- **Récapitulatif** : Bilan annuel (À venir). +📅 Calendrier Familial +Planning Hebdomadaire : Gestion visuelle des modes de garde, des congés enfants et de la maladie. -### 📅 2. Module Calendrier (`/modules/family-calendar/`) +Gestion des Congés (CP/JRA/JA) : Calcul automatique des soldes restants avec snapshots de correction. -Agenda partagé pour toute la famille. +Vacances Scolaires : Intégration automatique via l'API Data.Education (Zone C). -- Affichage des événements et vacances scolaires. -- Gestion des jours de congés avec compteurs annuels par personne. +🏖️ Holidays & Roadtrips +Gestion de Voyages : Planification avec statuts (Brouillon, Confirmé, Terminé). -### 🌴 3. Module Voyages (`/modules/holidays/`) +Moteur de Roadtrip : Cartographie interactive (Leaflet), itinéraires (OSRM) et gestion des étapes. -Planificateur de roadtrips et vacances. +Météo Intelligente : Prévisions réelles ou archives historiques (Open-Meteo). -- **Cartographie** : Intégration de Leaflet.js. -- **Itinéraires** : Calcul des trajets via OSRM et géocodage via Nominatim. -- Checkpoints, notes et liaisons directes avec le budget d'épargne. +🚀 Roadmap d'Optimisation & Debug (Incrémental) +Étape 1 : Fondations & Robustesse (Terminé ✅) +[x] Moteur AJAX : Création de pachaFetch pour gérer proprement le JSON et les erreurs PHP. -### 🎁 4. Module Cadeaux (`/modules/gift-list/`) +[x] Correction "Action" : Sécurisation des formulaires via getAttribute('action'). -Listes de souhaits pour les événements (Noël, Anniversaires, Rois Mages...). +[x] Centralisation : Création de config.php pour les IDs (Alex/Laia) et constantes globales. ---- +Étape 2 : UX & Mobile (En cours 🏃‍♂️) +[ ] Harmonisation Mobile : Généralisation des "Bottom Sheets" pour les modales sur smartphone. -## 🚀 Plan d'Optimisation & Debugging (Roadmap) +[ ] Z-Index Master : Audit des priorités d'affichage des menus contextuels. -Cette section trace les étapes pour épurer la dette technique et optimiser l'application. +Étape 3 : Performance & Backend +[ ] Audit SQL : Remplacement des requêtes en boucle par des jointures. -### 🟢 Phase 1 : Quick Wins (Gains rapides) +[ ] Cache Cleanup : Script de nettoyage pour le cache de géocodage. -- [x] **Refonte Asynchrone Budget** : Remplacement des formulaires classiques par des appels `fetch()` silencieux sur `suivi.php`, `budget_prev.php` et `epargne.php`. -- [ ] **Nettoyage des Vues** : Extraire le JavaScript et le CSS encore présents dans les fichiers `.php` vers leurs fichiers `.js` et `.css` dédiés. -- [ ] **Corrections des liens GET** : Remplacer les `` par des `
- - - +
+
+ + - - - -
+ + + + +
diff --git a/generate_prompt.php b/generate_prompt.php new file mode 100644 index 0000000..f6898f0 --- /dev/null +++ b/generate_prompt.php @@ -0,0 +1,72 @@ + *Généré le " . date('Y-m-d H:i:s') . "*\n\n"; + +$iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($rootDir, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::SELF_FIRST +); + +$fileCount = 0; + +foreach ($iterator as $file) { + if ($file->isFile()) { + // Chemin relatif propre + $relativePath = str_replace($rootDir . DIRECTORY_SEPARATOR, '', $file->getPathname()); + $relativePath = str_replace('\\', '/', $relativePath); // Uniformiser pour Windows + + // Vérification des dossiers ignorés + $skip = false; + foreach ($ignoredDirs as $ignored) { + if (strpos($relativePath, $ignored) === 0) { + $skip = true; + break; + } + } + if ($skip) continue; + + // Vérification de l'extension + $ext = strtolower($file->getExtension()); + if (!in_array($ext, $allowedExtensions)) continue; + + // On ignore ce script lui-même + if ($file->getFilename() === 'generate_prompt.php') continue; + + // Lecture du contenu + $content = file_get_contents($file->getPathname()); + + // Détermination du langage pour le bloc Markdown + $lang = $ext === 'php' ? 'php' : ($ext === 'js' ? 'javascript' : $ext); + + // Formatage pour l'IA + $output .= "### 📄 Fichier : `" . $relativePath . "`\n"; + $output .= "```" . $lang . "\n"; + $output .= $content . "\n"; + $output .= "```\n\n"; + $output .= "---\n\n"; + + $fileCount++; + } +} + +file_put_contents($outputFile, $output); + +echo "
"; +echo "

✅ Succès !

"; +echo "

Le fichier pachafamily_source.md a été généré à la racine de ton projet.

"; +echo "

$fileCount fichiers de code ont été fusionnés.

"; +echo "

Tu peux maintenant donner ce fichier à ta Gem PachaFamily !

"; +echo "
"; +?> \ No newline at end of file diff --git a/global.css b/global.css index bd12495..855fb1d 100644 --- a/global.css +++ b/global.css @@ -362,4 +362,40 @@ body.no-scroll { .pf-mobile-logout { color: var(--danger); } + /* ✅ Transformation de toutes les modales en "Bottom Sheets" */ + .pf-modal { + align-items: flex-end; /* Aligne la modale en bas */ + padding: 0; + } + + .pf-modal-content { + width: 100% !important; + max-width: none !important; + border-radius: 24px 24px 0 0 !important; /* Arrondi seulement en haut */ + padding: 24px 20px !important; + padding-bottom: env( + safe-area-inset-bottom, + 30px + ) !important; /* Gère l'encoche iPhone */ + transform: translateY(100%); + animation: slideUpSheet 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; + max-height: 92vh; /* Laisse un petit espace en haut */ + } + + /* Barre de drag visuelle en haut de la modale */ + .pf-modal-content::before { + content: ""; + display: block; + width: 40px; + height: 5px; + background: #cbd5e1; + border-radius: 10px; + margin: -10px auto 20px auto; + } + + @keyframes slideUpSheet { + to { + transform: translateY(0); + } + } } diff --git a/header.php b/header.php index 0acbfe2..9539b98 100644 --- a/header.php +++ b/header.php @@ -92,30 +92,63 @@ $currentLang = $_SESSION['app_lang'] ?? 'fr'; \ No newline at end of file + + /** + * pachaFetch : Utilitaire de requête robuste + */ + async function pachaFetch(url, options = {}) { + const finalUrl = url.startsWith('/') ? url.substring(1) : url; + + options.credentials = 'same-origin'; + options.headers = { + ...options.headers, + 'Accept': 'application/json', + 'X-Requested-With': 'XMLHttpRequest' + }; + + try { + const response = await fetch(finalUrl, options); + const rawText = await response.text(); + + try { + return JSON.parse(rawText); + } catch (jsonErr) { + console.error("Réponse corrompue (HTML reçu au lieu de JSON) :", rawText); + throw new Error("Erreur serveur : format JSON invalide."); + } + } catch (err) { + console.error(`Erreur pachaFetch [${finalUrl}] :`, err); + throw err; + } + } + \ No newline at end of file diff --git a/includes/auth.php b/includes/auth.php index be56e31..0a68858 100644 --- a/includes/auth.php +++ b/includes/auth.php @@ -17,10 +17,14 @@ function require_login(?string $loginPage = '/login.php'): void } if (empty($_SESSION['user'])) { - // URL de la page courante (ex: /gift-list.php?foo=bar) - $currentUrl = $_SERVER['REQUEST_URI'] ?? '/'; + if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) { + header('Content-Type: application/json'); + http_response_code(401); + echo json_encode(['success' => false, 'error' => 'Session expirée. Veuillez vous reconnecter.']); + exit; + } - // On redirige vers la page de login en ajoutant ?redirect=... + $currentUrl = $_SERVER['REQUEST_URI'] ?? '/'; $redirectParam = urlencode($currentUrl); $target = ($loginPage ?? '/login.php') . '?redirect=' . $redirectParam; diff --git a/includes/config.php b/includes/config.php new file mode 100644 index 0000000..56681fc --- /dev/null +++ b/includes/config.php @@ -0,0 +1,8 @@ + - 'Alex', ID_LAIA => 'Laia']; + + foreach ($family_members as $id => $p): $d = $salaryConfig[$p]; $restant = $d['salary'] - ($d['mensualite'] + $d['frais_func'] + $d['eco_perso'] + $d['eco_family']); - $borderColor = ($p === 'Alex') ? '#0891b2' : '#f59e0b'; + $borderColor = ($id === ID_ALEX) ? '#0891b2' : '#f59e0b'; ?> @@ -399,7 +403,7 @@ function getTranslatedMonthName($dateString) { -