071fe43a345423f02620ed248dcb6d9f1ce3dc49
[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     $sql = 'SELECT * FROM %1$s WHERE id=\'%2$d\' LIMIT 1';
36     return db_select_single(sprintf($sql, DB_TABLE_EARNINGS, db_escape($earning_id)));
37 }
38
39 function db_create_earning($earning) {
40     unset($earning['id']);
41     $earning['date']        = db_unixtime2datetime(ui_date2unixtime($earning['date']));
42     $earning['value']       = ui_money2float($earning['value']);
43     $earning['created_at']  = db_unixtime2datetime(time());
44     $earning['modified_at'] = db_unixtime2datetime(time());
45     return (db_insert_single(DB_TABLE_EARNINGS, $earning));
46 }
47
48 function db_change_earning($earning) {
49     $id = $earning['id'];
50     unset($earning['id']);
51     $earning['date']        = db_unixtime2datetime(ui_date2unixtime($earning['date']));
52     $earning['value']       = ui_money2float($earning['value']);
53     $earning['modified_at'] = db_unixtime2datetime(time());
54     return db_update_single(DB_TABLE_EARNINGS, $earning, sprintf('id=\'%1$d\'', db_escape($id)));
55 }
56
57 function db_delete_earning($earning) {
58     return db_delete_single(DB_TABLE_EARNINGS, sprintf('id=\'%1$d\'', db_escape($earning['id'])));
59 }
60
61 /* }}} */
62
63
64 function validate_earning($userdata, &$dbdata, &$validation) {/*{{{*/
65     global $EARNING_TYPES, $ACCOUNT_TYPES;
66     $fields = array(
67         'id'              => 'number',
68         'date'            => 'date',
69         'type'            => $EARNING_TYPES,
70         'account'         => $ACCOUNT_TYPES,
71         'member_id'       => 'member',
72         'value'           => 'money',
73         'description'     => 'text',
74 //      'status'          -  See below...
75     );
76     $orig = $dbdata;
77     $dbdata['status'] = empty($userdata['status']) ? 'open' : 'paid';
78     foreach ($fields as $name => $type) {
79         if (!isset($userdata[$name])) continue;
80         $dbdata[$name] = $userdata[$name];
81     }
82
83     if (empty($dbdata['date'])) {
84         $validation[] = 'Bitte ein Datum angeben.';
85     }
86     if ((float)ui_money2float($dbdata['value']) == 0) {
87         $validation[] = 'Bitte einen Betrag angeben.';
88     }
89
90     return (count($validation) == 0);
91 }/*}}}*/
92
93
94 function action_create_earning() {/*{{{*/
95     $earning = array();
96     $earning['date']      = format_date(time());
97     $earning['status']    = 'paid';
98     $log_messages = array();
99     if (isset($_POST['submit'])) {
100         unset($_POST['id']);
101         if (validate_earning($_POST, $earning, $log_messages)) {
102             if (db_create_earning($earning)) {
103                 redirect(link_to('finances'));
104             }
105             echo db_error();
106         }
107     }
108     form_earning($earning, 'create', $log_messages);
109 }/*}}}*/
110
111
112 function action_change_earning() {/*{{{*/
113     if (!isset($_REQUEST['id'])) redirect(link_to('finances'));
114     $earning = db_get_earning_with_id($_REQUEST['id']);
115     if (!isset($earning)) redirect(link_to('finances'));
116     $earning['date'] = format_date(db_date2unixtime($earning['date']));
117     $earning['value']= format_money($earning['value']);
118     $log_messages = array();
119     if (isset($_POST['submit'])) {
120         if (validate_earning($_POST, $earning, $log_messages)) {
121             if (db_change_earning($earning)) {
122                 redirect(link_to('finances'));
123             }
124             echo db_error();
125         }
126     }
127
128     form_earning($earning, 'change', $log_messages);
129 }/*}}}*/
130
131
132 function action_delete_earning() {/*{{{*/
133     if (!isset($_REQUEST['id'])) redirect(link_to('finances'));
134     $earning = db_get_earning_with_id($_REQUEST['id']);
135     if (!isset($earning)) redirect(link_to('finances'));
136     $earning['date'] = format_date(db_date2unixtime($earning['date']));
137     $earning['value']= format_money($earning['value']);
138     $log_messages = array();
139     if (isset($_POST['submit'])) {
140         if (db_delete_earning($earning)) {
141             redirect(link_to('finances'));
142         }
143         echo db_error();
144     }
145     form_earning($earning, 'delete', $log_messages);
146 }/*}}}*/
147
148
149 function form_earning($earning = array(), $task, $log_messages) {/*{{{*/
150     global $EARNING_TYPES, $ACCOUNT_TYPES;
151
152     $readonly = ($task == 'delete');
153
154     ?>
155     <form action="<?=link_to($task . '_earning')?>" method="post" class="clearfix" id="earning_form" 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     if (empty($_POST['earnings']) || !is_array($_POST['earnings'])) redirect(link_to('finances'));
194     db_begin();
195     foreach ($_POST['earnings'] as $post_data) {
196         $log_messages = array();
197
198         unset($post_data['id']);
199         $earning = array(
200             'account' => 'bank'
201         );
202         if (validate_earning($post_data, $earning, $log_messages)) {
203             if (!db_create_earning($earning)) {
204                 echo db_error();
205                 db_rollback();
206                 return;
207             }
208         }
209         else {
210             db_rollback();
211             echo '<h2>Verbuchen von Einnahmen</h2><p>Beim Verbuchen der Einnahmen ist ein Fehler aufgetreten:</p>';
212             log_messages($log_messages);
213             return;
214         }
215     }
216     db_commit();
217     
218     // SET directdebit from FRST to RCUR
219     foreach ($_POST['earnings'] as $post_data) {
220         $member['modified_at'] = db_unixtime2datetime(time());
221         $member['directdebit'] = 3; // RCUR
222         db_update_single(DB_TABLE_MEMBERS, $member, sprintf('directdebit=\'2\' AND id=\'%1$d\'', db_escape($post_data['member_id'])));
223     }
224
225     redirect(link_to('finances'));
226 }/*}}}*/
227