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