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