Overview
Comment: | Fusion avec trunk |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | dev |
Files: | files | file ages | folders |
SHA1: |
451f4d7e39cf59fc2215cebcbe061616 |
User & Date: | bohwaz on 2020-01-06 12:15:40 |
Other Links: | branch diff | manifest | tags |
Context
2020-01-17
| ||
13:11 | Transformation des ID de comptes en codes vers des ID auto-incrémentés, ouvrant la porte à avoir plusieurs comptes avec le même code check-in: be95994256 user: bohwaz tags: dev | |
2020-01-06
| ||
12:15 | Fusion avec trunk check-in: 451f4d7e39 user: bohwaz tags: dev | |
2020-01-05
| ||
19:05 | Fix: parfois le rappel sélectionné n'était pas forcément le plus proche, dans le cas où plusieurs rappels ont été créés pour une même cotisation check-in: 16a3fb2fbe user: bohwaz tags: trunk, stable | |
2019-12-17
| ||
16:02 | Merge avec trunk check-in: 12a00549c1 user: bohwaz tags: dev | |
Changes
Modified src/include/init.php from [88209f2eb4] to [143fd92132].
︙ | ︙ | |||
121 122 123 124 125 126 127 | if (!defined('Garradin\DATA_ROOT')) { define('Garradin\DATA_ROOT', ROOT); } if (!defined('Garradin\WWW_URI')) { | > | > > > > > > | 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | if (!defined('Garradin\DATA_ROOT')) { define('Garradin\DATA_ROOT', ROOT); } if (!defined('Garradin\WWW_URI')) { try { $uri = \KD2\HTTP::getRootURI(ROOT); } catch (\UnexpectedValueException $e) { echo "<h2>Impossible de détecter le chemin d'accès web de Garradin.</h2>"; echo '<p><a href="https://fossil.kd2.org/garradin/wikiedit?name=Installation">Consulter l\'aide pour configurer manuellement le chemin d\'accès</a></p>'; exit; } if ($uri == '/www/') { $uri = '/'; } else { readfile(ROOT . '/sous-domaine.html'); exit; |
︙ | ︙ |
Modified src/include/lib/Garradin/Config.php from [0feca83ee4] to [a58d9a3e7d].
︙ | ︙ | |||
249 250 251 252 253 254 255 | throw new UserException('Le nom de l\'association ne peut rester vide.'); } break; } case 'accueil_wiki': case 'accueil_connexion': { | | > | > > > > | > | > > | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | throw new UserException('Le nom de l\'association ne peut rester vide.'); } break; } case 'accueil_wiki': case 'accueil_connexion': { $value = trim($value); $name = str_replace('accueil_', '', $key); if ($value === '') { throw new UserException(sprintf('Le nom de la page d\'accueil %s ne peut rester vide.', $name)); } $db = DB::getInstance(); if (!$db->test('wiki_pages', $db->where('uri', $value))) { throw new UserException(sprintf('Le nom de la page d\'accueil %s ne correspond à aucune page existante, merci de la créer auparavant.', $name)); } break; } case 'email_asso': { if (!SMTP::checkEmailIsValid($value, false)) { |
︙ | ︙ |
Modified src/include/lib/Garradin/Install.php from [dc1e4df9ed] to [3140a79786].
︙ | ︙ | |||
103 104 105 106 107 108 109 | 'email' => $email_membre, 'passe' => $passe_membre, 'pays' => 'FR', ]); // Création wiki $page = Wiki::transformTitleToURI($nom_asso); | < < > > | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | 'email' => $email_membre, 'passe' => $passe_membre, 'pays' => 'FR', ]); // Création wiki $page = Wiki::transformTitleToURI($nom_asso); $wiki = new Wiki; $id_page = $wiki->create([ 'titre' => $nom_asso, 'uri' => $page, ]); $wiki->editRevision($id_page, 0, [ 'id_auteur' => $id_membre, 'contenu' => "Bienvenue dans le wiki de ".$nom_asso." !\n\nCliquez sur le bouton « éditer » pour modifier cette page.", ]); // Création page wiki connexion $page = Wiki::transformTitleToURI('Bienvenue'); $id_page = $wiki->create([ 'titre' => 'Bienvenue', 'uri' => $page, ]); $config->set('accueil_wiki', $page); $wiki->editRevision($id_page, 0, [ 'id_auteur' => $id_membre, 'contenu' => "Bienvenue dans l'administration de ".$nom_asso." !\n\n" . "Utilisez le menu à gauche pour accéder aux différentes rubriques.", ]); $config->set('accueil_connexion', $page); // Mise en place compta $comptes = new Compta\Comptes; $comptes->importPlan(); $comptes = new Compta\Categories; $comptes->importCategories(); |
︙ | ︙ |
Modified src/include/lib/Garradin/Membres.php from [25c189b224] to [c6e8b8584f].
︙ | ︙ | |||
318 319 320 321 322 323 324 325 326 327 328 329 330 331 | // Refuser d'envoyer un mail à une adresse invalide, sans vérifier le MX // sinon ça serait trop lent if (!SMTP::checkEmailIsValid($recipient->email, false)) { throw new UserException(sprintf('Adresse email invalide : "%s". Aucun message n\'a été envoyé.', $recipient->email)); } } foreach ($recipients as $recipient) { Utils::sendEmail(Utils::EMAIL_CONTEXT_BULK, $recipient->email, $subject, $message, $recipient->id); } if ($send_copy) | > > > > | 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | // Refuser d'envoyer un mail à une adresse invalide, sans vérifier le MX // sinon ça serait trop lent if (!SMTP::checkEmailIsValid($recipient->email, false)) { throw new UserException(sprintf('Adresse email invalide : "%s". Aucun message n\'a été envoyé.', $recipient->email)); } } if (!count($recipients)) { throw new UserException('Aucun destinataire de la liste ne possède d\'adresse email.'); } foreach ($recipients as $recipient) { Utils::sendEmail(Utils::EMAIL_CONTEXT_BULK, $recipient->email, $subject, $message, $recipient->id); } if ($send_copy) |
︙ | ︙ |
Modified src/include/lib/Garradin/Rappels.php from [cb8851d857] to [7c23d0c913].
︙ | ︙ | |||
155 156 157 158 159 160 161 | $db = DB::getInstance(); $config = Config::getInstance(); // Requête compliquée qui fait tout le boulot // la logique est un JOIN des tables rappels, cotisations, cotisations_membres et membres // pour récupérer la liste des membres qui doivent recevoir une cotisation $query = ' | | | | | | | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | $db = DB::getInstance(); $config = Config::getInstance(); // Requête compliquée qui fait tout le boulot // la logique est un JOIN des tables rappels, cotisations, cotisations_membres et membres // pour récupérer la liste des membres qui doivent recevoir une cotisation $query = ' SELECT *, /* Nombre de jours avant ou après expiration */ (julianday(date()) - julianday(expiration)) AS nb_jours, /* Date de mise en œuvre du rappel */ date(expiration, delai || \' days\') AS date_rappel FROM ( SELECT m.*, MIN(r.delai) AS delai, r.sujet, r.texte, r.id_cotisation, r.id AS id_rappel, m.'.$config->get('champ_identite').' AS identite, CASE WHEN c.duree IS NOT NULL THEN date(cm.date, \'+\'||c.duree||\' days\') WHEN c.fin IS NOT NULL THEN c.fin ELSE 0 END AS expiration FROM rappels AS r INNER JOIN cotisations AS c ON c.id = r.id_cotisation INNER JOIN cotisations_membres AS cm ON cm.id_cotisation = c.id INNER JOIN membres AS m ON m.id = cm.id_membre WHERE /* Inutile de sélectionner les membres sans email */ m.email IS NOT NULL AND m.email != \'\' /* Les cotisations ponctuelles ne comptent pas */ AND (c.fin IS NOT NULL OR c.duree IS NOT NULL) /* Rien nest envoyé aux membres des catégories cachées, logique */ AND m.id_categorie NOT IN (SELECT id FROM membres_categories WHERE cacher = 1) /* Grouper par membre, pour n\'envoyer qu\'un seul rappel par membre/cotise */ GROUP BY m.id, r.id_cotisation ORDER BY r.delai ASC ) WHERE nb_jours >= delai /* Pour ne pas spammer on n\'envoie pas de rappel antérieur au dernier rappel déjà effectué */ AND id NOT IN (SELECT id_membre FROM rappels_envoyes AS re WHERE id_cotisation = re.id_cotisation AND re.date >= date(expiration, delai || \' days\') ) ORDER BY nb_jours DESC;'; $db->begin(); $re = new Rappels_Envoyes; |
︙ | ︙ |
Modified src/templates/admin/membres/cotisations/rappels.tpl from [6fd6dc7342] to [da02475b4a].
1 2 3 4 5 6 7 8 9 10 11 12 13 | {include file="admin/_head.tpl" title="Rappels pour cotisations du membre" current="membres/cotisations" js=1} <ul class="actions"> <li><a href="{$admin_url}membres/fiche.php?id={$membre.id}"><b>{$membre.identite}</b></a></li> {if $session->canAccess('membres', Membres::DROIT_ECRITURE)} <li><a href="{$admin_url}membres/modifier.php?id={$membre.id}">Modifier</a></li> {/if} {if $session->canAccess('membres', Membres::DROIT_ADMIN) && $user.id != $membre.id} <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id}">Supprimer</a></li> {/if} <li class="current"><a href="{$admin_url}membres/cotisations.php?id={$membre.id}">Suivi des cotisations</a></li> </ul> | > > | | > | | | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | {include file="admin/_head.tpl" title="Rappels pour cotisations du membre" current="membres/cotisations" js=1} <ul class="actions"> <li><a href="{$admin_url}membres/fiche.php?id={$membre.id}"><b>{$membre.identite}</b></a></li> {if $session->canAccess('membres', Membres::DROIT_ECRITURE)} <li><a href="{$admin_url}membres/modifier.php?id={$membre.id}">Modifier</a></li> {/if} {if $session->canAccess('membres', Membres::DROIT_ADMIN) && $user.id != $membre.id} <li><a href="{$admin_url}membres/supprimer.php?id={$membre.id}">Supprimer</a></li> {/if} <li class="current"><a href="{$admin_url}membres/cotisations.php?id={$membre.id}">Suivi des cotisations</a></li> </ul> {if !count($cotisations)} <p class="alert">Ce membre n'est lié à aucune cotisation, il n'est donc pas possible de lui associer un rappel de cotisation.</p> {elseif $session->canAccess('membres', Membres::DROIT_ECRITURE)} <form method="post" action="{$self_url}"> <fieldset> <legend>Enregistrer un rappel fait à ce membre</legend> <dl> <dt><label for="f_id_cotisation">Cotisation</label></dt> <dd> <select id="f_id_cotisation" name="id_cotisation"> {foreach from=$cotisations item="co"} <option value="{$co.id}">{$co.intitule} {if $co.nb_jours} — {if $co.a_jour} Expire dans {$co.nb_jours} jours {else} EXPIRÉE depuis {$co.nb_jours} jours {/if} {/if} </option> {/foreach} </select> </dd> <dt><label for="f_date">Date du rappel</label></dt> <dd><input type="date" name="date" id="f_date" required="required" value="{form_field name="date" default=$default_date}" /></dd> |
︙ | ︙ |
Modified src/templates/admin/wiki/page.tpl from [c9d6b7be81] to [29bcb6b0e7].
1 2 3 4 5 6 7 8 | {if !empty($page.titre) && $can_read} {include file="admin/_head.tpl" title=$page.titre current="wiki" js=1} {else} {include file="admin/_head.tpl" title="Wiki" current="wiki"} {/if} <ul class="actions"> {if $session->canAccess('wiki', Membres::DROIT_ECRITURE)} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | {if !empty($page.titre) && $can_read} {include file="admin/_head.tpl" title=$page.titre current="wiki" js=1} {else} {include file="admin/_head.tpl" title="Wiki" current="wiki"} {/if} <ul class="actions"> {if $session->canAccess('wiki', Membres::DROIT_ECRITURE)} <li><a href="{$admin_url}wiki/creer.php?parent={if $page && $config.accueil_wiki != $page.uri}{$page.id}{else}0{/if}"><strong>Créer une nouvelle page</strong></a></li> {/if} {if $can_edit} <li><a href="{$admin_url}wiki/editer.php?id={$page.id}">Éditer</a></li> {/if} {if $can_read && $page && $page.contenu} <li><a href="{$admin_url}wiki/historique.php?id={$page.id}">Historique</a> {if $page.droit_lecture == Wiki::LECTURE_PUBLIC} <li><a href="{$www_url}{$page.uri}{if $has_public_children}/{/if}">Voir sur le site</a> {/if} {/if} {if $can_edit && $session->canAccess('wiki', Membres::DROIT_ADMIN)} <li><a href="{$admin_url}wiki/supprimer.php?id={$page.id}">Supprimer</a></li> {/if} </ul> {if !$can_read} <p class="alert">Vous n'avez pas le droit de lire cette page.</p> {else} |
︙ | ︙ |
Modified src/www/admin/membres/message_collectif.php from [e6c89479ee] to [41976be460].
︙ | ︙ | |||
26 27 28 29 30 31 32 | $recipients = $recherche->search($match[2], ['id', 'email'], true); } catch (UserException $e) { $form->addError($e->getMessage()); } } | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | $recipients = $recherche->search($match[2], ['id', 'email'], true); } catch (UserException $e) { $form->addError($e->getMessage()); } } if (isset($recipients) && !count($recipients)) { $form->addError('Aucun membre dans la liste.'); } } else { $form->addErrror('Destinataires invalides : ' . f('recipients')); |
︙ | ︙ |
Modified src/www/admin/wiki/index.php from [672ae64de6] to [373b4cc240].
︙ | ︙ | |||
13 14 15 16 17 18 19 | $page = $wiki->getByURI($config->get('accueil_wiki')); $page_uri = ''; } if (!$page) { $tpl->assign('uri', $page_uri); | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $page = $wiki->getByURI($config->get('accueil_wiki')); $page_uri = ''; } if (!$page) { $tpl->assign('uri', $page_uri); $tpl->assign('can_edit', false); $tpl->assign('can_read', true); } else { $membres = new Membres; $tpl->assign('can_read', $wiki->canReadPage($page->droit_lecture)); $tpl->assign('can_edit', $wiki->canWritePage($page->droit_ecriture)); |
︙ | ︙ |