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