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