Renamed dtaus.php and prepared for PAIN.
[memberdb.git] / include / directdebit.php
1 <?php
2
3
4 function action_directdebit() {
5     $members = db_get_members();
6     if (empty($members)) return;
7
8     $debits = array();
9     $cash_payments = array();
10     foreach ($members as $member) {
11                 if (empty($member['directdebit'])) {
12                         // Barzahler
13                         $open = bcsub(fees_sum_for_member($member['id'], time()), bcadd(finance_get_paid_fees_for_member($member['id']), finance_get_paid_fees_for_member($member['id'], true)));
14                         if (bccomp($open, 0) != 1) continue;
15                         $cash_payments[] = array(
16                                 'member_id'     => $member['id'],
17                                 'member_number' => $member['number'],
18                                 'nickname'      => $member['nickname'],
19                                 'amount'        => $open
20                         );
21                         continue;
22                 }
23         $info = fee_next_directdebit_for_member($member['id'], time());
24         if (empty($info)) continue;
25         $debits[] = array(
26             'member_id'     => $member['id'],
27             'member_number' => $member['number'],
28             'nickname'      => $member['nickname'],
29             'accountholder' => $member['accountholder'],
30             'accountnumber' => $member['accountnumber'],
31             'bankcode'      => $member['bankcode'],
32 //          'bankname'      => $member['bankname'],
33             'amount'        => $info['value'],
34             'amountcent'    => '' . (int)round(bcmul($info['value'], 100)),
35             'purpose'       => $info['info']
36         );
37     }
38
39     js_modal_windows();
40     js_get_master_key();
41
42 ?>
43     <noscript>
44         <p class="error">
45             <strong>Achtung:</strong> Ohne JavaScript geht hier gar nichts. Bitte aktivieren!
46         </p>
47     </noscript>
48 <?php if (!empty($cash_payments)) : ?>
49 <h2>Barzahler</h2>
50 <table>
51     <tr>
52         <th>Mitgliedsnummer</th>
53         <th>Nickname</th>
54         <th style="text-align: right;">Betrag</th>
55                 <th></th>
56         </tr>
57 <?php foreach ($cash_payments as $payment) : ?>
58     <tr>
59         <td><a href="<?=html_escape(link_to('fees', array('member_id'=> $payment['member_id'])))?>"><?=html_escape($payment['member_number'])?></a></td>
60         <td><?=html_escape($payment['nickname'])?></td>
61         <td style="text-align: right;"><?=html_escape(format_money($payment['amount']))?></td>
62                 <td>
63                         <form action="<?=link_to('create_earning')?>" method="post" class="clearfix">
64                                 <?=html_hidden_field('date', format_date(time()))?>
65                                 <?=html_hidden_field('type', 'fee')?>
66                                 <?=html_hidden_field('status', 'paid')?>
67                                 <?=html_hidden_field('value', format_money($payment['amount']))?>
68                                 <?=html_hidden_field('member_id', $payment['member_id'])?>
69                                 <?=html_hidden_field('description', '')?>
70                                 <?=html_hidden_field('account', 'cash')?>
71                                 <input class="submit" type="submit" name="submit" value="Einnahme verbuchen"/>
72                         </form>
73                 </td>
74     </tr>
75 <?php endforeach ?>
76 </table>
77 <?php endif ?>
78
79 <h2>Bankeinzug</h2>
80 <table>
81     <tr>
82         <th>Mitgliedsnummer</th>
83         <th>Nickname</th>
84         <th>Verwendungszweck</th>
85         <th style="text-align: right;">Betrag</th>
86     </tr>
87 <?php $total = 0; ?>
88 <?php foreach ($debits as $debit) : ?>
89     <tr>
90         <td><a href="<?=html_escape(link_to('fees', array('member_id'=> $debit['member_id'])))?>"><?=html_escape($debit['member_number'])?></a></td>
91         <td><?=html_escape($debit['nickname'])?></td>
92         <td><?=html_escape($debit['purpose'])?></td>
93         <td style="text-align: right;"><?=html_escape(format_money($debit['amount']))?></td>
94     </tr>
95     <?php $total = bcadd($total, $debit['amount']); ?>
96 <?php endforeach ?>
97     <tr class="total">
98         <td>Gesamt</td>
99         <td></td>
100         <td></td>
101         <td style="text-align: right;"><?=html_escape(format_money($total))?></td>
102     </tr>
103 </table>
104
105 <!-- ?=html_hidden_field('directdebittype', 'pain')? -->
106 <?=html_list_box('Dateiformat', 'directdebittype', array('dtaus' => 'DTAUS', 'pain' => 'PAIN'), 'pain');?>
107 <input class="submit" type="button" name="btn_directdebit" value="Datei erzeugen" onclick="ask_for_password()" id="btn_directdebit"/>
108 <br/>
109 <br/>
110 <form action="<?=link_to('create_earnings')?>" method="post" class="clearfix">
111 <?php $count = 0; ?>
112 <?php foreach ($debits as $debit) : ?>
113     <?=html_hidden_field(sprintf('earnings[%d][date]',        $count), format_date(time()))?>
114     <?=html_hidden_field(sprintf('earnings[%d][type]',        $count), 'fee')?>
115     <?=html_hidden_field(sprintf('earnings[%d][status]',      $count), 'paid')?>
116     <?=html_hidden_field(sprintf('earnings[%d][value]',       $count), $debit['amount'])?>
117     <?=html_hidden_field(sprintf('earnings[%d][member_id]',   $count), $debit['member_id'])?>
118     <?=html_hidden_field(sprintf('earnings[%d][description]', $count), $debit['purpose'])?>
119     <?php $count++; ?>
120 <?php endforeach ?>
121 <input class="submit" type="submit" name="btn_create_earnings" value="Einnahmen verbuchen"/>
122 </form>
123
124 <a href="<?=link_to('export_ibanhin')?>">IBAN-hin Export</a>
125
126 <div id="password_popup" class="modal_window">
127     <fieldset>
128         <legend>Passwortabfrage</legend>
129         <?=html_password_field('Passwort', 'password')?>
130         <input class="submit" type="button" name="btn_generate_directdebit" value="DTAUS erzeugen" onclick="generate_directdebit()"/>
131         <input class="submit" type="button" name="btn_cancel" value="Abbrechen" onclick="cancel_ask_for_password()"/>
132     </fieldset>
133 </div>
134 <div id="directdebit_popup" class="modal_window">
135     <fieldset>
136         <legend>DTAUS</legend>
137             <textarea id="directdebit_content" style="width: 100%" rows="30" readonly="readonly"></textarea>
138             <input class="submit" type="button" name="btn_directdebit_close" value="Schließen" onclick="directdebit_close()"/>
139     </fieldset>
140 </div>
141
142 <script type="text/javascript">
143
144 var debits = new Array(
145     <?=join(",\n", array_map('json_encode', $debits)) ?>
146 );
147
148
149 $(document).ready(function(){  
150     $('#password').keypress( function(event) { if (event.keyCode == '13') { generate_directdebit(); } });
151     $('#btn_directdebit').focus();
152 });  
153
154
155 function ask_for_password() {/*{{{*/
156     modal_window_show($("#password_popup"));
157     $("#password").focus();
158     return;
159 }/*}}}*/
160
161 function cancel_ask_for_password() {/*{{{*/
162     modal_window_hide();
163     $("#btn_directdebit").focus();
164     return;
165 }/*}}}*/
166
167
168 function generate_directdebit() {/*{{{*/
169
170     var password = $('#password').val();
171     var directdebitcontent = "";
172     $("#password").val('');
173
174     // We pass a closure so that get_master_key may defer execution
175     get_master_key(password, function(masterkey) {
176
177         modal_window_replace($("#directdebit_popup"));
178
179     switch ($('#directdebittype').val()) {
180         case "dtaus":
181             if (!DTAUS.setAccountFileSender('<?=dtaus_string(ACCOUNT_HOLDER)?>', '<?=BANK_CODE?>', '<?=ACCOUNT_NUMBER?>')) {
182                 $('#directdebit_content').val(DTAUS.errormsg);
183                 return;
184             }
185
186             for (var i = 0; i < debits.length; i++) {
187                 var accountholder = debits[i]['accountholder'];
188                 var accountnumber = debits[i]['accountnumber'];
189                 var bankcode      = debits[i]['bankcode'];
190
191                 // Encrypt/Decrypt data using AES with masterkey
192                 if (accountholder != "") accountholder = Crypto.charenc.UTF8.bytesToString(Crypto.AES.decrypt(accountholder, masterkey));
193                 if (accountnumber != "") accountnumber = Crypto.charenc.UTF8.bytesToString(Crypto.AES.decrypt(accountnumber, masterkey));
194                 if (bankcode      != "") bankcode      = Crypto.charenc.UTF8.bytesToString(Crypto.AES.decrypt(bankcode,      masterkey));
195
196                 accountholder = DTAUS.prepareString(accountholder);
197
198                 if (!DTAUS.addExchange(accountholder, bankcode, accountnumber, '', debits[i]['amountcent'], debits[i]['purpose'])) {
199                     $('#directdebit_content').val('Mitglied ' + debits[i]['member_number'] + ' ' + accountholder + '\n' + DTAUS.errormsg);
200                     return;
201                 }
202             }
203             directdebitcontent = DTAUS.getFileContent();
204             break;
205             
206         case "pain":
207             // TODO
208
209             directdebitcontent = "Schmerz lass nach!";
210             break;
211         }
212         $('#directdebit_content').val(directdebitcontent);
213         $('#directdebit_content').focus();
214         $('#directdebit_content').select();
215     });
216
217 }/*}}}*/
218
219 function directdebit_close() {/*{{{*/
220     modal_window_hide();
221     $("#directdebit_content").val('');
222 }/*}}}*/
223
224
225
226 </script>
227 <?
228 }
229
230 // borrowed from PEARs Payment_DTA
231 function dtaus_string($string) {
232     if (strlen($string) == 0) return '';
233     $special_chars = array(
234         'á' => 'a',
235         'à' => 'a',
236         'ä' => 'ae',
237         'â' => 'a',
238         'ã' => 'a',
239         'å' => 'a',
240         'æ' => 'ae',
241         'ā' => 'a',
242         'ă' => 'a',
243         'ą' => 'a',
244         'ȁ' => 'a',
245         'ȃ' => 'a',
246         'Á' => 'A',
247         'À' => 'A',
248         'Ä' => 'Ae',
249         'Â' => 'A',
250         'Ã' => 'A',
251         'Å' => 'A',
252         'Æ' => 'AE',
253         'Ā' => 'A',
254         'Ă' => 'A',
255         'Ą' => 'A',
256         'Ȁ' => 'A',
257         'Ȃ' => 'A',
258         'ç' => 'c',
259         'ć' => 'c',
260         'ĉ' => 'c',
261         'ċ' => 'c',
262         'č' => 'c',
263         'Ç' => 'C',
264         'Ć' => 'C',
265         'Ĉ' => 'C',
266         'Ċ' => 'C',
267         'Č' => 'C',
268         'ď' => 'd',
269         'đ' => 'd',
270         'Ď' => 'D',
271         'Đ' => 'D',
272         'é' => 'e',
273         'è' => 'e',
274         'ê' => 'e',
275         'ë' => 'e',
276         'ē' => 'e',
277         'ĕ' => 'e',
278         'ė' => 'e',
279         'ę' => 'e',
280         'ě' => 'e',
281         'ȅ' => 'e',
282         'ȇ' => 'e',
283         'É' => 'E',
284         'È' => 'E',
285         'Ê' => 'E',
286         'Ë' => 'E',
287         'Ē' => 'E',
288         'Ĕ' => 'E',
289         'Ė' => 'E',
290         'Ę' => 'E',
291         'Ě' => 'E',
292         'Ȅ' => 'E',
293         'Ȇ' => 'E',
294         'ĝ' => 'g',
295         'ğ' => 'g',
296         'ġ' => 'g',
297         'ģ' => 'g',
298         'Ĝ' => 'G',
299         'Ğ' => 'G',
300         'Ġ' => 'G',
301         'Ģ' => 'G',
302         'ĥ' => 'h',
303         'ħ' => 'h',
304         'Ĥ' => 'H',
305         'Ħ' => 'H',
306         'ì' => 'i',
307         'ì' => 'i',
308         'î' => 'i',
309         'ï' => 'i',
310         'ĩ' => 'i',
311         'ī' => 'i',
312         'ĭ' => 'i',
313         'į' => 'i',
314         'ı' => 'i',
315         'ij' => 'ij',
316         'ȉ' => 'i',
317         'ȋ' => 'i',
318         'Í' => 'I',
319         'Ì' => 'I',
320         'Î' => 'I',
321         'Ï' => 'I',
322         'Ĩ' => 'I',
323         'Ī' => 'I',
324         'Ĭ' => 'I',
325         'Į' => 'I',
326         'İ' => 'I',
327         'IJ' => 'IJ',
328         'Ȉ' => 'I',
329         'Ȋ' => 'I',
330         'ĵ' => 'j',
331         'Ĵ' => 'J',
332         'ķ' => 'k',
333         'Ķ' => 'K',
334         'ĺ' => 'l',
335         'ļ' => 'l',
336         'ľ' => 'l',
337         'ŀ' => 'l',
338         'ł' => 'l',
339         'Ĺ' => 'L',
340         'Ļ' => 'L',
341         'Ľ' => 'L',
342         'Ŀ' => 'L',
343         'Ł' => 'L',
344         'ñ' => 'n',
345         'ń' => 'n',
346         'ņ' => 'n',
347         'ň' => 'n',
348         'ʼn' => 'n',
349         'Ñ' => 'N',
350         'Ń' => 'N',
351         'Ņ' => 'N',
352         'Ň' => 'N',
353         'ó' => 'o',
354         'ò' => 'o',
355         'ö' => 'oe',
356         'ô' => 'o',
357         'õ' => 'o',
358         'ø' => 'o',
359         'ō' => 'o',
360         'ŏ' => 'o',
361         'ő' => 'o',
362         'œ' => 'oe',
363         'ȍ' => 'o',
364         'ȏ' => 'o',
365         'Ó' => 'O',
366         'Ò' => 'O',
367         'Ö' => 'Oe',
368         'Ô' => 'O',
369         'Õ' => 'O',
370         'Ø' => 'O',
371         'Ō' => 'O',
372         'Ŏ' => 'O',
373         'Ő' => 'O',
374         'Œ' => 'OE',
375         'Ȍ' => 'O',
376         'Ȏ' => 'O',
377         'ŕ' => 'r',
378         'ř' => 'r',
379         'ȑ' => 'r',
380         'ȓ' => 'r',
381         'Ŕ' => 'R',
382         'Ř' => 'R',
383         'Ȑ' => 'R',
384         'Ȓ' => 'R',
385         'ß' => 'ss',
386         'ś' => 's',
387         'ŝ' => 's',
388         'ş' => 's',
389         'š' => 's',
390         'ș' => 's',
391         'Ś' => 'S',
392         'Ŝ' => 'S',
393         'Ş' => 'S',
394         'Š' => 'S',
395         'Ș' => 'S',
396         'ţ' => 't',
397         'ť' => 't',
398         'ŧ' => 't',
399         'ț' => 't',
400         'Ţ' => 'T',
401         'Ť' => 'T',
402         'Ŧ' => 'T',
403         'Ț' => 'T',
404         'ú' => 'u',
405         'ù' => 'u',
406         'ü' => 'ue',
407         'û' => 'u',
408         'ũ' => 'u',
409         'ū' => 'u',
410         'ŭ' => 'u',
411         'ů' => 'u',
412         'ű' => 'u',
413         'ų' => 'u',
414         'ȕ' => 'u',
415         'ȗ' => 'u',
416         'Ú' => 'U',
417         'Ù' => 'U',
418         'Ü' => 'Ue',
419         'Û' => 'U',
420         'Ũ' => 'U',
421         'Ū' => 'U',
422         'Ŭ' => 'U',
423         'Ů' => 'U',
424         'Ű' => 'U',
425         'Ų' => 'U',
426         'Ȕ' => 'U',
427         'Ȗ' => 'U',
428         'ŵ' => 'w',
429         'Ŵ' => 'W',
430         'ý' => 'y',
431         'ÿ' => 'y',
432         'ŷ' => 'y',
433         'Ý' => 'Y',
434         'Ÿ' => 'Y',
435         'Ŷ' => 'Y',
436         'ź' => 'z',
437         'ż' => 'z',
438         'ž' => 'z',
439         'Ź' => 'Z',
440         'Ż' => 'Z',
441         'Ž' => 'Z',
442     );
443
444
445     $result = strtr($string, $special_chars);   // replace known special chars
446     $result = strtoupper($result);                  // upper case
447     // make sure every special char is replaced by one space, not two or three
448     $result = mb_convert_encoding($result, 'ASCII', 'UTF-8');
449     $result = preg_replace('/[^A-Z0-9 \.,&\-\/\+\*\$%]/', ' ', $result);
450
451     return $result;
452 }
453