diff --git a/budget.php b/budget.php index 3f39df9..e9a72f1 100644 --- a/budget.php +++ b/budget.php @@ -4,6 +4,18 @@ require __DIR__ . '/includes/db.php'; require_once __DIR__ . '/includes/i18n.php'; require_login('/login.php'); +// ============================================================================ +// DIAGNOSTIC ONBOARDING (Vérifie si le budget est prêt à être utilisé) +// ============================================================================ +$currentYear = date('Y'); +$hasCategories = ((int)$pdo->query("SELECT COUNT(*) FROM pf_budget_categories")->fetchColumn() > 0); +$hasSalaries = ((int)$pdo->query("SELECT COUNT(*) FROM pf_salary_config WHERE year = $currentYear")->fetchColumn() > 0); +$hasAccounts = ((int)$pdo->query("SELECT COUNT(*) FROM pf_bank_accounts")->fetchColumn() > 0); +$hasBudgetItems = ((int)$pdo->query("SELECT COUNT(*) FROM pf_budget_items")->fetchColumn() > 0); + +// Le minimum vital pour que ça tourne +$isBudgetSetupOk = ($hasCategories && $hasSalaries && $hasAccounts); + // Gestion de l'onglet actif (par défaut 'suivi') $tab = $_GET['tab'] ?? 'suivi'; @@ -15,11 +27,15 @@ require __DIR__ . '/header.php'; ?>
-
-
-

-
@@ -48,7 +64,6 @@ require __DIR__ . '/header.php';
"; + echo "
"; echo "

" . tr('budget_err_file_not_found') . "

"; echo "

" . sprintf(tr('budget_err_file_detail'), htmlspecialchars($tab)) . "

"; echo "
"; @@ -68,937 +83,8 @@ require __DIR__ . '/header.php'; ?>
- - - - \ No newline at end of file + \ No newline at end of file diff --git a/docker/schema_family.sql b/docker/schema_family.sql index db3a2ca..5e1e622 100644 --- a/docker/schema_family.sql +++ b/docker/schema_family.sql @@ -7,6 +7,8 @@ CREATE TABLE IF NOT EXISTS pf_foyer_settings ( id INT AUTO_INCREMENT PRIMARY KEY, currency VARCHAR(10) NOT NULL DEFAULT '€', zone_scolaire VARCHAR(5) NOT NULL DEFAULT 'C', + csv_mapping TEXT DEFAULT NULL, + cares_modes TEXT DEFAULT NULL, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -44,12 +46,14 @@ CREATE TABLE IF NOT EXISTS pf_users ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ─── Personnes ──────────────────────────────────────────────────────────────── -CREATE TABLE `pf_people` ( +CREATE TABLE IF NOT EXISTS `pf_people` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `user_id` int(11) DEFAULT NULL, `role` varchar(50) DEFAULT NULL, + `care_modes` varchar(255) DEFAULT NULL, `color` varchar(7) DEFAULT '#0891b2', + `is_active` TINYINT(1) DEFAULT 1, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -88,10 +92,29 @@ CREATE TABLE IF NOT EXISTS pf_leave_snapshots ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_person_leave_meta ( - id INT AUTO_INCREMENT PRIMARY KEY, - person_id INT NOT NULL UNIQUE, - anniversary_date DATE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + id INT(11) AUTO_INCREMENT PRIMARY KEY, + person_id INT(11) NOT NULL, + leave_type VARCHAR(50) COLLATE utf8mb4_unicode_ci NOT NULL, + method VARCHAR(20) COLLATE utf8mb4_unicode_ci DEFAULT 'FIXED', + allowance DECIMAL(5,2) DEFAULT 0.00, + anniversary_date DATE DEFAULT NULL, + INDEX (person_id), + INDEX (leave_type) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- ─── Types de Congés (Référentiel) ───────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_leave_types ( + id INT(11) AUTO_INCREMENT PRIMARY KEY, + code VARCHAR(20) COLLATE utf8mb4_general_ci NOT NULL, + label VARCHAR(100) COLLATE utf8mb4_general_ci NOT NULL, + default_allowance DECIMAL(5,2) DEFAULT 0.00, + reset_month INT(11) DEFAULT 1, + allow_carry_over TINYINT(1) DEFAULT 0, + UNIQUE KEY code (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT IGNORE INTO pf_leave_types (code, label, default_allowance, reset_month, allow_carry_over) VALUES +('CP', 'Congés Payés', 25.00, 6, 0); CREATE TABLE IF NOT EXISTS pf_calendar_weeks ( id INT AUTO_INCREMENT PRIMARY KEY, @@ -108,87 +131,101 @@ CREATE TABLE IF NOT EXISTS pf_calendar_weeks ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ─── Budget ─────────────────────────────────────────────────────────────────── + +-- NOUVEAU : Table des comptes bancaires +CREATE TABLE IF NOT EXISTS pf_bank_accounts ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + account_type ENUM('checking', 'savings') DEFAULT 'checking', + owner_person_id INT DEFAULT NULL, + is_default TINYINT(1) DEFAULT 0, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (owner_person_id) REFERENCES pf_people(id) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + CREATE TABLE IF NOT EXISTS pf_budget_items ( - id INT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(255) NOT NULL, - amount DECIMAL(10,2) DEFAULT 0, - category VARCHAR(100), - type VARCHAR(50), - payment_day INT DEFAULT NULL, - is_estimate TINYINT(1) DEFAULT 0, - reg_month VARCHAR(7) DEFAULT NULL, + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + amount DECIMAL(10,2) DEFAULT 0, + category VARCHAR(100), + type VARCHAR(50), + payment_day INT DEFAULT NULL, + is_estimate TINYINT(1) DEFAULT 0, + reg_month VARCHAR(7) DEFAULT NULL, mapping_keywords TEXT DEFAULT NULL, - holiday_id INT DEFAULT NULL, - is_checked TINYINT(1) DEFAULT 0, - sort_order INT DEFAULT 0 + holiday_id INT DEFAULT NULL, + is_checked TINYINT(1) DEFAULT 0, + sort_order INT DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_expenses ( - id INT AUTO_INCREMENT PRIMARY KEY, - date_exp DATE NOT NULL, - gestion_month VARCHAR(10) NOT NULL, - category VARCHAR(100), - label VARCHAR(255), - amount DECIMAL(10,2) DEFAULT 0, - import_ref VARCHAR(255) DEFAULT NULL, + id INT AUTO_INCREMENT PRIMARY KEY, + date_exp DATE NOT NULL, + gestion_month VARCHAR(10) NOT NULL, + category VARCHAR(100), + label VARCHAR(255), + amount DECIMAL(10,2) DEFAULT 0, + import_ref VARCHAR(255) DEFAULT NULL, budget_item_id INT DEFAULT NULL, - holiday_id INT DEFAULT NULL + holiday_id INT DEFAULT NULL, + salary_id INT DEFAULT NULL -- 🔥 AJOUT : Lien vers le salaire configuré ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_alloc_categories ( - id INT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(100) NOT NULL, - target DECIMAL(10,2) DEFAULT 0.00, + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + target DECIMAL(10,2) DEFAULT 0.00, transfer_dest VARCHAR(50) DEFAULT NULL, - holiday_id INT DEFAULT NULL, - sort_order INT DEFAULT 0 + holiday_id INT DEFAULT NULL, + sort_order INT DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_alloc_values ( - id INT AUTO_INCREMENT PRIMARY KEY, - month_date VARCHAR(10) NOT NULL, - cat_id INT NOT NULL, - person_id INT NOT NULL, - amount DECIMAL(10,2) DEFAULT 0.00, + id INT AUTO_INCREMENT PRIMARY KEY, + month_date VARCHAR(10) NOT NULL, + cat_id INT NOT NULL, + person_id INT NOT NULL, + amount DECIMAL(10,2) DEFAULT 0.00, UNIQUE KEY uq_alloc_person (month_date, cat_id, person_id), FOREIGN KEY (person_id) REFERENCES pf_people(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_savings ( - id INT AUTO_INCREMENT PRIMARY KEY, - owner VARCHAR(50) NOT NULL, + id INT AUTO_INCREMENT PRIMARY KEY, + owner VARCHAR(50) NOT NULL, month_date VARCHAR(10) NOT NULL, - category VARCHAR(100) NOT NULL, - amount DECIMAL(10,2) DEFAULT 0, - holiday_id INT DEFAULT NULL + category VARCHAR(100) NOT NULL, + amount DECIMAL(10,2) DEFAULT 0, + holiday_id INT DEFAULT NULL, + UNIQUE KEY uq_savings (owner, month_date, category) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_bank_snapshots ( - id INT AUTO_INCREMENT PRIMARY KEY, + id INT AUTO_INCREMENT PRIMARY KEY, snapshot_date DATE NOT NULL, - amount DECIMAL(12,2) DEFAULT 0 + amount DECIMAL(12,2) DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_salary_config ( - id INT AUTO_INCREMENT PRIMARY KEY, - year INT NOT NULL, - person VARCHAR(50) NOT NULL, - salary DECIMAL(10,2) DEFAULT 0, - mensualite DECIMAL(10,2) DEFAULT 0, - frais_func DECIMAL(10,2) DEFAULT 0, - eco_perso DECIMAL(10,2) DEFAULT 0, - eco_family DECIMAL(10,2) DEFAULT 0, + id INT AUTO_INCREMENT PRIMARY KEY, + year INT NOT NULL, + person VARCHAR(50) NOT NULL, + salary DECIMAL(10,2) DEFAULT 0, + mensualite DECIMAL(10,2) DEFAULT 0, + frais_func DECIMAL(10,2) DEFAULT 0, + eco_perso DECIMAL(10,2) DEFAULT 0, + eco_family DECIMAL(10,2) DEFAULT 0, UNIQUE KEY uq_salary (year, person) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS pf_import_rules ( - id INT AUTO_INCREMENT PRIMARY KEY, - keyword VARCHAR(255) NOT NULL UNIQUE, + id INT AUTO_INCREMENT PRIMARY KEY, + keyword VARCHAR(255) NOT NULL UNIQUE, category VARCHAR(100) NOT NULL, budget_item_id INT(11) NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - CREATE TABLE IF NOT EXISTS `pf_advances` ( `id` int(11) NOT NULL AUTO_INCREMENT, `advance_date` date NOT NULL, @@ -214,11 +251,7 @@ CREATE TABLE IF NOT EXISTS pf_budget_categories ( -- Insertion des catégories de base pour toute nouvelle famille INSERT IGNORE INTO pf_budget_categories (code, label, type, color, icon) VALUES ('INCOME', 'Revenus', 'Income', '#10b981', '💵'), -('FMCG', 'Alimentation & Courses', 'Expense', '#3b82f6', '🛒'), -('FUEL', 'Carburant', 'Expense', '#f59e0b', '⛽'), -('FIXED', 'Charges Fixes', 'Expense', '#ef4444', '🏢'), -('SCHOOL', 'École & Garde', 'Expense', '#a855f7', '🎒'), -('SAVINGS', 'Épargne', 'Expense', '#8b5cf6', '🐷'); +('FIXED', 'Charges Fixes', 'Expense', '#ef4444', '🏢'); -- ─── Notes / Memo ───────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS pf_notes ( @@ -308,16 +341,42 @@ CREATE TABLE IF NOT EXISTS pf_geocode_cache ( -- ─── Cadeaux ────────────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS pf_gifts ( - id INT AUTO_INCREMENT PRIMARY KEY, - year INT NOT NULL, - adult_name VARCHAR(100) NOT NULL, - payer_name VARCHAR(100), - child_name VARCHAR(100) NOT NULL, - occasion VARCHAR(50) NOT NULL, + id INT(11) AUTO_INCREMENT PRIMARY KEY, + year INT(11) NOT NULL, + adult_name VARCHAR(100) NOT NULL, + payer_name VARCHAR(100) DEFAULT NULL, + child_name VARCHAR(100) NOT NULL, + occasion VARCHAR(50) NOT NULL, gift_description TEXT NOT NULL, - product_link VARCHAR(500) DEFAULT NULL, - amount DECIMAL(8,2) DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + product_link VARCHAR(500) DEFAULT NULL, + amount DECIMAL(8,2) DEFAULT 0.00 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS pf_gift_occasions ( + id INT(11) AUTO_INCREMENT PRIMARY KEY, + code VARCHAR(50) NOT NULL UNIQUE, + name VARCHAR(100) NOT NULL, + icon VARCHAR(20) DEFAULT '🎁', + month_date VARCHAR(5) DEFAULT NULL, + is_active TINYINT(1) DEFAULT 1, + sort_order INT DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT IGNORE INTO pf_gift_occasions (code, name, icon, month_date, is_active, sort_order) VALUES +('XMAS', 'Noël', '🎄', '12-25', 1, 1), +('BIRTHDAY', 'Anniversaire', '🎂', NULL, 1, 2), +('OTHER', 'Autre', '🎁', NULL, 1, 99); + +-- Table des règles (Qui offre à Qui) +CREATE TABLE IF NOT EXISTS pf_gift_rules ( + id INT(11) AUTO_INCREMENT PRIMARY KEY, + adult_person_id INT(11) NOT NULL, + child_person_id INT(11) NOT NULL, + occasion_id INT(11) NOT NULL, + INDEX (adult_person_id), + INDEX (child_person_id), + INDEX (occasion_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- ─── Garage Manager ─────────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS pf_vehicles ( diff --git a/family-calendar.php b/family-calendar.php index 40ace16..ce996ef 100644 --- a/family-calendar.php +++ b/family-calendar.php @@ -29,7 +29,7 @@ foreach ($familyPeople as $p) { } // 2. Modes de garde (globaux du foyer, pour synchroniser avec le JS) -$stmtFoyer = $pdo->query("SELECT care_modes FROM pf_foyer_settings LIMIT 1"); +$stmtFoyer = $pdo->query("SELECT care_modes, zone_scolaire FROM pf_foyer_settings LIMIT 1"); $foyerData = $stmtFoyer->fetch(PDO::FETCH_ASSOC); $activeCareModes = json_decode($foyerData['care_modes'] ?? '[]', true); if (!is_array($activeCareModes)) $activeCareModes = []; @@ -45,6 +45,38 @@ foreach ($dbLeaves as $l) { } $allLeaveTypes = array_keys($allLeaveTypes); +// ========================================== +// VÉRIFICATIONS D'INTÉGRITÉ (ALERTES) +// ========================================== +$calendarAlerts = []; + +// 1. Aucun membre adulte/parent configuré +if (empty($parents)) { + $calendarAlerts[] = "Aucun adulte configuré. Rendez-vous dans les Paramètres Généraux de HouseHub pour ajouter les membres du foyer."; +} + +// 2. Enfants présents, mais aucun mode de garde global défini +if (!empty($kids) && empty($activeCareModes)) { + $calendarAlerts[] = "Modes de garde manquants. Vous avez des enfants, mais aucun mode de garde n'est défini. Cliquez sur l'icône ⚙️ (Paramètres du calendrier) pour les ajouter."; +} + +// 3. Référentiel des types de congés vide +try { + $countLeaveTypes = $pdo->query("SELECT COUNT(*) FROM pf_leave_types")->fetchColumn(); + if ($countLeaveTypes == 0) { + $calendarAlerts[] = "Types de congés manquants. Le catalogue des congés (CP, RTT...) est vide. Ajoutez-les dans les paramètres généraux."; + } +} catch (Exception $e) { + // Si la table n'existe pas encore + $calendarAlerts[] = "Table des congés manquante. Veuillez mettre à jour la base de données."; +} + +// 4. Zone scolaire manquante (si tu l'as stockée dans pf_foyer_settings) +$zoneScolaire = $foyerData['zone_scolaire'] ?? null; +if (empty($zoneScolaire)) { + $calendarAlerts[] = "Zone scolaire non définie. Cliquez sur l'icône ⚙️ pour configurer votre zone afin d'afficher les vacances scolaires."; +} + $pageTitle = tr('fc_page_title'); $activePage = "family-calendar"; $mainClass = "pf-family-calendar"; @@ -77,6 +109,20 @@ require __DIR__ . '/header.php';
+ +
+
⚠️
+
+

Configuration incomplète

+ +
+
+ +
@@ -155,61 +201,120 @@ require __DIR__ . '/header.php';
-
-
-

⚙️

- -
+
+ +
+

⚙️

+ +
-
- - -
+
+ + +
-
+
-
-
-
- - - -
+
+ + + +
+ + + +
-
- +
+ + +
- +
-
- -
- - -
- -
- - + + +
+
diff --git a/gift-list.php b/gift-list.php index 81b7bdf..5734948 100644 --- a/gift-list.php +++ b/gift-list.php @@ -15,27 +15,24 @@ $activePage = "gift-list"; $mainClass = "pf-gift-list"; $pageCss = "/modules/gift-list/gift-list.css"; -// --- 2. RÉCUPÉRATION DYNAMIQUE DES DONNÉES (Multi-tenant) --- -$stmt = $pdo->query("SELECT name FROM pf_people WHERE role = 'enfant' AND is_active = 1 ORDER BY name ASC"); +// --- 2. RÉCUPÉRATION DYNAMIQUE DES DONNÉES --- +// On inclut les enfants du foyer ET les proches enfants +$stmt = $pdo->query("SELECT name FROM pf_people WHERE role IN ('enfant', 'proche_enfant') ORDER BY name ASC"); $children = $stmt->fetchAll(PDO::FETCH_COLUMN) ?: ['Aucun enfant configuré']; -$stmt = $pdo->query("SELECT name FROM pf_people WHERE role NOT IN ('enfant', 'nounou') AND is_active = 1 ORDER BY name ASC"); +// On inclut les adultes du foyer ET les proches adultes (On exclut nounou et les enfants) +$stmt = $pdo->query("SELECT name FROM pf_people WHERE role NOT IN ('enfant', 'proche_enfant', 'nounou') ORDER BY name ASC"); $allAdultsList = $stmt->fetchAll(PDO::FETCH_COLUMN) ?: ['Aucun adulte configuré']; -$stmt = $pdo->query("SELECT code, name, month_date FROM pf_gift_occasions WHERE is_active = 1 ORDER BY month_date ASC, id ASC"); +// On récupère toutes les occasions (avec l'icône) +$stmt = $pdo->query("SELECT code, name, icon, month_date FROM pf_gift_occasions WHERE is_active = 1 ORDER BY sort_order ASC, month_date ASC, id ASC"); $activeOccasions = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($activeOccasions)) { - $activeOccasions = [['code' => 'DEMO', 'name' => 'Fête par défaut', 'month_date' => null]]; + $activeOccasions = [['code' => 'DEMO', 'name' => 'Fête par défaut', 'icon' => '🎁', 'month_date' => null]]; } $allowedOccasionCodes = array_column($activeOccasions, 'code'); -$occasionIcons = [ - 'TIO' => '/modules/gift-list/assets/img/tio.png', 'NOEL' => '/modules/gift-list/assets/img/santa.png', - 'ROIS' => '/modules/gift-list/assets/img/reis.png', 'ANNIV' => '/modules/gift-list/assets/img/corona.png', - 'SANT' => '/modules/gift-list/assets/img/sant.png' -]; - // --- 3. CHARGEMENT DES CADEAUX --- $inMarks = implode(',', array_fill(0, count($allowedOccasionCodes), '?')); $sql = "SELECT * FROM pf_gifts WHERE year = ? AND occasion IN ($inMarks) ORDER BY occasion ASC, child_name ASC, adult_name ASC"; @@ -43,8 +40,8 @@ $stmt = $pdo->prepare($sql); $stmt->execute(array_merge([$year], $allowedOccasionCodes)); $gifts = $stmt->fetchAll(PDO::FETCH_ASSOC); -$data = []; -$adultsInView = []; +$data = []; +$adultsInView = []; foreach ($gifts as $g) { $data[$g['occasion']][$g['child_name']]['gifts'][] = $g; @@ -78,7 +75,7 @@ for ($i = 0; $i < $countPeople; $i++) { for ($j = $i + 1; $j < $countPeople; $j++) { $a = $people[$i]; $b = $people[$j]; $net = $matrix[$a][$b] - $matrix[$b][$a]; - if ($net > 0.01) { $settlements[] = ['from' => $a, 'to' => $b, 'amount' => $net]; } + if ($net > 0.01) { $settlements[] = ['from' => $a, 'to' => $b, 'amount' => $net]; } elseif ($net < -0.01) { $settlements[] = ['from' => $b, 'to' => $a, 'amount' => -$net]; } } } @@ -87,22 +84,26 @@ require __DIR__ . '/header.php'; ?>
- +
-

🎁

- +
+

🎁

+ +
🔍 - +
👦
@@ -117,7 +118,7 @@ require __DIR__ . '/header.php';
@@ -128,29 +129,27 @@ require __DIR__ . '/header.php';
-

- - - - 🎀 - +

- [], 'totals' => []]; ?>

👦

- @@ -171,7 +170,7 @@ require __DIR__ . '/header.php';

- + 🔗

👤 @@ -197,15 +196,15 @@ require __DIR__ . '/header.php';
-

⚖️

- +

⚖️

+

  • - à +
  • @@ -226,7 +225,7 @@ require __DIR__ . '/header.php'; - 0 ? 'gift-cell-danger' : 'gift-cell-muted'; @@ -242,26 +241,27 @@ require __DIR__ . '/header.php';
+

Cadeau

- +
- +
- +
- -