Formatting
[memberdb.git] / include / earnings.php
1 <?php
2
3 $SQL_CREATE_EARNINGS = sprintf('
4     CREATE TABLE IF NOT EXISTS `%1$s` (
5       `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
6       `date` DATE NOT NULL,
7       `type` ENUM(\'donation\', \'fee\', \'old_fee\', \'interest\', \'account_transfer\', \'room\', \'catering\') NULL,
8       `status` ENUM(\'open\',\'paid\') NOT NULL,
9       `account` ENUM(\'bank\',\'cash\') NOT NULL,
10       `value` DECIMAL(10,2) NULL,
11       `member_id` INT(10) UNSIGNED NOT NULL,
12       `description` TEXT NOT NULL,
13       `created_at` DATETIME NOT NULL,
14       `modified_at` DATETIME NOT NULL,
15       PRIMARY KEY  (`id`),
16       INDEX `idx_member_id` (`member_id`),
17       INDEX `idx_date` (`date`)
18     ) ENGINE=InnoDB DEFAULT CHARSET=%2$s
19     ', DB_TABLE_EARNINGS, DB_CHARSET);
20
21 $EARNING_TYPES = array(
22     'fee'              => 'Mitgliedsbeitrag',
23     'donation'         => 'Spende',
24     'interest'         => 'Zinsen',
25     'room'             => 'Raumeinnahme',
26     'account_transfer' => 'Umbuchung',
27     'old_fee'          => 'MitgliedsbeitrÃĪge vor dem ' . format_date(DIRECTDEBIT_DATE),
28     'catering'         => 'Raum - Getraenke & Snacks'
29 );
30
31
32 /* DB functions {{{ */
33
34 function db_get_earning_with_id($earning_id)
35 {
36     $sql = 'SELECT * FROM %1$s WHERE id=\'%2$d\' LIMIT 1';
37     return db_select_single(sprintf($sql, DB_TABLE_EARNINGS, db_escape($earning_id)));
38 }
39
40 function db_create_earning($earning)
41 {
42     unset($earning['id']);
43     $earning['date'] = db_unixtime2datetime(ui_date2unixtime($earning['date']));
44     $earning['value'] = ui_money2float($earning['value']);
45     $earning['created_at'] = db_unixtime2datetime(time());
46     $earning['modified_at'] = db_unixtime2datetime(time());
47     return (db_insert_single(DB_TABLE_EARNINGS, $earning));
48 }
49
50 function db_change_earning($earning)
51 {
52     $id = $earning['id'];
53     unset($earning['id']);
54     $earning['date'] = db_unixtime2datetime(ui_date2unixtime($earning['date']));
55     $earning['value'] = ui_money2float($earning['value']);
56     $earning['modified_at'] = db_unixtime2datetime(time());
57     return db_update_single(DB_TABLE_EARNINGS, $earning, sprintf('id=\'%1$d\'', db_escape($id)));
58 }
59
60 function db_delete_earning($earning)
61 {
62     return db_delete_single(DB_TABLE_EARNINGS, sprintf('id=\'%1$d\'', db_escape($earning['id'])));
63 }
64
65 /* }}} */
66
67
68 function validate_earning($userdata, &$dbdata, &$validation)
69 {/*{{{*/
70     global $EARNING_TYPES, $ACCOUNT_TYPES;
71     $fields = array(
72         'id'          => 'number',
73         'date'        => 'date',
74         'type'        => $EARNING_TYPES,
75         'account'     => $ACCOUNT_TYPES,
76         'member_id'   => 'member',
77         'value'       => 'money',
78         'description' => 'text',
79         //      'status'          -  See below...
80     );
81     $orig = $dbdata;
82     $dbdata['status'] = empty($userdata['status']) ? 'open' : 'paid';
83     foreach ($fields as $name => $type) {
84         if (!isset($userdata[$name])) {
85             continue;
86         }
87         $dbdata[$name] = $userdata[$name];
88     }
89
90     if (empty($dbdata['date'])) {
91         $validation[] = 'Bitte ein Datum angeben.';
92     }
93     if ((float)ui_money2float($dbdata['value']) == 0) {
94         $validation[] = 'Bitte einen Betrag angeben.';
95     }
96
97     return (count($validation) == 0);
98 }/*}}}*/
99
100
101 function action_create_earning()
102 {/*{{{*/
103     $earning = array();
104     $earning['date'] = format_date(time());
105     $earning['status'] = 'paid';
106     $log_messages = array();
107     if (isset($_POST['submit'])) {
108         unset($_POST['id']);
109         if (validate_earning($_POST, $earning, $log_messages)) {
110             if (db_create_earning($earning)) {
111                 redirect(link_to('finances'));
112             }
113             echo db_error();
114         }
115     }
116     form_earning($earning, 'create', $log_messages);
117 }/*}}}*/
118
119
120 function action_change_earning()
121 {/*{{{*/
122     if (!isset($_REQUEST['id'])) {
123         redirect(link_to('finances'));
124     }
125     $earning = db_get_earning_with_id($_REQUEST['id']);
126     if (!isset($earning)) {
127         redirect(link_to('finances'));
128     }
129     $earning['date'] = format_date(db_date2unixtime($earning['date']));
130     $earning['value'] = format_money($earning['value']);
131     $log_messages = array();
132     if (isset($_POST['submit'])) {
133         if (validate_earning($_POST, $earning, $log_messages)) {
134             if (db_change_earning($earning)) {
135                 redirect(link_to('finances'));
136             }
137             echo db_error();
138         }
139     }
140
141     form_earning($earning, 'change', $log_messages);
142 }/*}}}*/
143
144
145 function action_delete_earning()
146 {/*{{{*/
147     if (!isset($_REQUEST['id'])) {
148         redirect(link_to('finances'));
149     }
150     $earning = db_get_earning_with_id($_REQUEST['id']);
151     if (!isset($earning)) {
152         redirect(link_to('finances'));
153     }
154     $earning['date'] = format_date(db_date2unixtime($earning['date']));
155     $earning['value'] = format_money($earning['value']);
156     $log_messages = array();
157     if (isset($_POST['submit'])) {
158         if (db_delete_earning($earning)) {
159             redirect(link_to('finances'));
160         }
161         echo db_error();
162     }
163     form_earning($earning, 'delete', $log_messages);
164 }/*}}}*/
165
166
167 function form_earning($earning = array(), $task, $log_messages)
168 {/*{{{*/
169     global $EARNING_TYPES, $ACCOUNT_TYPES;
170
171     $readonly = ($task == 'delete');
172
173     ?>
174     <form action="<?= link_to($task . '_earning') ?>" method="post" class="clearfix" id="earning_form"
175           style="<?php if ($_REQUEST['action'] == 'finances') : ?>float: left<?php else : ?>margin-top: 2em<?php endif ?>">
176         <?php if (isset($earning['id'])) : ?><?= html_hidden_field('id', $earning) ?><?php endif ?>
177         <fieldset>
178             <?php if ($task == 'create') : ?>
179                 <legend>Neue Einnahme</legend>
180             <?php elseif ($task == 'delete') : ?>
181                 <legend>Einnahme l&ouml;schen</legend>
182             <?php elseif ($task == 'change') : ?>
183                 <legend>Einnahme &auml;ndern</legend>
184             <?php endif ?>
185             <?php log_messages($log_messages); ?>
186             <?= html_text_field('Datum', 'date', $earning, $readonly) ?>
187             <?= html_list_box('Typ', 'type', $EARNING_TYPES, $earning, $readonly) ?>
188             <?= html_member_list_box('Mitglied', 'member_id', $earning, $readonly) ?>
189             <?= html_money_field('Betrag', 'value', $earning, $readonly) ?>
190             <?= html_text_field('Beschreibung', 'description', $earning, $readonly) ?>
191             <?= html_list_box('Ziel', 'account', $ACCOUNT_TYPES, $earning, $readonly) ?>
192             <?= html_checkbox('Bezahlt', 'status', $earning['status'] == 'paid', 1, $readonly) ?>
193         </fieldset>
194         <?php if ($task == 'delete') : ?>
195             <input class="submit" type="submit" name="submit" value="L&ouml;schen"/>
196         <?php else : ?>
197             <input class="submit" type="submit" name="submit" value="Speichern"/>
198         <?php endif ?>
199     </form>
200     <?php if ($task == 'change') : ?>
201     <br/>
202     <a href="<?= html_escape(link_to('delete_earning', array('id' => $earning['id']))) ?>">Einnahme l&ouml;schen</a>
203     <a href="<?= html_escape(link_to('finances')) ?>">Neue Einnahme</a>
204 <?php elseif ($task == 'delete') : ?>
205     <br/>
206     <a href="<?= html_escape(link_to('finances')) ?>">Neue Einnahme</a>
207 <?php endif ?>
208     <?php
209 }/*}}}*/
210
211
212 function action_create_earnings()
213 {/*{{{*/
214     if (empty($_POST['earnings']) || !is_array($_POST['earnings'])) {
215         redirect(link_to('finances'));
216     }
217     db_begin();
218     foreach ($_POST['earnings'] as $post_data) {
219         $log_messages = array();
220
221         unset($post_data['id']);
222         $earning = array(
223             'account' => 'bank'
224         );
225         if (validate_earning($post_data, $earning, $log_messages)) {
226             if (!db_create_earning($earning)) {
227                 echo db_error();
228                 db_rollback();
229                 return;
230             }
231         } else {
232             db_rollback();
233             echo '<h2>Verbuchen von Einnahmen</h2><p>Beim Verbuchen der Einnahmen ist ein Fehler aufgetreten:</p>';
234             log_messages($log_messages);
235             return;
236         }
237     }
238     db_commit();
239
240     // SET directdebit from FRST to RCUR
241     foreach ($_POST['earnings'] as $post_data) {
242         $member['modified_at'] = db_unixtime2datetime(time());
243         $member['directdebit'] = 3; // RCUR
244         db_update_single(DB_TABLE_MEMBERS, $member,
245             sprintf('directdebit=\'2\' AND id=\'%1$d\'', db_escape($post_data['member_id'])));
246     }
247
248     redirect(link_to('finances'));
249 }/*}}}*/