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