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