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