Formatting
[memberdb.git] / include / events.php
1 <?php
2
3 $SQL_CREATE_EVENTS = sprintf('
4     CREATE TABLE IF NOT EXISTS `%1$s` (
5       `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
6       `event_date` DATE NOT NULL,
7       `event_type` ENUM(\'joined\',\'changed\',\'leaved\') NOT NULL,
8       `member_id` INT(10) UNSIGNED NOT NULL,
9       `member_type` ENUM(\'regular\',\'patron\',\'honorary\') NULL,
10       `fee` DECIMAL(10,2) NULL,
11       `payment_interval` ENUM(\'monthly\', \'quarterly\', \'halfyearly\', \'yearly\') NULL,
12       `created_at` DATETIME NOT NULL,
13       `modified_at` DATETIME NOT NULL,
14       PRIMARY KEY  (`id`),
15       UNIQUE KEY `member_id_event_date` (`member_id`, `event_date`)
16     ) ENGINE=InnoDB DEFAULT CHARSET=%2$s
17     ', DB_TABLE_EVENTS, DB_CHARSET);
18
19 $EVENT_TYPES = array(
20     'joined'  => 'Eintritt',
21     'changed' => 'Änderung',
22     'leaved'  => 'Austritt'
23 );
24
25 $PAYMENT_INTERVALS = array(
26     'monthly'    => 'monatlich',
27     'quarterly'  => 'vierteljährlich',
28     'halfyearly' => 'halbjährlich',
29     'yearly'     => 'jährlich'
30 );
31
32 $MEMBER_TYPES = array(
33     'regular'  => 'Ordentliches Mitglied',
34     'patron'   => 'Fördermitglied',
35     'honorary' => 'Ehrenmitglied'
36 );
37
38 /* DB functions {{{ */
39
40 function db_create_event($event)
41 {
42     unset($event['id']);
43     $event['event_date'] = db_unixtime2datetime(ui_date2unixtime($event['event_date']));
44     $event['fee'] = ui_money2float($event['fee']);
45     $event['created_at'] = db_unixtime2datetime(time());
46     $event['modified_at'] = db_unixtime2datetime(time());
47     return (db_insert_single(DB_TABLE_EVENTS, $event));
48 }
49
50 function db_change_event($event)
51 {
52     $id = $event['id'];
53     unset($event['id']);
54     unset($event['member_id']);
55     $event['event_date'] = db_unixtime2datetime(ui_date2unixtime($event['event_date']));
56     $event['fee'] = ui_money2float($event['fee']);
57     $event['modified_at'] = db_unixtime2datetime(time());
58     $special = '';
59     if (!isset($event['fee'])) {
60         $special .= ',`fee`=NULL';
61     }
62     if (!isset($event['member_type'])) {
63         $special .= ',`member_type`=NULL';
64     }
65     if (!isset($event['payment_interval'])) {
66         $special .= ',`payment_interval`=NULL';
67     }
68     return db_update_single(DB_TABLE_EVENTS, $event, sprintf('id=\'%1$d\'', db_escape($id)), $special);
69 }
70
71 function db_delete_event($event)
72 {
73     return db_delete_single(DB_TABLE_EVENTS, sprintf('id=\'%1$d\'', db_escape($event['id'])));
74 }
75
76 function db_get_events_for_member($member_id, $unixtime_start = null, $unixtime_end = null)
77 {
78     $conditions = array(
79         sprintf('member_id=\'%d\'', db_escape($member_id))
80     );
81     if (isset($unixtime_start)) {
82         $conditions[] = sprintf('event_date>=\'%s\'', db_unixtime2date($unixtime_start));
83     }
84     if (isset($unixtime_end)) {
85         $conditions[] = sprintf('event_date<=\'%s\'', db_unixtime2date($unixtime_end));
86     }
87
88     $sql = 'SELECT * FROM %1$s WHERE %2$s ORDER BY event_date ASC';
89     return db_select_multi(sprintf($sql, DB_TABLE_EVENTS, join(' AND ', $conditions)));
90 }
91
92 function db_get_event_with_member_and_date($member_id, $event_date)
93 {
94     $sql = 'SELECT * FROM %1$s WHERE member_id=\'%2$d\' AND event_date=\'%3$s\' LIMIT 1';
95     return db_select_single(sprintf($sql, DB_TABLE_EVENTS, db_escape($member_id), db_escape($event_date)));
96 }
97
98 function db_get_event_with_id($event_id)
99 {
100     $sql = 'SELECT * FROM %1$s WHERE id=\'%2$d\' LIMIT 1';
101     return db_select_single(sprintf($sql, DB_TABLE_EVENTS, db_escape($event_id)));
102 }
103
104 /* }}} */
105
106
107 function validate_event($userdata, &$dbdata, &$validation)
108 {/*{{{*/
109     global $EVENT_TYPES, $MEMBER_TYPES, $PAYMENT_INTERVALS;
110     $fields = array(
111         'id'               => 'number',
112         'event_date'       => 'date',
113         'fee'              => 'fee',
114         'event_type'       => $EVENT_TYPES,
115         'member_type'      => $MEMBER_TYPES,
116         'payment_interval' => $PAYMENT_INTERVALS,
117     );
118     $orig = $dbdata;
119     foreach ($fields as $name => $type) {
120         if (!isset($userdata[$name])) {
121             continue;
122         }
123         $dbdata[$name] = $userdata[$name];
124     }
125
126
127 // ids must be equal
128 // member_ids must be equal
129 // date must be unique for given member
130     if (isset($orig['id'])) {
131         if ($dbdata['id'] != $orig['id']) {
132             $validation[] = 'Irgendwas anderes ist sehr sehr komisch.';
133         }
134         if (empty($dbdata['event_date'])) {
135             $validation[] = 'Bitte ein Datum für das Ereignis eingeben.';
136         } elseif (!validate_event_date($dbdata['member_id'], $dbdata['event_date'], $dbdata['id'])) {
137             $validation[] = 'An dem angegebenen Datum existiert schon ein Ereignis.';
138         }
139         return (count($validation) == 0);
140     }
141     if (empty($dbdata['event_date'])) {
142         $validation[] = 'Bitte ein Datum für das Ereignis eingeben.';
143     } elseif (!validate_event_date($dbdata['member_id'], $dbdata['event_date'])) {
144         $validation[] = 'An dem angegebenen Datum existiert schon ein Ereignis.';
145     }
146     return (count($validation) == 0);
147 }/*}}}*/
148
149
150 function validate_event_date($member_id, $event_date, $event_id = null)
151 {/*{{{*/
152     $event_date = db_unixtime2date(ui_date2unixtime($event_date));
153     $event = db_get_event_with_member_and_date($member_id, $event_date);
154
155     // theres no event with this date
156     if (!isset($event)) {
157         return true;
158     }
159
160     // there is a event, but maybe its the one we got passed
161     if (isset($event_id) && $event_id == $event['id']) {
162         return true;
163     }
164
165     return false;
166 }/*}}}*/
167
168
169 function action_list_events($member = null)
170 {/*{{{*/
171     global $EVENT_TYPES, $MEMBER_TYPES, $PAYMENT_INTERVALS;
172
173     if (!isset($member)) {
174         if (!isset($_REQUEST['member_id'])) {
175             redirect(link_to());
176         }
177         $member = db_get_member_with_id($_REQUEST['id']);
178         if (!isset($member)) {
179             redirect(link_to());
180         }
181     }
182
183     $events = db_get_events_for_member($member['id']);
184
185     ?>
186     <h3 id="events">Ereignisse</h3>
187     <?php if (isset($events)) : ?>
188     <table>
189         <tr>
190             <th>Datum</th>
191             <th>Ereignistyp</th>
192             <th>Mitgliedstyp</th>
193             <th>Beitrag</th>
194             <th>Zahlungsintervall</th>
195         </tr>
196         <?php foreach ($events as $event) : ?>
197             <tr>
198                 <td><a href="<?= html_escape(link_to('change_event',
199                         array('id' => $event['id']))) ?>#event_form"><?= html_escape(format_date(db_date2unixtime($event['event_date']))) ?></a>
200                 </td>
201                 <td><?= html_escape($EVENT_TYPES[$event['event_type']]) ?></td>
202                 <td><?= html_escape(isset($event['member_type']) ? $MEMBER_TYPES[$event['member_type']] : '-') ?></td>
203                 <td><?= html_escape(isset($event['fee']) ? format_money($event['fee']) : '-') ?></td>
204                 <td><?= html_escape(isset($event['payment_interval']) ? $PAYMENT_INTERVALS[$event['payment_interval']] : '-') ?></td>
205             </tr>
206         <?php endforeach ?>
207     </table>
208 <?php else : ?>
209     <p>Bisher gibt's noch keine Ereignisse.</p>
210 <?php endif ?>
211     <?php
212 }/*}}}*/
213
214
215 function action_create_event($member = null)
216 {/*{{{*/
217     if (!isset($member)) {
218         if (!isset($_REQUEST['member_id'])) {
219             redirect(link_to());
220         }
221         $member = db_get_member_with_id($_REQUEST['id']);
222         if (!isset($member)) {
223             redirect(link_to());
224         }
225     }
226     $event = array();
227     $event['event_date'] = format_date(time());
228     $event['member_id'] = $member['id'];
229     $events = db_get_events_for_member($member['id']);
230     if (empty($events)) {
231         $event['member_type'] = 'regular';
232     } else {
233         $event['event_type'] = 'changed';
234     }
235     $log_messages = array();
236     if (isset($_POST['submit'])) {
237         unset($_POST['id']);
238         if (validate_event($_POST, $event, $log_messages)) {
239             if (empty($event['fee'])) {
240                 unset($event['fee']);
241             }
242             if (empty($event['member_type'])) {
243                 unset($event['member_type']);
244             }
245             if (empty($event['payment_interval'])) {
246                 unset($event['payment_interval']);
247             }
248             if (db_create_event($event)) {
249                 redirect(link_to('view_member', array('id' => $event['member_id'])) . '#events');
250             }
251             echo db_error();
252         }
253     }
254     form_event($event, 'create', $log_messages);
255 }/*}}}*/
256
257 function action_change_event()
258 {/*{{{*/
259     if (!isset($_REQUEST['id'])) {
260         redirect(link_to());
261     }
262     $event = db_get_event_with_id($_REQUEST['id']);
263     $event['event_date'] = format_date(db_date2unixtime($event['event_date']));
264     $event['fee'] = format_money($event['fee']);
265     if (!isset($event)) {
266         redirect(link_to());
267     }
268     $log_messages = array();
269     if (isset($_POST['submit'])) {
270         if (validate_event($_POST, $event, $log_messages)) {
271             if (empty($event['fee'])) {
272                 unset($event['fee']);
273             }
274             if (empty($event['member_type'])) {
275                 unset($event['member_type']);
276             }
277             if (empty($event['payment_interval'])) {
278                 unset($event['payment_interval']);
279             }
280             if (db_change_event($event)) {
281                 redirect(link_to('view_member', array('id' => $event['member_id'])) . '#events');
282             }
283             echo db_error();
284         }
285     }
286
287     $member = db_get_member_with_id($event['member_id']);
288     if (!isset($member)) {
289         redirect(link_to());
290     }
291     form_member($member, true);
292     action_list_events($member);
293     form_event($event, 'change', $log_messages);
294 }/*}}}*/
295
296 function action_delete_event()
297 {/*{{{*/
298     if (!isset($_REQUEST['id'])) {
299         redirect(link_to());
300     }
301     $event = db_get_event_with_id($_REQUEST['id']);
302     if (!isset($event)) {
303         redirect(link_to());
304     }
305     $event['event_date'] = format_date(db_date2unixtime($event['event_date']));
306     $event['fee'] = format_money($event['fee']);
307     $log_messages = array();
308     if (isset($_POST['submit'])) {
309         if (db_delete_event($event)) {
310             redirect(link_to('view_member', array('id' => $event['member_id'])) . '#events');
311         }
312         echo db_error();
313     }
314     $member = db_get_member_with_id($event['member_id']);
315     if (!isset($member)) {
316         redirect(link_to());
317     }
318     form_member($member, true);
319     action_list_events($member);
320     form_event($event, 'delete', $log_messages);
321 }/*}}}*/
322
323
324 function form_event($event = array(), $task, $log_messages)
325 {/*{{{*/
326     global $EVENT_TYPES, $MEMBER_TYPES, $PAYMENT_INTERVALS;
327
328     $readonly = ($task == 'delete');
329
330     ?>
331     <form action="#event_form" method="post" class="clearfix" id="event_form">
332         <?php if (isset($event['id'])) : ?><?= html_hidden_field('id', $event) ?><?php endif ?>
333         <?= html_hidden_field('member_id', $event) ?>
334         <fieldset>
335             <?php if ($task == 'create') : ?>
336                 <legend>Neues Ereignis</legend>
337             <?php elseif ($task == 'delete') : ?>
338                 <legend>Ereignis l&ouml;schen</legend>
339             <?php elseif ($task == 'change') : ?>
340                 <legend>Ereignis &auml;ndern</legend>
341             <?php endif ?>
342             <?php log_messages($log_messages); ?>
343             <?= html_text_field('Datum', 'event_date', $event, $readonly) ?>
344             <?= html_list_box('Ereignistyp', 'event_type', $EVENT_TYPES, $event, $readonly) ?>
345             <?= html_list_box('Mitgliedstyp', 'member_type', array_merge(array(0 => 'unverändert'), $MEMBER_TYPES),
346                 $event, $readonly) ?>
347             <?= html_money_field('Beitrag', 'fee', $event, $readonly) ?>
348             <small>Leer lassen wenn unver&auml;ndert.</small>
349             <?= html_list_box('Zahlungsintervall', 'payment_interval',
350                 array_merge(array(0 => 'unverändert'), $PAYMENT_INTERVALS), $event, $readonly) ?>
351         </fieldset>
352         <?php if ($task == 'delete') : ?>
353             <input class="submit" type="submit" name="submit" value="L&ouml;schen"/>
354         <?php else : ?>
355             <input class="submit" type="submit" name="submit" value="Speichern"/>
356         <?php endif ?>
357     </form>
358     <?php if ($task == 'change') : ?>
359     <a href="<?= html_escape(link_to('delete_event', array('id' => $event['id']))) ?>#event_form">Ereignis
360         l&ouml;schen</a>
361     <a href="<?= html_escape(link_to('view_member', array('id' => $event['member_id']))) ?>#event_form">Neues
362         Ereignis</a>
363 <?php elseif ($task == 'delete') : ?>
364     <a href="<?= html_escape(link_to('view_member', array('id' => $event['member_id']))) ?>#event_form">Neues
365         Ereignis</a>
366 <?php endif ?>
367     <?php
368 }/*}}}*/