diff --git a/christmas-list.php b/christmas-list.php index 684a74f..7e9e5af 100644 --- a/christmas-list.php +++ b/christmas-list.php @@ -153,18 +153,33 @@ foreach ($gifts as $gift) { - - - - - - 0): ?> - ( €) + +
+ + + + + + + 0): ?> + ( €) + +
+ + + + (pagat per ) + + @@ -222,6 +237,103 @@ foreach ($gifts as $gift) { + + + + + + payer) + $matrix = []; + foreach ($people as $p1) { + foreach ($people as $p2) { + if (!isset($matrix[$p1])) $matrix[$p1] = []; + $matrix[$p1][$p2] = 0.0; + } + } + + foreach ($gifts as $g) { + $adult = $g['adult_name']; + $payer = $g['payer_name'] ?? $g['adult_name']; + $amt = (float)$g['amount']; + if ($amt > 0 && $adult !== $payer) { + $matrix[$adult][$payer] += $amt; + } + } + + // Net pairwise (A<->B) + $settlements = []; // [ [from, to, amount], ... ] + for ($i = 0; $i < count($people); $i++) { + for ($j = $i + 1; $j < count($people); $j++) { + $a = $people[$i]; + $b = $people[$j]; + $net = $matrix[$a][$b] - $matrix[$b][$a]; + if ($net > 0.009) { + $settlements[] = [$a, $b, $net]; // a doit à b + } elseif ($net < -0.009) { + $settlements[] = [$b, $a, -$net]; // b doit à a + } + } + } + ?> + +
+

Tricount

+ +
+ + + + + + + + + + + + + + + 0 ? 'cl-mtx-owe' : 'cl-mtx-empty'); + ?> + + + + + +
+ Deutor ↓ + Creditor → +
+
+ +

Liquidacions

+ +

Cap deute pendent.

+ + + +
+ + + + @@ -269,25 +381,25 @@ document.addEventListener('DOMContentLoaded', function () { const cancelBtn = modal.querySelector('.clm-cancel'); document.querySelectorAll('.cl-child-add-btn').forEach(function (btn) { - btn.addEventListener('click', function () { - const year = btn.getAttribute('data-year'); - const child = btn.getAttribute('data-child'); - const occasion = btn.getAttribute('data-occasion'); - - modal.classList.add('cl-open'); - - // Remplir les champs cachés - document.getElementById('clm-year').value = year; - document.getElementById('clm-child').value = child; - document.getElementById('clm-occasion').value = occasion; - - // Reset des champs visibles - document.getElementById('clm-adult').selectedIndex = 0; - document.getElementById('clm-gift').value = ''; - document.getElementById('clm-amount').value = ''; - document.getElementById('clm-link').value = ''; - }); + btn.addEventListener('click', function () { + const year = btn.getAttribute('data-year'); + const child = btn.getAttribute('data-child'); + const occasion = btn.getAttribute('data-occasion'); + modal.classList.add('cl-open'); + // Contexte + document.getElementById('clm-year').value = year; + document.getElementById('clm-child').value = child; + document.getElementById('clm-occasion').value = occasion; + // Reset + document.getElementById('clm-adult').selectedIndex = 0; + document.getElementById('clm-gift').value = ''; + document.getElementById('clm-amount').value = ''; + document.getElementById('clm-link').value = ''; + // Titre dynamique + const titleEl = document.getElementById('cl-modal-title'); + titleEl.textContent = `Afegeix un regal per ${child}`; }); +}); function closeModal() { modal.classList.remove('cl-open'); @@ -302,46 +414,51 @@ document.addEventListener('DOMContentLoaded', function () {
diff --git a/global.css b/global.css index beb7905..426207a 100644 --- a/global.css +++ b/global.css @@ -195,7 +195,7 @@ label { } input[type="number"] { - width: 3.1rem; + width: 150px; font-size: 11px; padding: 2px 3px; } diff --git a/modules/christmas-list/christmas-list.css b/modules/christmas-list/christmas-list.css index dc4f1fd..d5fc62b 100644 --- a/modules/christmas-list/christmas-list.css +++ b/modules/christmas-list/christmas-list.css @@ -176,10 +176,25 @@ color: #9ca3af; } -/* Prix du cadeau (dans la cellule) */ +/* Ligne cadeau: description à gauche, montant complètement à droite */ +.cl-gift-line { + display: flex; + align-items: baseline; + gap: 8px; + width: 100%; +} +.cl-gift-desc, +.cl-gift-link { + flex: 1 1 auto; + min-width: 0; /* autorise le wrapping du texte si très long */ +} + .cl-gift-amount { + margin-left: auto; /* pousse le montant à droite */ + text-align: right; color: #627d98; - white-space: nowrap; + white-space: nowrap; /* reste sur une seule ligne */ + min-width: fit-content; } /* Code couleur par enfant (bordure + header/caption) */ @@ -307,13 +322,28 @@ color: #1f2933; } .clm-cancel { - color: #9fb3c8; + color: #d03050; } .clm-cancel:hover, .clm-ok:hover { background: #d9e2ec; } +/* Prix: sans spinners, largeur fixe */ +#clm-amount { + width: 150px; + font-size: 11px; + padding: 2px 3px; + -moz-appearance: textfield; /* Firefox legacy */ + appearance: textfield; /* Standard property (modern browsers) */ +} +/* Chrome/Safari */ +#clm-amount::-webkit-outer-spin-button, +#clm-amount::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + /* ========================================================= */ /* Résumé du budget et Liste détaillée */ /* ========================================================= */ @@ -350,3 +380,32 @@ flex: 0 0 20px; filter: none; /* garde les couleurs des SVG/PNG */ } +/* clarté de lecture */ +.cl-debt-matrix .cl-matrix-corner { + font-size: 11px; + color: #6b7280; + text-align: left; + line-height: 1.2; + min-width: 92px; +} + +.cl-debt-matrix td.cl-mtx-diag { + background-image: repeating-linear-gradient( + 45deg, + #111827 0, + #111827 6px, + #1f2937 6px, + #1f2937 12px + ); + color: transparent; /* masque le “—” pour un rendu propre */ +} + +.cl-debt-matrix td.cl-mtx-owe { + background: #fff7ed; /* léger orange */ + color: #7c2d12; /* brun/orange foncé */ + font-weight: 600; +} + +.cl-debt-matrix td.cl-mtx-empty { + color: #9ca3af; +} diff --git a/modules/christmas-list/save-gift.php b/modules/christmas-list/save-gift.php index 3a31277..e2546d8 100644 --- a/modules/christmas-list/save-gift.php +++ b/modules/christmas-list/save-gift.php @@ -7,32 +7,37 @@ require __DIR__ . '/../../includes/db.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $year = (int)($_POST['year'] ?? date('Y')); $adult_name = trim($_POST['adult_name'] ?? ''); + $payer_name = trim($_POST['payer_name'] ?? ''); $child_name = trim($_POST['child_name'] ?? ''); - $occasion = trim($_POST['occasion'] ?? ''); // TIO / NADAL / REIS + $occasion = trim($_POST['occasion'] ?? ''); $gift_desc = trim($_POST['gift_description'] ?? ''); $product_link = trim($_POST['product_link'] ?? ''); $amount = $_POST['amount'] !== '' ? (float)$_POST['amount'] : 0.0; - if ($adult_name && $child_name && $occasion && $gift_desc) { + if ($payer_name === '') { + $payer_name = $adult_name; + } + + if ($adult_name && $payer_name && $child_name && $occasion && $gift_desc) { $stmt = $pdo->prepare(" INSERT INTO pf_christmas_gifts - (year, adult_name, child_name, occasion, gift_description, product_link, amount) + (year, adult_name, payer_name, child_name, occasion, gift_description, product_link, amount) VALUES - (:year, :adult_name, :child_name, :occasion, :gift_description, :product_link, :amount) + (:year, :adult_name, :payer_name, :child_name, :occasion, :gift_description, :product_link, :amount) "); $stmt->execute([ - 'year' => $year, - 'adult_name' => $adult_name, - 'child_name' => $child_name, - 'occasion' => $occasion, - 'gift_description'=> $gift_desc, - 'product_link' => $product_link ?: null, - 'amount' => $amount, + 'year' => $year, + 'adult_name' => $adult_name, + 'payer_name' => $payer_name, + 'child_name' => $child_name, + 'occasion' => $occasion, + 'gift_description' => $gift_desc, + 'product_link' => $product_link ?: null, + 'amount' => $amount, ]); } } -// Retour à la page Christmas list header('Location: /christmas-list.php'); exit;