Overview
Comment:Implement reminder delete and editing
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 81ac5a6d4518c2ccb49844bc4da8cc9abe2cb73d
User & Date: bohwaz on 2020-11-04 23:59:17
Other Links: branch diff | manifest | tags
Context
2020-11-04
23:59
Fix tabs and some details check-in: a95325c3ba user: bohwaz tags: dev
23:59
Implement reminder delete and editing check-in: 81ac5a6d45 user: bohwaz tags: dev
03:02
Implement reminders list and creation check-in: 84a61ff723 user: bohwaz tags: dev, 1.0.0-alpha4
Changes

Modified src/include/lib/Garradin/Entities/Services/Reminder.php from [89de1d7680] to [fc3cff70bf].

1
2
3
4
5
6
7

8
9
10
11
12
13
14
<?php

namespace Garradin\Entities\Services;

use Garradin\Entity;
use Garradin\ValidationException;
use Garradin\Config;


class Reminder extends Entity
{
	const TABLE = 'services_reminders';

	protected $id;
	protected $id_service;







>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

namespace Garradin\Entities\Services;

use Garradin\Entity;
use Garradin\ValidationException;
use Garradin\Config;
use KD2\DB\EntityManager;

class Reminder extends Entity
{
	const TABLE = 'services_reminders';

	protected $id;
	protected $id_service;
42
43
44
45
46
47
48

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

	public function importForm(array $source = null)
	{
		if (null === $source) {
			$source = $_POST;
		}


		if (!empty($source['delay_type'])) {
			if (1 == $source['delay_type'] && !empty($source['delay_before'])) {
				$source['delay'] = $source['delay_before'];
			}
			elseif (2 == $source['delay_type'] && !empty($source['delay_after'])) {
				$source['delay'] = $source['delay_after'];
			}
			else {
				$source['delay'] = 0;
			}
		}

		parent::importForm($source);
	}
}







>
|

|


|









43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

	public function importForm(array $source = null)
	{
		if (null === $source) {
			$source = $_POST;
		}


		if (isset($source['delay_type'])) {
			if (1 == $source['delay_type'] && !empty($source['delay_before'])) {
				$source['delay'] = (int)$source['delay_before'] * -1;
			}
			elseif (2 == $source['delay_type'] && !empty($source['delay_after'])) {
				$source['delay'] = (int)$source['delay_after'];
			}
			else {
				$source['delay'] = 0;
			}
		}

		parent::importForm($source);
	}
}

Modified src/templates/services/reminders/_form.tpl from [53fb1d3948] to [cf129dd53f].

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
{form_errors}

<form method="post" action="{$self_url}">

	<fieldset>
		<legend>{$legend}</legend>
		<dl>
			{input type="select" name="id_service" options=$services_list label="Activité associée au rappel" required=1 source=$reminder}
			{input type="text" name="subject" required=1 source=$reminder default=$default_subject label="Sujet du message envoyé"}

			<dt><label for="f_delay_type_0">Délai d'envoi</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
			{input type="radio" name="delay_type" value=0 source=$reminder label="Le jour de l'expiration de l'activité"}
			<dd>
				{input type="radio" name="delay_type" value=1 source=$reminder}
				{input type="number" name="delay_before" min=1 max=999 source=$reminder default=30 size=4}
				<label for="f_delay_1">jours <strong>avant</strong> expiration</label>
			</dd>
			<dd>
				{input type="radio" name="delay_type" value=2 source=$reminder}
				{input type="number" name="delay_after" min=1 max=999 source=$reminder default=30 size=4}
				<label for="f_delay_2">jours <strong>après</strong> expiration</label>
			</dd>
			{input type="textarea" name="body" required=1 source=$reminder default=$default_body label="Texte du message envoyé" help="Pour inclure dans le contenu du mail le nom du membre, utilisez #IDENTITE, pour inclure le délai de l'envoi utilisez #NB_JOURS." cols="90" rows="15"}
		</dl>
	</fieldset>

	<p class="submit">











|

|
|



|
|







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
{form_errors}

<form method="post" action="{$self_url}">

	<fieldset>
		<legend>{$legend}</legend>
		<dl>
			{input type="select" name="id_service" options=$services_list label="Activité associée au rappel" required=1 source=$reminder}
			{input type="text" name="subject" required=1 source=$reminder default=$default_subject label="Sujet du message envoyé"}

			<dt><label for="f_delay_type_0">Délai d'envoi</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
			{input type="radio" name="delay_type" value=0 default=$delay_type label="Le jour de l'expiration de l'activité"}
			<dd>
				{input type="radio" name="delay_type" value=1 default=$delay_type}
				{input type="number" name="delay_before" min=1 max=999 default=$delay_before size=4}
				<label for="f_delay_1">jours <strong>avant</strong> expiration</label>
			</dd>
			<dd>
				{input type="radio" name="delay_type" value=2 default=$delay_type}
				{input type="number" name="delay_after" min=1 max=999 size=4 default=$delay_after}
				<label for="f_delay_2">jours <strong>après</strong> expiration</label>
			</dd>
			{input type="textarea" name="body" required=1 source=$reminder default=$default_body label="Texte du message envoyé" help="Pour inclure dans le contenu du mail le nom du membre, utilisez #IDENTITE, pour inclure le délai de l'envoi utilisez #NB_JOURS." cols="90" rows="15"}
		</dl>
	</fieldset>

	<p class="submit">

Modified src/templates/services/reminders/delete.tpl from [d5093f6979] to [93a3e36f8e].

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
39
40
41
42
43
44
{include file="admin/_head.tpl" title="Supprimer un rappel automatique" current="membres/cotisations"}

<nav class="tabs">
    <ul>
        <li><a href="{$admin_url}membres/cotisations/">Cotisations</a></li>
        <li><a href="{$admin_url}membres/cotisations/ajout.php">Saisie d'une cotisation</a></li>
        <li class="current"><a href="{$admin_url}membres/cotisations/gestion/rappels.php">Gestion des rappels automatiques</a></li>
    </ul>
</nav>

{form_errors}

<form method="post" action="{$self_url}">

    <fieldset>
        <legend>Supprimer ce rappel automatique ?</legend>
        <h3 class="warning">
            Êtes-vous sûr de vouloir supprimer le rappel «&nbsp;{$rappel.sujet}&nbsp;» ?
        </h3>
        <dl>
            <dt><label for="f_delete_history">Effacer aussi l'historique des e-mails envoyés par le biais de ce rappel&nbsp;?</label></dt>
            <dd>
                <label>
                    <input type="radio" name="delete_history" value="0" checked="checked" />
                    Non, conserver l'historique
                </label> (toutefois il ne sera plus associé à ce rappel)
            </dd>
            <dd>
                <label>
                    <input type="radio" name="delete_history" value="1" />
                    Oui, effacer l'historique des e-mails envoyés
                </label>
            </dd>
        </dl>
    </fieldset>

    <p class="submit">
        {csrf_field key="delete_rappel_"|cat:$rappel.id}
        <input type="submit" name="delete" value="Supprimer &rarr;" />
    </p>

</form>

{include file="admin/_foot.tpl"}
|

<
<
<
<
<
<
<
|
<

<
|
<
|
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<

<
<

1
2







3

4

5

6

7

















8




9


10
{include file="admin/_head.tpl" title="Supprimer un rappel automatique" current="membres/services"}








{include file="services/_nav.tpl" current="reminders"}



{include file="common/delete_form.tpl"

	legend="Supprimer ce rappel automatique ?"

	warning="Êtes-vous sûr de vouloir supprimer le rappel « %s » ?"|args:$reminder.subject

















	alert="Attention, cela supprimera également l'historique des emails envoyés par ce rappel."}







{include file="admin/_foot.tpl"}

Modified src/templates/services/reminders/edit.tpl from [aa631019ac] to [a097265048].

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{include file="admin/_head.tpl" title="Modifier un rappel automatique" current="membres/cotisations" js=1}

<nav class="tabs">
    <ul>
        <li><a href="{$admin_url}membres/cotisations/">Cotisations</a></li>
        <li><a href="{$admin_url}membres/cotisations/ajout.php">Saisie d'une cotisation</a></li>
        <li class="current"><a href="{$admin_url}membres/cotisations/gestion/rappels.php">Gestion des rappels automatiques</a></li>
    </ul>
</nav>

{form_errors}

<form method="post" action="{$self_url}" id="f_add">

    <fieldset>
        <legend>Modifier un rappel automatique</legend>
        <dl>
            <dt><label for="f_id_cotisation">Cotisation associée</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
            <dd>
                <select name="id_cotisation" id="f_id_cotisation" required="required">
                    <option value="">--</option>
                    {foreach from=$cotisations item="co"}
                    <option value="{$co.id}" {form_field name="id_cotisation" selected=$co.id data=$rappel}>
                        {$co.intitule}
                        — {$co.montant|escape|html_money} {$config.monnaie}
                        — {if $co.duree}pour {$co.duree} jours
                        {elseif $co.debut}
                            du {$co.debut|format_sqlite_date_to_french} au {$co.fin|format_sqlite_date_to_french}
                        {else}
                            ponctuelle
                        {/if}
                    </option>
                    {/foreach}
                </select>
            </dd>
            <dt><label for="f_sujet">Sujet du mail</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
            <dd><input type="text" name="sujet" id="f_sujet" value="{form_field name=sujet data=$rappel}" required="required" size="50" /></dd>
            <dt><label for="f_delai">Délai d'envoi</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
            <dd><label><input type="radio" name="delai_choix" value="0" {form_field name="delai_choix" checked=0 default=0 data=$rappel} /> Le jour de l'expiration de la cotisation</label></dd>
            <dd>
                <input type="radio" name="delai_choix" id="f_delai_pre" value="-1" {form_field name="delai_choix" checked=-1 data=$rappel} />
                <input type="number" name="delai_pre" id="f_delai_pre_nb" step="1" min="1" max="900" size="4" id="f_delai" value="{form_field name=delai_pre data=$rappel default=30}" />
                <label for="f_delai_pre">jours avant expiration</label>
            </dd>
            <dd>
                <input type="radio" name="delai_choix" id="f_delai_post" value="1" {form_field name="delai_choix" checked=1 data=$rappel} /> 
                <input type="number" name="delai_post" id="f_delai_post_nb" step="1" min="1" max="900" size="4" id="f_delai" value="{form_field name=delai_post default=30 data=$rappel}" />
                <label for="f_delai_post">jours après expiration</label>
            </dd>
            <dt><label for="f_texte">Texte du mail</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
            <dd><textarea name="texte" id="f_texte" cols="70" rows="15" required="required">{form_field name=texte data=$rappel}</textarea></dd>
            <dd class="help">Astuce : pour inclure dans le contenu du mail le nom du membre, utilisez #IDENTITE, pour inclure le délai de l'envoi utilisez #NB_JOURS.</dd>
        </dl>
    </fieldset>

    <p class="submit">
        {csrf_field key="edit_rappel_%s"|args:$rappel.id}
        <input type="submit" name="save" value="Enregistrer &rarr;" />
    </p>

</form>

{include file="admin/_foot.tpl"}
|

<
<
<
<
<
<
<
|
<

<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<
<
<
<
<
<

1
2







3

4



5






































6







7
{include file="admin/_head.tpl" title="Modifier un rappel automatique" current="membres/services" js=1}








{include file="services/_nav.tpl" current="reminders"}





{include file="services/reminders/_form.tpl" legend="Modifier un rappel automatique" default_subject=null default_body=null}














































{include file="admin/_foot.tpl"}

Modified src/templates/services/reminders/index.tpl from [aff55240a6] to [9d94f0415d].

29
30
31
32
33
34
35

36
37
38
39
40
41
42
43
44
45

46
47
							{if abs($reminder.delay) > 1}jours{else}jour{/if}
							{if $reminder.delay > 0}après{else}avant{/if}
							expiration
						{/if}
					</td>
					<th><a href="details.php?id={$reminder.id}">{$reminder.subject}</a></th>
					<td class="actions">

						{linkbutton shape="edit" label="Modifier" href="services/reminders/edit.php?id=%d"|args:$reminder.id}
						{linkbutton shape="delete" label="Supprimer" href="services/reminders/delete.php?id=%d"|args:$reminder.id}
					</td>
				</tr>
			{/foreach}
		</tbody>
	</table>
{/if}

{include file="services/reminders/_form.tpl" legend="Ajouter un rappel automatique"}


{include file="admin/_foot.tpl"}







>









|
>


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
							{if abs($reminder.delay) > 1}jours{else}jour{/if}
							{if $reminder.delay > 0}après{else}avant{/if}
							expiration
						{/if}
					</td>
					<th><a href="details.php?id={$reminder.id}">{$reminder.subject}</a></th>
					<td class="actions">
						{linkbutton shape="mail" label="Liste des rappels envoyés" href="services/reminders/details.php?id=%d"|args:$reminder.id}
						{linkbutton shape="edit" label="Modifier" href="services/reminders/edit.php?id=%d"|args:$reminder.id}
						{linkbutton shape="delete" label="Supprimer" href="services/reminders/delete.php?id=%d"|args:$reminder.id}
					</td>
				</tr>
			{/foreach}
		</tbody>
	</table>
{/if}

{include file="services/reminders/_form.tpl" legend="Ajouter un rappel automatique"
	reminder=null delay_type=0 delay_before=15 delay_after=5}

{include file="admin/_foot.tpl"}

Modified src/www/admin/services/reminders/delete.php from [91fa0c34f6] to [6e29e0f367].

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
<?php
namespace Garradin;

require_once __DIR__ . '/../../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);

if (!qg('id') || !is_numeric(qg('id')))
{
    throw new UserException("Argument du numéro de rappel manquant.");

}

$rappels = new Rappels;

$rappel = $rappels->get(qg('id'));

if (!$rappel)
{
    throw new UserException("Ce rappel n'existe pas.");
}

if (f('delete') && $form->check('delete_rappel_' . $rappel->id))
{
    try {

        $rappels->delete($rappel->id, (bool) f('delete_history'));
        Utils::redirect(ADMIN_URL . 'membres/cotisations/gestion/rappels.php');
    }
    catch (UserException $e)
    {
        $form->addError($e->getMessage());
    }
}

$tpl->assign('rappel', $rappel);

$tpl->display('admin/membres/cotisations/gestion/rappel_supprimer.tpl');



|
|
<
|
<
|
<
>
|
|
<

|

|
<
|


|
|
<
>
|
|
|
<
<
<
<
<
|
<

|
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
<?php
namespace Garradin;

use Garradin\Entities\Services\Reminder;
use Garradin\Services\Reminders;

use Garradin\Services\Services;



require_once __DIR__ . '/../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);


$reminder = Reminders::get((int) qg('id'));

if (!$reminder) {

	throw new UserException("Ce rappel n'existe pas");
}

$csrf_key = 'reminder_delete_' . $reminder->id();


$form->runIf('delete', function () use ($reminder) {
	$reminder->delete();
}, $csrf_key, ADMIN_URL . 'services/reminders/');






$tpl->assign(compact('reminder', 'csrf_key'));


$tpl->display('services/reminders/delete.tpl');

Modified src/www/admin/services/reminders/edit.php from [dfb1636402] to [30e7c419dc].

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
39
40
41



42
43
44
45

46
47
48
49
50
51
52
53
54
55
56
57
<?php
namespace Garradin;





require_once __DIR__ . '/../../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);

if (!qg('id') || !is_numeric(qg('id')))
{
    throw new UserException("Argument du numéro de rappel manquant.");
}

$rappels = new Rappels;

$rappel = $rappels->get(qg('id'));

if (!$rappel)
{
    throw new UserException("Ce rappel n'existe pas.");
}

$cotisations = new Cotisations;


if (f('save') && $form->check('edit_rappel_' . $rappel->id))



{
    try {
        if (f('delai_choix') == 0)
           $delai = 0;
        elseif (f('delai_choix') > 0)
            $delai = (int) f('delai_post');
        else
            $delai = -(int) f('delai_pre');

        $rappels->edit($rappel->id, [
            'sujet'         => f('sujet'),
            'texte'         => f('texte'),
            'delai'         => $delai,
            'id_cotisation' => f('id_cotisation'),
        ]);

        Utils::redirect(ADMIN_URL . 'membres/cotisations/gestion/rappels.php');



    }
    catch (UserException $e)
    {
        $form->addError($e->getMessage());

    }
}

$rappel->delai_pre = 
    $rappel->delai_post = (abs($rappel->delai) ?: 30);

$rappel->delai_choix = ($rappel->delai == 0) ? 0 : ($rappel->delai > 0 ? 1 : -1);

$tpl->assign('rappel', $rappel);
$tpl->assign('cotisations', $cotisations->listCurrent());

$tpl->display('admin/membres/cotisations/gestion/rappel_modifier.tpl');



>
>
>
>
|



<
<
<
<
|
<

<
<
|
<
|


<
>

|
>
>
>
|
<
<
|
<
<
<
<

|
<
<
|
<
|
|
<
>
>
>
|
|
<
<
>
|
|
|
<
<

<
|
<
<

|
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
39


40

41


42
43
<?php
namespace Garradin;

use Garradin\Entities\Services\Reminder;
use Garradin\Services\Reminders;
use Garradin\Services\Services;

require_once __DIR__ . '/../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);





$reminder = Reminders::get((int) qg('id'));




if (!$reminder) {

	throw new UserException("Ce rappel n'existe pas");
}


$csrf_key = 'reminder_edit_' . $reminder->id();

$form->runIf('save', function () use ($reminder) {
	$reminder->importForm();
	$reminder->save();
}, $csrf_key, ADMIN_URL . 'services/reminders/');



$delay_before = $delay_after = '';





if ($reminder->delay < 0) {


	$delay_type = 1;

	$delay_before = abs($reminder->delay);
}

elseif ($reminder->delay > 0) {
	$delay_type = 2;
	$delay_after = abs($reminder->delay);
}
else {


	$delay_type = 0;
}

$services_list = Services::listAssoc();




$tpl->assign(compact('delay_type', 'delay_before', 'delay_after', 'reminder', 'csrf_key', 'services_list'));



$tpl->display('services/reminders/edit.tpl');

Modified src/www/admin/services/reminders/index.php from [60b511225c] to [1c48a48184].

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
<?php
namespace Garradin;

use Garradin\Entities\Services\Reminder;
use Garradin\Services\Reminders;
use Garradin\Services\Services;

require_once __DIR__ . '/../../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);

$csrf_key = 'reminder_add';

$form->runIf('save', function () {
    $reminder = new Reminder;
    $reminder->importForm();
    $reminder->save();
}, $csrf_key, Utils::getSelfURL());

$list = Reminders::list();
$services_list = Services::listAssoc();

$default_subject = '[#NOM_ASSO] Échéance de cotisation';
$default_body = "Bonjour #IDENTITE,\n\nVotre cotisation arrive à échéance dans #NB_JOURS jours.\n\n"
    .   "Merci de nous contacter pour renouveler votre cotisation.\n\nCordialement.\n\n"
    .   "--\n#NOM_ASSO\n#ADRESSE_ASSO\nE-Mail : #EMAIL_ASSO\nSite web : #SITE_ASSO";

$tpl->assign(compact('csrf_key', 'list', 'services_list', 'default_subject', 'default_body'));

$tpl->display('services/reminders/index.tpl');







|






|
|
|







|
|




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
<?php
namespace Garradin;

use Garradin\Entities\Services\Reminder;
use Garradin\Services\Reminders;
use Garradin\Services\Services;

require_once __DIR__ . '/../_inc.php';

$session->requireAccess('membres', Membres::DROIT_ADMIN);

$csrf_key = 'reminder_add';

$form->runIf('save', function () {
	$reminder = new Reminder;
	$reminder->importForm();
	$reminder->save();
}, $csrf_key, Utils::getSelfURL());

$list = Reminders::list();
$services_list = Services::listAssoc();

$default_subject = '[#NOM_ASSO] Échéance de cotisation';
$default_body = "Bonjour #IDENTITE,\n\nVotre cotisation arrive à échéance dans #NB_JOURS jours.\n\n"
	.   "Merci de nous contacter pour renouveler votre cotisation.\n\nCordialement.\n\n"
	.   "--\n#NOM_ASSO\n#ADRESSE_ASSO\nE-Mail : #EMAIL_ASSO\nSite web : #SITE_ASSO";

$tpl->assign(compact('csrf_key', 'list', 'services_list', 'default_subject', 'default_body'));

$tpl->display('services/reminders/index.tpl');