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