37e2f0e921efd988f5f7dd0acdf688aa69f8fe8c
[memberdb.git] / include / payments.php
1 <?php
2
3 // NOTE: combination of earnings and expenses
4
5 $ACCOUNT_TYPES = array(
6     'bank' => 'Konto',
7     'cash' => 'Kasse'
8 );
9
10 /* DB functions {{{ */
11 function db_get_payments($offset, $count, $where) {
12     $limit = '';
13     if (isset($offset) && isset($count)) $limit = sprintf(' LIMIT %1$d,%2$d', (int)$offset, (int)$count);
14     elseif (isset($offset)) $limit = sprintf(' LIMIT %1$d', (int)$count);
15     $sql = 'SELECT t.*, %4$s.nickname AS nickname FROM ((SELECT \'earning\' as ptype, %1$s.* FROM %1$s %3$s) UNION (SELECT \'expense\', %2$s.* FROM %2$s %3$s)) AS t LEFT JOIN %4$s ON t.member_id=%4$s.id ORDER BY `date` DESC, t.id DESC' . $limit;
16     return db_select_multi(sprintf($sql, DB_TABLE_EARNINGS, DB_TABLE_EXPENSES, $where, DB_TABLE_MEMBERS));
17 }
18
19 function db_get_finished_payments($offset, $count) {
20     $where = ' WHERE status=\'paid\'';
21     $payments = db_get_payments($offset, $count, $where);
22
23     $bank  = 0;
24     $cash  = 0;
25     $total = 0;
26     if ($count != 0) { // XXX TODO hä? - An dieser Stelle gäbe es sinnigere Bedinungen
27         $limit = sprintf(' LIMIT %d,18446744073709551615', (int)($count + $offset));
28         $sql = 'SELECT SUM(IF(`account`=\'bank\', `value`, 0)) as `bank`, SUM(IF(`account`=\'cash\', `value`, 0)) as `cash`, SUM(`value`) AS `total` 
29                 FROM (
30                     SELECT `value`, `account` 
31                     FROM (( SELECT `value`,                 `id`, `date`, `account` FROM %1$s %3$s) 
32                     UNION ( SELECT `value` * -1 AS `value`, `id`, `date`, `account` FROM %2$s %3$s)
33                     ) AS t
34                     ORDER BY `date` DESC, t.id DESC' . $limit . '
35                 ) AS u';
36         $row = db_select_single(sprintf($sql, DB_TABLE_EARNINGS, DB_TABLE_EXPENSES, $where));
37         $bank  = $row['bank'];
38         $cash  = $row['cash'];
39         $total = $row['total'];
40     }
41     for ($i = count($payments) - 1; $i >= 0; $i--) {
42         $value = $payments[$i]['value'];
43         if ($payments[$i]['ptype'] == 'expense') $value = bcmul($value, '-1');
44         switch ($payments[$i]['account']) {
45             case 'bank': $bank = bcadd($bank, $value); break;
46             case 'cash': $cash = bcadd($cash, $value); break;
47             default: break; // TODO XXX die?
48         }
49         $total = bcadd($total, $value);
50         $payments[$i]['bank']   = $bank;
51         $payments[$i]['cash']   = $cash;
52         $payments[$i]['total']  = $total;
53     }
54     return $payments;
55 }
56
57 function db_count_finished_payments() {
58     $where = ' WHERE status=\'paid\'';
59     $sql = 'SELECT count(*) as `count` FROM ((SELECT * FROM %1$s %3$s) UNION (SELECT * FROM %2$s %3$s)) AS t';
60     $row = db_select_single(sprintf($sql, DB_TABLE_EARNINGS, DB_TABLE_EXPENSES, $where));
61     return $row['count'];
62 }
63
64 function db_get_open_payments($offset, $count) {
65     return db_get_payments($offset, $count, ' WHERE status=\'open\'');
66 }
67
68 /* }}} */
69
70 function render_finished_payments($count = 25) {/*{{{*/
71     global $EXPENSE_TYPES, $EARNING_TYPES, $ACCOUNT_TYPES;
72     $page = 1;
73     if (!empty($_REQUEST['page'])) $page = max(1, (int)$_REQUEST['page']);
74     $payments = db_get_finished_payments(($page - 1) * $count, $count);
75     $max = db_count_finished_payments();
76     ?>
77     <h3 id="finished">Abgeschlossene Zahlungen</h3>
78     <?php if (isset($payments)) : ?>
79         <table>
80             <tr>
81                 <th>Id</th>
82                 <th>Datum</th>
83                 <th>Typ</th>
84                 <th>Mitglied</th>
85                 <th>Betrag</th>
86                 <th>Beschreibung</th>
87                 <th>Konto</th>
88                 <th>Kasse</th>
89                 <th>Gesamt</th>
90             </tr>
91         <?php foreach ($payments as $payment) : ?>
92             <tr class="<?=$payment['ptype']?>">
93                 <td style="text-align: right;"><a href="<?=html_escape(link_to('change_' . $payment['ptype'], array('id' => $payment['id'])))?>"><?=html_escape($payment['id'])?></a></td>
94                 <td><?=html_escape(format_date(db_date2unixtime($payment['date'])))?></td>
95                 <td><?=html_escape($payment['ptype'] == 'earning'? $EARNING_TYPES[$payment['type']] : $EXPENSE_TYPES[$payment['type']])?></td>
96                 <td><?php if ($payment['member_id'] != 0) : ?><a href="<?=html_escape(link_to('view_member', array('id'=> $payment['member_id'])))?>"><?=html_escape($payment['nickname'])?><?php endif ?></a></td>
97                 <td style="text-align: right;"><?=html_escape(format_money(($payment['ptype'] == 'earning' ? 1 : -1)  * $payment['value']))?></td>
98                 <td><?=html_escape($payment['description'])?></td>
99                 <td style="text-align: right;"><?=html_escape(format_money($payment['bank']))?></td>
100                 <td style="text-align: right;"><?=html_escape(format_money($payment['cash']))?></td>
101                 <td style="text-align: right;"><?=html_escape(format_money($payment['total']))?></td>
102             </tr>
103         <?php endforeach ?>
104         </table>
105         <?php paginate(link_to('finances') . '&page=%d#finished', $page, ceil($max / $count)); ?>
106     <?php else : ?>
107         <p>Bisher gibt's noch keine abgeschlossenen Zahlungen.</p>
108     <?php endif ?>
109     <?php
110
111 }/*}}}*/
112
113 function render_open_payments($offset = 0, $count = 25) {/*{{{*/
114     global $EXPENSE_TYPES, $EARNING_TYPES, $ACCOUNT_TYPES;
115     global $EXPENSE_TYPES, $EARNING_TYPES;
116     $payments = db_get_open_payments($offset, $count);
117     ?>
118     <h3>Offene Zahlungen</h3>
119     <?php if (isset($payments)) : ?>
120         <table>
121             <tr>
122                 <th>Id</th>
123                 <th>Datum</th>
124                 <th>Typ</th>
125                 <th>Mitglied</th>
126                 <th>Quelle/Ziel</th>
127                 <th>Betrag</th>
128                 <th>Beschreibung</th>
129             </tr>
130         <?php foreach ($payments as $payment) : ?>
131             <tr class="<?=$payment['ptype']?>">
132                 <td style="text-align: right;"><a href="<?=html_escape(link_to('change_' . $payment['ptype'], array('id' => $payment['id'])))?>"><?=html_escape($payment['id'])?></a></td>
133                 <td><?=html_escape(format_date(db_date2unixtime($payment['date'])))?></td>
134                 <td><?=html_escape($payment['ptype'] == 'earning'? $EARNING_TYPES[$payment['type']] : $EXPENSE_TYPES[$payment['type']])?></td>
135                 <td><?php if ($payment['member_id'] != 0) : ?><a href="<?=html_escape(link_to('view_member', array('id'=> $payment['member_id'])))?>"><?=html_escape($payment['nickname'])?><?php endif ?></a></td>
136                 <td><?=html_escape($ACCOUNT_TYPES[$payment['account']])?></td>
137                 <td style="text-align: right;"><?=html_escape(format_money(($payment['ptype'] == 'earning'? 1 : -1)  * $payment['value']))?></td>
138                 <td><?=html_escape($payment['description'])?></td>
139             </tr>
140         <?php endforeach ?>
141         </table>
142     <?php else : ?>
143         <p>Bisher gibt's noch keine abgeschlossenen Zahlungen.</p>
144     <?php endif ?>
145     <?php
146
147 }/*}}}*/
148