Kennziffern hinzugefügt, Berechnungen der Zwischensummen verbessert,
[kivitendo-erp.git] / bin / mozilla / ustva.pl
1 #!/bin/perl
2 #=====================================================================
3 # Lx-Office ERP
4 # Copyright (c) 2004 by Udo Spallek, Aachen
5 #
6 #  Author: Udo Spallek
7 #   Email: udono@gmx.net
8 #     Web: http://www.lx-office.org
9 #
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #======================================================================
24 # German Tax authority Module and later ELSTER Interface
25 #======================================================================
26
27 require "$form->{path}/arap.pl";
28
29 #use strict;
30 #no strict 'refs';
31 #use diagnostics;
32 #use warnings; # FATAL=> 'all';
33 #use vars qw($locale $form %myconfig);
34 #our ($myconfig);
35 #use CGI::Carp "fatalsToBrowser";
36
37 use SL::PE;
38 use SL::RP;
39 use SL::USTVA;
40 use SL::User;
41 1;
42
43 # this is for our long dates
44 # $locale->text('January')
45 # $locale->text('February')
46 # $locale->text('March')
47 # $locale->text('April')
48 # $locale->text('May ')
49 # $locale->text('June')
50 # $locale->text('July')
51 # $locale->text('August')
52 # $locale->text('September')
53 # $locale->text('October')
54 # $locale->text('November')
55 # $locale->text('December')
56
57 # this is for our short month
58 # $locale->text('Jan')
59 # $locale->text('Feb')
60 # $locale->text('Mar')
61 # $locale->text('Apr')
62 # $locale->text('May')
63 # $locale->text('Jun')
64 # $locale->text('Jul')
65 # $locale->text('Aug')
66 # $locale->text('Sep')
67 # $locale->text('Oct')
68 # $locale->text('Nov')
69 # $locale->text('Dec')
70
71 # $form->parse_html_template('generic/util_hidden_variables');
72
73 #############################
74
75 sub report {
76   $lxdebug->enter_sub();
77
78   my $myconfig = \%myconfig;
79
80   $form->{title} = $locale->text('UStVA');
81   $form->{kz10}  = '';                       #Berichtigte Anmeldung? Ja =1 Nein=0
82
83   my $year = substr($form->datetonum($form->current_date(\%myconfig), \%myconfig ),
84              0, 4);
85
86   my $department = '';
87   local $hide = '';
88   $form->header;
89
90   # Einlesen der Finanzamtdaten
91   &get_config($userspath, 'finanzamt.ini');
92
93   # Hier Einlesen der user-config
94   # steuernummer entfernt für prerelease
95   my @a = qw(
96     signature      name          company       address        businessnumber 
97     tel            fax           email         co_chief       co_department 
98     co_custom1     co_custom2    co_custom3    co_custom4     co_custom5
99     co_name1       co_name2      co_street     co_street1     co_zip 
100     co_city        co_city1      co_country    co_tel         co_tel1 
101     co_tel2        co_fax        co_fax1       co_email       co_email1
102     co_url         co_url1       ustid         duns           co_bankname 
103     co_bankname1   co_bankname2  co_bankname3  co_blz         co_blz1
104     co_blz2        co_blz3       co_accountnr  co_accountnr1  co_accountnr2 
105     co_accountnr3
106   );
107
108   map { $form->{$_} = $myconfig->{$_} } @a;
109
110   my $openings = $form->{FA_Oeffnungszeiten};
111   $openings =~ s/\\\\n/<br>/g;
112
113   my $company_given = ($form->{company} ne '') 
114     ? qq|<h3>$form->{company}</h3>\n|
115     : qq|<a href=am.pl?path=$form->{path}&action=config|
116       . qq|&level=Programm--Preferences&login=$form->{login}|
117       . qq|&password=$form->{password}>| 
118       . $locale->text('No Company Name given') . qq|!</a><br>|;
119
120
121   # Anpassungen der Variablennamen auf pre 2.1.1 Namen
122   # klären, ob $form->{company_street|_address} gesetzt sind
123   if ($form->{address} ne '') {
124     my $temp = $form->{address};
125     $temp =~ s/\\n/<br \/>/;
126     ($form->{co_street}, $form->{co_city}) = split("<br \/>", $temp);
127     $form->{co_city} =~ s/\\n//g;
128   }
129
130
131   my $address_given = 
132     ($form->{co_street} ne '' 
133       and ( 
134         $form->{co_zip} ne ''
135           or $form->{co_city} ne ''
136       )
137     ) 
138     ? qq|$form->{co_street}<br>|
139         . qq|$form->{co_street1}<br>|
140         . qq|$form->{co_zip} $form->{co_city}|
141     : qq|<a href=am.pl?path=$form->{path}&action=config|
142         . qq|&level=Programm--Preferences&login=$form->{login}|
143         . qq|&password=$form->{password}>| 
144         . $locale->text('No Company Address given') 
145         . qq|!</a>\n|;
146
147   $form->{co_email} = $form->{email} unless $form->{co_email};
148   $form->{co_tel}   = $form->{tel}   unless $form->{co_tel};
149   $form->{co_fax}   = $form->{fax}   unless $form->{co_fax};
150   $form->{co_url}   = $form->{urlx}  unless $form->{co_url};
151
152   my $taxnumber_given = ($form->{steuernummer} ne '')
153     ? qq|$form->{steuernummer}|
154     : qq|<a href="ustva.pl?path=$form->{path}&action="config_step1"|
155       . qq|&level=Programm--Finanzamteinstellungen&login=$form->{login}|
156       . qq|&password=$form->{password}">Keine Steuernummer hinterlegt!|
157       . qq|</a><br>|;
158
159   my $ustva_vorauswahl = &ustva_vorauswahl();
160
161   my @all_years = $form->all_years(\%myconfig);
162
163   my $select_year = qq|<select name=year title="| 
164     . $locale->text('Year') . qq|">|;
165   foreach my $key (@all_years) {
166     $select_year .= qq|<option |;
167     $select_year .= qq|selected| if ($key eq $form->{year});
168     $select_year .= qq| >$key</option>|;
169   }
170   $select_year   .=  qq|</select>|;
171
172   my $_checked = '';
173   $_checked = "checked" if ($form->{kz10} eq '1');
174   my $checkbox_kz_10 = qq|<input name="FA_10" id=FA_10 class=checkbox|
175     . qq| type=checkbox value="1" $_checked title = "|
176     . $locale->text('Amended Advance Turnover Tax Return (Nr. 10)')
177     . qq|">| 
178     . $locale->text('Amended Advance Turnover Tax Return'); 
179
180   my $method_local = ($form->{method} eq 'accrual') ? $locale->text('accrual') 
181                    : ($form->{method} eq 'cash')    ? $locale->text('cash')
182                    : '';
183
184   my $period_local = ( $form->{FA_voranmeld} eq 'month')   ? $locale->text('month')
185                    : ( $form->{FA_voranmeld} eq 'quarter') ? $locale->text('quarter')
186                    : '';  
187
188   my $tax_office_banks_ref = [
189     { BLZ             => $form->{FA_BLZ_1},
190       Kontonummer     => $form->{FA_Kontonummer_1},
191       Bankbezeichnung => $form->{FA_Bankbezeichnung_1}
192     },
193     { BLZ             => $form->{FA_BLZ_2},
194       Kontonummer     => $form->{FA_Kontonummer_2},
195       Bankbezeichnung => $form->{FA_Bankbezeichnung_oertlich}
196     }
197   ];
198  
199   
200   my $template_ref = {
201     openings         => $openings,  
202     company_given    => $company_given,
203     address_given    => $address_given,     
204     taxnumber_given  => $taxnumber_given,
205     select_year      => $select_year,      
206     period_local     => $period_local,
207     method_local     => $method_local,
208     ustva_vorauswahl => $ustva_vorauswahl,
209     checkbox_kz_10   => $checkbox_kz_10,
210     tax_office_banks => $tax_office_banks_ref,    
211     select_options   => &show_options,    
212   };
213   
214   print($form->parse_html_template('ustva/report', $template_ref));
215
216
217
218   $lxdebug->leave_sub();
219 }
220
221
222
223 sub help {
224   $lxdebug->enter_sub();
225
226   # parse help documents under doc
227   my $tmp = $form->{templates};
228   $form->{templates} = 'doc';
229   $form->{help}      = 'ustva';
230   $form->{type}      = 'help';
231   $form->{format}    = 'html';
232   &generate_ustva();
233
234   #$form->{templates} = $tmp;
235   $lxdebug->leave_sub();
236 }
237
238 sub show {
239   $lxdebug->enter_sub();
240
241   #&generate_ustva();
242   no strict 'refs';
243   $lxdebug->leave_sub();
244   &{ $form->{nextsub} };
245   use strict 'refs';
246 }
247
248 sub ustva_vorauswahl {
249   $lxdebug->enter_sub();
250
251   my $select_vorauswahl;
252
253   #Aktuelles Datum zerlegen:
254   my $date = $form->datetonum($form->current_date(\%myconfig), \%myconfig);
255
256   #$locale->date($myconfig, $form->current_date($myconfig), 0)=~ /(\d\d).(\d\d).(\d\d\d\d)/;
257   $form->{day}   = substr($date, 6, 2);
258   $form->{month} = substr($date, 4, 2);
259   $form->{year}  = substr($date, 0, 4);
260   $lxdebug->message(LXDebug::DEBUG1, qq|
261     Actual date from Database: $date\n    
262     Actual year from Database: $form->{year}\n
263     Actual day from Database: $form->{day}\n
264     Actual month from Database: $form->{month}\n|);
265
266   my $sel    = '';
267   my $yymmdd = '';
268
269   # Testdaten erzeugen:
270   #$form->{day}= '11';
271   #$form->{month}= '01';
272   #$form->{year}= 2004;
273   $select_vorauswahl = qq|
274      <input type=hidden name=day value=$form->{day}>
275      <input type=hidden name=month value=$form->{month}>
276      <input type=hidden name=yymmdd value=$yymmdd>
277      <input type=hidden name=sel value=$sel>
278   |;
279
280   if ($form->{FA_voranmeld} eq 'month') {
281
282     # Vorauswahl bei monatlichem Voranmeldungszeitraum
283
284     my %liste = ('01' => $locale->text('January'),
285                  '02' => $locale->text('February'),
286                  '03' => $locale->text('March'),
287                  '04' => $locale->text('April'),
288                  '05' => $locale->text('May'),
289                  '06' => $locale->text('June'),
290                  '07' => $locale->text('July'),
291                  '08' => $locale->text('August'),
292                  '09' => $locale->text('September'),
293                  '10' => $locale->text('October'),
294                  '11' => $locale->text('November'),
295                  '12' => $locale->text('December'),
296                  '13' => $locale->text('Yearly'),
297                 );
298
299     my $yy = $form->{year} * 10000;
300     $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
301     $sel    = '';
302     my $dfv = '';
303
304     # Offset für Dauerfristverlängerung
305     $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
306
307   SWITCH: {
308       $yymmdd <= ($yy + 110 + $dfv) && do {
309         $form->{year} = $form->{year} - 1;
310         $sel = '12';
311         last SWITCH;
312       };
313       $yymmdd <= ($yy + 210 + $dfv) && do {
314         $sel = '01';
315         last SWITCH;
316       };
317       $yymmdd <= ($yy + 310 + $dfv) && do {
318         $sel = '02';
319         last SWITCH;
320       };
321       $yymmdd <= ($yy + 410 + $dfv) && do {
322         $sel = '03';
323         last SWITCH;
324       };
325       $yymmdd <= ($yy + 510 + $dfv) && do {
326         $sel = '04';
327         last SWITCH;
328       };
329       $yymmdd <= ($yy + 610 + $dfv) && do {
330         $sel = '05';
331         last SWITCH;
332       };
333       $yymmdd <= ($yy + 710 + $dfv) && do {
334         $sel = '06';
335         last SWITCH;
336       };
337       $yymmdd <= ($yy + 810 + $dfv) && do {
338         $sel = '07';
339         last SWITCH;
340       };
341       $yymmdd <= ($yy + 910 + $dfv) && do {
342         $sel = '08';
343         last SWITCH;
344       };
345       $yymmdd <= ($yy + 1010 + $dfv) && do {
346         $sel = '09';
347         last SWITCH;
348       };
349       $yymmdd <= ($yy + 1110 + $dfv) && do {
350         $sel = '10';
351         last SWITCH;
352       };
353       $yymmdd <= ($yy + 1210) && do {
354         $sel = '11';
355         last SWITCH;
356       };
357       $yymmdd <= ($yy + 1231) && do {
358         $sel = '12';
359         last SWITCH;
360       };
361
362     }
363     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
364   . $locale->text('Select a period') . qq|" >|;
365
366     my $key = '';
367     foreach $key (sort keys %liste) {
368       my $selected = '';
369       $selected = 'selected' if ($sel eq $key);
370       $select_vorauswahl .= qq|
371          <option value="$key" $selected> $liste{$key}</option>
372       |;
373     }
374     $select_vorauswahl .= qq|</select>|;
375
376   } elsif ($form->{FA_voranmeld} eq 'quarter') {
377
378     # Vorauswahl bei quartalsweisem Voranmeldungszeitraum
379     my %liste = ('41'  => $locale->text('1. Quarter'),
380                  '42'  => $locale->text('2. Quarter'),
381                  '43'  => $locale->text('3. Quarter'),
382                  '44'  => $locale->text('4. Quarter'),
383                  '13' => $locale->text('Yearly'),);
384
385     my $yy = $form->{year} * 10000;
386     $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
387     $sel    = '';
388     my $dfv = '';    # Offset für Dauerfristverlängerung
389     $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
390
391   SWITCH: {
392       $yymmdd <= ($yy + 110 + $dfv) && do {
393         $form->{year} = $form->{year} - 1;
394         $sel = '44';
395         last SWITCH;
396       };
397       $yymmdd <= ($yy + 410 + $dfv) && do {
398         $sel = '41';
399         last SWITCH;
400       };
401       $yymmdd <= ($yy + 710 + $dfv) && do {
402         $sel = '42';
403         last SWITCH;
404       };
405       $yymmdd <= ($yy + 1010 + $dfv) && do {
406         $sel = '43';
407         last SWITCH;
408       };
409       $yymmdd <= ($yy + 1231) && do {
410         $sel = '44';
411       };
412     }
413
414     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
415       . $locale->text('Select a period') . qq|" >|;
416     my $key = '';
417     foreach $key (sort keys %liste) {
418       my $selected = '';
419       $selected = 'selected' if ($sel eq $key);
420       $select_vorauswahl .= qq|
421          <option value="$key" $selected>$liste{$key}</option>
422      |;
423     }
424     $select_vorauswahl .= qq|\n</select>
425    |;
426
427   } else {
428
429     # keine Vorauswahl bei Voranmeldungszeitraum
430     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
431       . $locale->text('Select a period') . qq|" >|;
432
433     my %listea = ('41' => '1. Quarter',
434                   '42' => '2. Quarter',
435                   '43' => '3. Quarter',
436                   '44' => '4. Quarter',);
437
438     my %listeb = ('01' => 'January',
439                   '02' => 'February',
440                   '03' => 'March',
441                   '04' => 'April',
442                   '05' => 'May',
443                   '06' => 'June',
444                   '07' => 'July',
445                   '08' => 'August',
446                   '09' => 'September',
447                   '10' => 'October',
448                   '11' => 'November',
449                   '12' => 'December',
450                   '13' => 'Yearly',);
451     my $key = '';
452     foreach $key (sort keys %listea) {
453       $select_vorauswahl .= qq|
454          <option value="$key">|
455         . $locale->text("$listea{$key}")
456         . qq|</option>\n|;
457     }
458
459     foreach $key (sort keys %listeb) {
460       $select_vorauswahl .= qq|
461          <option value="$key">|
462         . $locale->text("$listeb{$key}")
463         . qq|</option>\n|;
464     }
465     $select_vorauswahl .= qq|</select>|;
466   }
467   $lxdebug->leave_sub();
468   
469   return $select_vorauswahl;
470 }
471
472 #sub config {
473 #  $lxdebug->enter_sub();
474 #  config_step1();
475 #  $lxdebug->leave_sub();
476 #}
477
478 sub debug {
479   $lxdebug->enter_sub();
480   $form->debug();
481   $lxdebug->leave_sub();
482 }
483
484 sub show_options {
485   $lxdebug->enter_sub();
486
487   #  $form->{PD}{$form->{type}} = "selected";
488   #  $form->{DF}{$form->{format}} = "selected";
489   #  $form->{OP}{$form->{media}} = "selected";
490   #  $form->{SM}{$form->{sendmode}} = "selected";
491   my $type   = qq|      <input type=hidden name="type" value="ustva">|;
492   my $media  = qq|      <input type=hidden name="media" value="screen">|;
493   my $format =
494       qq|       <option value=html selected>|
495     . $locale->text('Preview')
496     . qq|</option>|;
497   if ($latex_templates) {
498     $format .=
499         qq|    <option value=pdf>|
500       . $locale->text('UStVA (PDF-Dokument)')
501       . qq|</option>|;
502   }
503
504   #my $disabled= qq|disabled="disabled"|;
505   #$disabled='' if ($form->{elster} eq '1' );
506   if ($form->{elster} eq '1') {
507     $format .=
508         qq|<option value=elsterwinston>|
509       . $locale->text('ELSTER Export (Winston)')
510       . qq|</option>|
511       . qq|<option value=elstertaxbird>|
512       . $locale->text('ELSTER Export (Taxbird)')
513       . qq|</option>|;      
514   }
515
516   #$format .= qq|<option value=elster>|.$locale->text('ELSTER Export nach Winston').qq|</option>|;
517   my $show_options = qq|
518     $type
519     $media
520     <select name=format title = "|
521     . $locale->text('Choose Outputformat') . qq|">$format</select>
522   |;
523   $lxdebug->leave_sub();
524   
525   return $show_options;
526 }
527
528 sub generate_ustva {
529   $lxdebug->enter_sub();
530
531   # Aufruf von get_config aus bin/mozilla/ustva.pl zum
532   # Einlesen der Finanzamtdaten aus finanzamt.ini
533
534   get_config($userspath, 'finanzamt.ini');
535
536   # init some form vars
537   my @anmeldungszeitraum =
538     qw('0401' '0402' '0403' '0404' '0405' '0405' '0406' '0407' '0408' '0409' '0410' '0411' '0412' '0441' '0442' '0443' '0444');
539   foreach my $item (@anmeldungszeitraum) {
540     $form->{$item} = "";
541   }
542
543     #forgotten the year --> thisyear
544     if ($form->{year} !~ m/^\d\d\d\d$/) {
545       $form->{year} = substr(
546                              $form->datetonum(
547                                     $form->current_date(\%myconfig), \%myconfig
548                              ),
549                              0, 4);
550       $lxdebug->message(LXDebug::DEBUG1,
551                         qq|Actual year from Database: $form->{year}\n|);
552     }
553
554     #
555     # using dates in ISO-8601 format: yyyymmmdd  for Postgres...
556     #
557     
558     #yearly report
559     if ($form->{period} eq "13") {
560       $form->{fromdate} = "$form->{year}0101";
561       $form->{todate}   = "$form->{year}1231";
562     }
563
564     #Quater reports
565     if ($form->{period} eq "41") {
566       $form->{fromdate} = "$form->{year}0101";
567       $form->{todate}   = "$form->{year}0331";
568       $form->{'0441'}   = "X";
569     }
570     if ($form->{period} eq "42") {
571       $form->{fromdate} = "$form->{year}0401";
572       $form->{todate}   = "$form->{year}0630";
573       $form->{'0442'}   = "X";
574     }
575     if ($form->{period} eq "43") {
576       $form->{fromdate} = "$form->{year}0701";
577       $form->{todate}   = "$form->{year}0930";
578       $form->{'0443'}   = "X";
579     }
580     if ($form->{period} eq "44") {
581       $form->{fromdate} = "$form->{year}1001";
582       $form->{todate}   = "$form->{year}1231";
583       $form->{'0444'}   = "X";
584     }
585
586     #Monthly reports
587   SWITCH: {
588       $form->{period} eq "01" && do {
589         $form->{fromdate} = "$form->{year}0101";
590         $form->{todate}   = "$form->{year}0131";
591         $form->{'0401'}   = "X";
592         last SWITCH;
593       };
594       $form->{period} eq "02" && do {
595         $form->{fromdate} = "$form->{year}0201";
596
597         #this works from 1901 to 2099, 1900 and 2100 fail.
598         my $leap = ($form->{year} % 4 == 0) ? "29" : "28";
599         $form->{todate} = "$form->{year}02$leap";
600         $form->{"0402"} = "X";
601         last SWITCH;
602       };
603       $form->{period} eq "03" && do {
604         $form->{fromdate} = "$form->{year}0301";
605         $form->{todate}   = "$form->{year}0331";
606         $form->{"0403"}   = "X";
607         last SWITCH;
608       };
609       $form->{period} eq "04" && do {
610         $form->{fromdate} = "$form->{year}0401";
611         $form->{todate}   = "$form->{year}0430";
612         $form->{"0404"}   = "X";
613         last SWITCH;
614       };
615       $form->{period} eq "05" && do {
616         $form->{fromdate} = "$form->{year}0501";
617         $form->{todate}   = "$form->{year}0531";
618         $form->{"0405"}   = "X";
619         last SWITCH;
620       };
621       $form->{period} eq "06" && do {
622         $form->{fromdate} = "$form->{year}0601";
623         $form->{todate}   = "$form->{year}0630";
624         $form->{"0406"}   = "X";
625         last SWITCH;
626       };
627       $form->{period} eq "07" && do {
628         $form->{fromdate} = "$form->{year}0701";
629         $form->{todate}   = "$form->{year}0731";
630         $form->{"0407"}   = "X";
631         last SWITCH;
632       };
633       $form->{period} eq "08" && do {
634         $form->{fromdate} = "$form->{year}0801";
635         $form->{todate}   = "$form->{year}0831";
636         $form->{"0408"}   = "X";
637         last SWITCH;
638       };
639       $form->{period} eq "09" && do {
640         $form->{fromdate} = "$form->{year}0901";
641         $form->{todate}   = "$form->{year}0930";
642         $form->{"0409"}   = "X";
643         last SWITCH;
644       };
645       $form->{period} eq "10" && do {
646         $form->{fromdate} = "$form->{year}1001";
647         $form->{todate}   = "$form->{year}1031";
648         $form->{"0410"}   = "X";
649         last SWITCH;
650       };
651       $form->{period} eq "11" && do {
652         $form->{fromdate} = "$form->{year}1101";
653         $form->{todate}   = "$form->{year}1130";
654         $form->{"0411"}   = "X";
655         last SWITCH;
656       };
657       $form->{period} eq "12" && do {
658         $form->{fromdate} = "$form->{year}1201";
659         $form->{todate}   = "$form->{year}1231";
660         $form->{"0412"}   = "X";
661         last SWITCH;
662       };
663     }
664
665
666
667
668   # Get the USTVA
669   USTVA->ustva(\%myconfig, \%$form);
670
671   # reformat Dates to dateformat
672   $form->{fromdate} = $locale->date(\%myconfig, $form->{fromdate}, 0, 0, 0);
673
674   $form->{todate} = $form->current_date(\%myconfig) unless $form->{todate};
675   $form->{todate} = $locale->date(\%myconfig, $form->{todate}, 0, 0, 0);
676
677   $form->{longperiod} =
678     $locale->date(\%myconfig, $form->current_date(\%myconfig), 1, 0, 0);
679
680   # if there are any dates construct a where
681   if ($form->{fromdate} || $form->{todate}) {
682
683     $form->{todate} = $form->current_date($myconfig)  unless ($form->{todate});
684
685     my $longtodate  = $locale->date($myconfig, $form->{todate}, 1, 0, 0);
686     my $shorttodate = $locale->date($myconfig, $form->{todate}, 0, 0, 0);
687
688     my $longfromdate  = $locale->date($myconfig, $form->{fromdate}, 1, 0, 0);
689     my $shortfromdate = $locale->date($myconfig, $form->{fromdate}, 0, 0, 0);
690
691     $form->{this_period} = "$shortfromdate<br>\n$shorttodate";
692     $form->{longperiod}      =
693         $locale->text('for Period')
694       . qq|<br>\n$longfromdate |
695       . $locale->text('to (date)')
696       . qq| $longtodate|;
697   }
698
699   if ($form->{comparefromdate} || $form->{comparetodate}) {
700     my $longcomparefromdate =
701       $locale->date(\%myconfig, $form->{comparefromdate}, 1, 0, 0);
702     my $shortcomparefromdate =
703       $locale->date(\%myconfig, $form->{comparefromdate}, 0, 0, 0);
704
705     my $longcomparetodate =
706       $locale->date(\%myconfig, $form->{comparetodate}, 1, 0, 0);
707     my $shortcomparetodate =
708       $locale->date(\%myconfig, $form->{comparetodate}, 0, 0, 0);
709
710     $form->{last_period} = "$shortcomparefromdate<br>\n$shortcomparetodate";
711     $form->{longperiod} .=
712         "<br>\n$longcomparefromdate "
713       . $locale->text('to (date)')
714       . qq| $longcomparetodate|;
715   }
716
717   $form->{Datum_heute} =
718     $locale->date(\%myconfig, $form->current_date(\%myconfig), 0, 0, 0);
719
720   # setup variables for the form
721   my @a = qw(company businessnumber tel fax email
722     co_chief co_department co_custom1 co_custom2 co_custom3 co_custom4 co_custom5
723     co_name1 co_name2  co_street co_street1 co_zip co_city co_city1 co_country co_tel co_tel1 co_tel2
724     co_fax co_fax1 co_email co_email1 co_url co_url1 ustid duns
725     co_bankname co_bankname1 co_bankname2 co_bankname3 co_blz co_blz1
726     co_blz2 co_blz3 co_accountnr co_accountnr1 co_accountnr2 co_accountnr3);
727
728   map { $form->{$_} = $myconfig{$_} } @a;
729
730   if ($form->{address} ne '') {
731     my $temp = $form->{address};
732     $temp =~ s/\\n/<br \/>/;
733     ($form->{co_street}, $form->{co_city}) = split("<br \/>", $temp);
734     $form->{co_city} =~ s/\\n//g;
735   }
736
737   #
738   # Outputformat specific customisation's
739   #
740
741   my @category_cent = qw(
742     511 861 36   80   971  931  98   96   53   74
743     85  65  66   61   62   67   63   64   59   69 
744     39  83  811  891  Z43  Z45  Z53  Z62  Z65  Z67
745     
746   );
747
748   my @category_euro = qw(
749     41 44 49 43 48 51 86 35 77 76 91 89
750     97 93 95 94 42 60 45 52 73 84 81 
751   );
752
753   if ( $form->{format} eq 'pdf' or $form->{format} eq 'postscript') {
754
755     $form->{IN} = "$form->{type}-$form->{year}.tex";
756     $form->{padding} = "~~";
757     $form->{bold}    = "\textbf{";
758     $form->{endbold} = "}";
759     $form->{br}      = '\\\\';
760
761     # Zahlenformatierung für Latex USTVA Formulare
762
763     foreach my $number (@category_euro) {
764       $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
765     }
766
767     my ${decimal_comma} = ( $myconfig{numberformat} eq '1.000,00'
768          or $myconfig{numberformat} eq '1000,00' ) ? ',':'.';
769
770     foreach my $number (@category_cent) {
771       $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '');
772       $form->{$number} =~ s/${decimal_comma}/~~/g;
773     }
774
775   } elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
776
777     $form->{IN} = $form->{type} . '.html';
778     $form->{padding} = "&nbsp;&nbsp;";
779     $form->{bold}    = "<b>";
780     $form->{endbold} = "</b>";
781     $form->{br}      = "<br>";
782     $form->{address} =~ s/\\n/\n/g;
783
784     foreach $number (@category_cent) {
785       $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
786     }
787     
788     foreach $number (@category_euro) {
789       $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '0');
790     }
791
792   } elsif ( $form->{format} eq 'elsterwinston' ) {
793
794     $form->{IN} = 'winston.xml';
795     
796     #
797     # Build Winston filename
798     #
799     
800     my $file = 'U';     # 1. char 'U' = USTVA
801     $file .= $form->{period};
802     #4. and 5. char = year modulo 100
803     $file .= sprintf("%02d", $form->{year} % 100);
804     #6. to 18. char = Elstersteuernummer
805     #Beispiel: Steuernummer in Bayern
806     #111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
807     $file .= $form->{elsterFFFF};
808     $file .= $form->{elstersteuernummer};
809     #file suffix
810     $file .= '.xml';
811     $form->{tmpfile} = "$userspath/$file";
812
813     $form->{attachment_filename} = "$file";
814  
815     # Zahlenformatierung für Winston
816
817     my $temp_numberformat = $myconfig{numberformat};
818
819     # Numberformat must be '1000.00' for Winston
820
821     $myconfig{numberformat} = '1000.00';
822
823     foreach my $number (@category_cent) {
824       $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
825     }
826     
827     foreach my $number (@category_euro) {
828       $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
829     }
830     # Re-set Numberformat
831     $myconfig{numberformat} = $temp_numberformat;
832
833   }
834
835   elsif ( $form->{format} eq 'elstertaxbird' ) {
836
837     # Define serveral filenames
838     $form->{IN} = 'taxbird.txb';
839
840     $form->{attachment_filename} = "USTVA-" . $form->{period} 
841     . sprintf("%02d", $form->{year} % 100) . ".txb";
842     
843     $form->{tmpfile} = "$userspath/" . $form->{attachment_filename};
844
845     # TODO: set Output to UTF-8 or system Preference
846     #$form->{"iconv"} = Text::Iconv->new($myconfig{dbcharset}, "UTF-8");
847     #my $iconv = $self->{"iconv"};
848     #$iconv->convert($variable);
849
850     if ($form->{period} =~ /^[4]\d$/ ){
851       my %periods = ( # Lx => taxbird
852                    '41' => '12',
853                    '42' => '13',
854                    '43' => '14',
855                    '44' => '15',
856                  );
857     
858       foreach my $quarter ( keys %periods ) {
859         $form->{taxbird_period} = $periods{$quarter} if ( $form->{period} eq $quarter);
860       }
861       
862       my %lands = ( # Lx => taxbird # TODO: besser als array...
863                   'Baden Würtemberg'       => '0',
864                   'Bayern'                 => '1',
865                   'Berlin'                 => '2',
866                   'Brandenburg'            => '3',
867                   'Bremen'                 => '4',
868                   'Hamburg'                => '5',
869                   'Hessen'                 => '6',
870                   'Mecklenburg Vorpommern' => '7',
871                   'Niedersachsen'          => '8',
872                   'Nordrhein Westfalen'    => '9',
873                   'Rheinland Pfalz'        => '10',
874                   'Saarland'               => '11',
875                   'Sachsen'                => '12',
876                   'Sachsen Anhalt'         => '13',
877                   'Schleswig Holstein'     => '14',
878                   'Thüringen'              => '15',
879             );
880
881       foreach my $land ( keys %lands ){
882         $form->{taxbird_land_nr} = $lands{$land} if ($form->{elsterland} eq $land );
883       }
884       
885       $form->{co_zip} = $form->{co_city};
886       $form->{co_zip} =~ s/\D//g;
887       $form->{co_city} =~ s/\d//g;
888       $form->{co_city} =~ s/^\s//g;
889       
890       ($form->{co_phone_prefix}, $form->{co_phone}) = split("-", $form->{tel});
891       $form->{co_phone_prefix} =~ s/\s//g;
892       $form->{co_phone} =~ s/\s//g;
893       
894        $form->{taxbird_steuernummer} = $form->{steuernummer};
895 #      $form->{taxbird_steuernummer} =~ s/\D//g;
896       $form->{taxbird_steuernummer} =~ s/\///; # ersten Querstrich ersetzen
897       
898       # Numberformatting for Taxbird
899       my $temp_numberformat = $myconfig{numberformat};
900
901       # Numberformat must be '1000,00' for Taxbird ?!
902       $myconfig{numberformat} = '1000,00';
903
904       foreach my $number (@category_cent) {
905         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
906       }
907       
908       foreach my $number (@category_euro) {
909         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
910       }
911       # Re-set Numberformat
912       $myconfig{numberformat} = $temp_numberformat;
913       
914     } elsif ($form->{period} =~ /^\d+$/ ) {
915       $form->{period} =~ s/^0//g;
916       my $period = $form->{period};
917       $period * 1;
918       $period--;
919       $form->{period} = $period;
920     } else {
921       $form->header;
922       USTVA::error( $locale->text('Wrong Period' ));
923       exit(0);
924     }
925     
926   } elsif ( $form->{format} eq '' ){ # No format error.
927     $form->header;
928     USTVA::error( $locale->text('Application Error. No Format given' ) . "!");
929     exit(0);
930  
931   } else { # All other Formats are wrong
932     $form->header;
933     USTVA::error( $locale->text('Application Error. Wrong Format') . ": " . $form->{format} );
934     exit(0);
935   }
936
937   if ( $form->{period} eq '13' and $form->{format} ne 'html') {
938     $form->header;
939     USTVA::info(
940       $locale->text(
941       'Yearly taxreport not yet implemented')
942       . '!');
943   }
944     
945   $form->{templates} = $myconfig{templates};
946   $form->{templates} = "doc" if ( $form->{type} eq 'help' );
947
948   $form->parse_template(\%myconfig, $userspath);
949
950   $lxdebug->leave_sub();
951 }
952
953 sub config_step1 {
954   $lxdebug->enter_sub();
955
956   # edit all taxauthority prefs
957
958   $form->header;
959   &get_config($userspath, 'finanzamt.ini');
960
961   my $land = $form->{elsterland};
962   my $amt  = $form->{elsterFFFF};
963
964
965   if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
966     $callback =  qq|$form->{cbscript}|
967                 .qq|?action="config_step1"|
968                 .qq|&login="$form->{cblogin}"|
969                 .qq|&path="$form->{cbpath}"|
970                 .qq|&root="$form->{cbroot}"|
971                 .qq|&rpw="$form->{cbrpw}"|;
972   }
973
974   $form->{title} = $locale->text('Tax Office Preferences');
975
976
977   my $select_tax_office = USTVA->fa_auswahl($land, $amt, &elster_hash());
978   my $checked_accrual = q|checked="checked"| if ($form->{method} eq 'accrual');
979   my $checked_cash = q|checked="checked"| if ($form->{method} eq 'cash');
980   my $checked_monthly = "checked" if ($form->{FA_voranmeld} eq 'month');
981   my $checked_quarterly = "checked" if ($form->{FA_voranmeld} eq 'quarter');
982   my $checked_dauerfristverlaengerung = "checked" if ($form->{FA_dauerfrist} eq '1');
983   my $checked_kz_71 = "checked" if ($form->{FA_71} eq 'X');
984
985   my $_hidden_variables_ref;
986
987   my %_hidden_local_variables = (    
988     'saved'       => $locale->text('Check Details'),
989     'nextsub'     => 'config_step2',
990     'warnung'     => '0',
991   );
992
993   foreach my $variable (keys %_hidden_local_variables) {
994     push @{ $_hidden_variables_ref }, 
995         { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
996   }
997
998   my @_hidden_form_variables = qw(
999     FA_Name             FA_Strasse        FA_PLZ             
1000     FA_Ort              FA_Telefon        FA_Fax           
1001     FA_PLZ_Grosskunden  FA_PLZ_Postfach   FA_Postfach 
1002     FA_BLZ_1            FA_Kontonummer_1  FA_Bankbezeichnung_1  
1003     FA_BLZ_2            FA_Kontonummer_2  FA_Bankbezeichnung_oertlich
1004     FA_Oeffnungszeiten  FA_Email          FA_Internet
1005     steuernummer        elsterland        elstersteuernummer
1006     elsterFFFF          path              login
1007     password
1008   );
1009
1010   foreach my $variable (@_hidden_form_variables) {
1011     push @{ $_hidden_variables_ref}, 
1012         { 'variable' => $variable, 'value' => $form->{$variable} };
1013   }
1014
1015   # hä? kann die weg?
1016   my $steuernummer_new = '';
1017
1018   # Variablen für das Template zur Verfügung stellen
1019   my $template_ref = {
1020      select_tax_office               => $select_tax_office,
1021      checked_accrual                 => $checked_accrual,
1022      checked_cash                    => $checked_cash,
1023      checked_monthly                 => $checked_monthly,
1024      checked_quarterly               => $checked_quarterly,
1025      checked_dauerfristverlaengerung => $checked_dauerfristverlaengerung,
1026      hidden_variables                => $_hidden_variables_ref,
1027      
1028   };
1029   
1030   # Ausgabe des Templates
1031   print($form->parse_html_template('ustva/config_step1', $template_ref));
1032
1033   $lxdebug->leave_sub();
1034 }
1035
1036 sub config_step2 {
1037   $lxdebug->enter_sub();
1038   $form->header();
1039
1040 #  print qq|
1041 #    <body>
1042 #  |;
1043
1044   my $elsterland         = '';
1045   my $elster_amt         = '';
1046   my $elsterFFFF         = '';
1047   my $elstersteuernummer = '';
1048   &get_config($userspath, 'finanzamt.ini')
1049     if ($form->{saved} eq $locale->text('saved'));
1050
1051   # Auf Übergabefehler checken
1052   USTVA::info(  $locale->text('Missing Tax Authoritys Preferences') . "\n"
1053               . $locale->text('USTVA-Hint: Tax Authoritys'))
1054     if (   $form->{elsterFFFF_new} eq 'Auswahl'
1055         || $form->{elsterland_new} eq 'Auswahl');
1056   USTVA::info(  $locale->text('Missing Method!') . "\n"
1057               . $locale->text('USTVA-Hint: Method'))
1058     if ($form->{method} eq '');
1059
1060   # Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
1061   # der vorherigen Maske stattfanden: $change = 1(in der edit sub,
1062   # mittels get_config)
1063
1064   my $change = $form->{elsterland} eq $form->{elsterland_new}
1065     && $form->{elsterFFFF} eq $form->{elsterFFFF_new} ? '0' : '1';
1066   $change = '0' if ($form->{saved} eq $locale->text('saved'));
1067   my $elster_init = &elster_hash();
1068
1069   my %elster_init = %$elster_init;
1070
1071   if ($change eq '1') {
1072
1073     # Daten ändern
1074     $elsterland           = $form->{elsterland_new};
1075     $elsterFFFF           = $form->{elsterFFFF_new};
1076     $form->{elsterland}   = $elsterland;
1077     $form->{elsterFFFF}   = $elsterFFFF;
1078     $form->{steuernummer} = '';
1079     
1080     create_steuernummer();
1081
1082     # rebuild elster_amt
1083     my $amt = '';
1084     foreach $amt (keys %{ $elster_init{ $form->{elsterland} } }) {
1085       $elster_amt = $amt
1086         if ($elster_init{ $form->{elsterland}{$amt} eq $form->{elsterFFFF} });
1087     }
1088
1089     # load the predefined hash data into the FA_* Vars
1090     my @variables = qw(FA_Name FA_Strasse FA_PLZ FA_Ort
1091       FA_Telefon FA_Fax FA_PLZ_Grosskunden FA_PLZ_Postfach
1092       FA_Postfach
1093       FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1094       FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1095       FA_Oeffnungszeiten FA_Email FA_Internet);
1096
1097     for (my $i = 0; $i <= 20; $i++) {
1098       $form->{ $variables[$i] } =
1099         $elster_init->{$elsterland}->{$elsterFFFF}->[$i];
1100     }
1101
1102   } else {
1103
1104     $elsterland = $form->{elsterland};
1105     $elsterFFFF = $form->{elsterFFFF};
1106
1107   }
1108   my $stnr = $form->{steuernummer};
1109   $stnr =~ s/\D+//g;
1110   my $patterncount   = $form->{patterncount};
1111   my $elster_pattern = $form->{elster_pattern};
1112   my $delimiter      = $form->{delimiter};
1113   my $steuernummer = $form->{steuernummer} if ($steuernummer eq '');
1114
1115   $form->{FA_Oeffnungszeiten} =~ s/\\\\n/\n/g;
1116   
1117   
1118
1119   my $input_steuernummer = USTVA->steuernummer_input(
1120                              $form->{elsterland}, 
1121                              $form->{elsterFFFF},
1122                              $form->{steuernummer}
1123   );
1124
1125   $lxdebug->message(LXDebug::DEBUG1, qq|$input_steuernummer|);
1126  
1127
1128   my $_hidden_variables_ref;
1129
1130   my %_hidden_local_variables = (
1131       'elsterland'          => $elsterland,
1132       'elsterFFFF'          => $elsterFFFF,
1133       'warnung'             => $warnung,
1134       'elstersteuernummer'  => $elstersteuernummer,
1135       'steuernummer'        => $stnr,
1136       'lastsub'             => 'config_step1',
1137       'nextsub'             => 'save',
1138       
1139   );
1140   
1141   foreach my $variable (keys %_hidden_local_variables) {
1142     push @{ $_hidden_variables_ref }, 
1143         { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1144   }
1145  
1146   my @_hidden_form_variables = qw(
1147     FA_steuerberater_name   FA_steuerberater_street 
1148     FA_steuerberater_city   FA_steuerberater_tel
1149     FA_voranmeld            method
1150     FA_dauerfrist           FA_71 
1151     elster                  path 
1152     login                   password 
1153     type                    elster_init 
1154     saved                   callback
1155   );
1156
1157
1158
1159   foreach my $variable (@_hidden_form_variables) {
1160     push @{ $_hidden_variables_ref}, 
1161         { 'variable' => $variable, 'value' => $form->{$variable} };
1162   }
1163
1164   my $template_ref = {
1165      tax_office_data                 => $tax_office_data,
1166      input_steuernummer              => $input_steuernummer,
1167      readonly                        => '', #q|disabled="disabled"|,
1168      callback                        => $callback,
1169      hidden_variables                => $_hidden_variables_ref,
1170   };
1171   
1172   # Ausgabe des Templates
1173   print($form->parse_html_template('ustva/config_step2', $template_ref));
1174
1175
1176   $lxdebug->leave_sub();
1177 }
1178
1179 sub create_steuernummer {
1180   $lxdebug->enter_sub();
1181   my $part           = $form->{part};
1182   my $patterncount   = $form->{patterncount};
1183   my $delimiter      = $form->{delimiter};
1184   my $elster_pattern = $form->{elster_pattern};
1185
1186   # rebuild steuernummer and elstersteuernummer
1187   # es gibt eine gespeicherte steuernummer $form->{steuernummer}
1188   # und die parts und delimiter
1189
1190   my $h = 0;
1191   my $i = 0;
1192
1193   my $steuernummer_new       = $part;
1194   my $elstersteuernummer_new = $form->{elster_FFFF};
1195   $elstersteuernummer_new .= '0';
1196
1197   for ($h = 1; $h < $patterncount; $h++) {
1198     $steuernummer_new .= qq|$delimiter|;
1199     for (my $i = 1; $i <= length($elster_pattern); $i++) {
1200       $steuernummer_new       .= $form->{"part_$h\_$i"};
1201       $elstersteuernummer_new .= $form->{"part_$h\_$i"};
1202     }
1203   }
1204   if ($form->{steuernummer} ne $steuernummer_new) {
1205     $form->{steuernummer}       = $steuernummer_new;
1206     $form->{elstersteuernummer} = $elstersteuernummer_new;
1207     $form->{steuernummer_new}   = $steuernummer_new;
1208   } else {
1209     $form->{steuernummer_new}       = '';
1210     $form->{elstersteuernummer_new} = '';
1211   }
1212   $lxdebug->leave_sub();
1213 }
1214
1215 sub get_config {
1216   $lxdebug->enter_sub();
1217
1218   my ($userpath, $filename) = @_;
1219   my ($key,      $value)    = '';
1220   open(FACONF, "$userpath/$form->{login}_$filename")
1221     or    #falls Datei nicht vorhanden ist
1222     sub {
1223     open(FANEW, ">$userpath/$form->{login}_$filename")
1224       or $form->error("$userpath/$filename : $!");
1225     close FANEW;
1226     open(FACONF, "$userpath/$form->{login}_$filename")
1227       or $form->error("$userpath/$form->{username}_$filename : $!");
1228     };
1229   while (<FACONF>) {
1230     last if /^\[/;
1231     next if /^(#|\s)/;
1232
1233     # remove comments
1234     s/\s#.*//g;
1235
1236     # remove any trailing whitespace
1237     s/^\s*(.*?)\s*$/$1/;
1238     ($key, $value) = split /=/, $_, 2;
1239
1240     $form->{$key} = "$value";
1241
1242   }
1243   close FACONF;
1244
1245   $lxdebug->leave_sub();
1246 }
1247
1248 sub save {
1249   $lxdebug->enter_sub();
1250   my $filename = "$form->{login}_$form->{filename}";
1251
1252   #zuerst die steuernummer aus den part, parts_X_Y und delimiter herstellen
1253   create_steuernummer();
1254
1255   # Textboxen formatieren: Linebreaks entfernen
1256   #
1257   $form->{FA_Oeffnungszeiten} =~ s/\r\n/\\n/g;
1258
1259   #URL mit http:// davor?
1260   $form->{FA_Internet} =~ s/^http:\/\///;
1261   $form->{FA_Internet} = 'http://' . $form->{FA_Internet};
1262
1263   my @config = qw(
1264     elster              elsterland            elstersteuernummer  steuernummer
1265     elsteramt           elsterFFFF            FA_Name             FA_Strasse
1266     FA_PLZ              FA_Ort                FA_Telefon          FA_Fax 
1267     FA_PLZ_Grosskunden  FA_PLZ_Postfach       FA_Postfach         FA_BLZ_1 
1268     FA_Kontonummer_1    FA_Bankbezeichnung_1  FA_BLZ_2            FA_Kontonummer_2
1269     FA_Bankbezeichnung_oertlich FA_Oeffnungszeiten
1270     FA_Email FA_Internet FA_voranmeld method FA_steuerberater_name
1271     FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
1272     FA_71 FA_dauerfrist);
1273
1274   # Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
1275   if ($form->{elstersteuernummer} ne '000000000') {
1276     $form->{elster} = '1';
1277     open(CONF, ">$userspath/$filename") or $form->error("$filename : $!");
1278
1279     # create the config file
1280     print CONF qq|# Configuration file for USTVA\n\n|;
1281     my $key = '';
1282     foreach $key (sort @config) {
1283       $form->{$key} =~ s/\\/\\\\/g;
1284       # strip M
1285       $form->{$key} =~ s/\r\n/\n/g;
1286
1287       print CONF qq|$key=|;
1288       if ($form->{$key} ne 'Y') {
1289         print CONF qq|$form->{$key}\n|;
1290       }
1291       if ($form->{$key} eq 'Y') {
1292         print CONF qq|checked \n|;
1293       }
1294     }
1295     print CONF qq|\n\n|;
1296     close CONF;
1297     $form->{saved} = $locale->text('saved');
1298
1299   } else {
1300
1301     $form->{saved} = $locale->text('Choose a Tax Number');
1302   }
1303
1304   config_step2();
1305   $lxdebug->leave_sub();
1306 }
1307
1308
1309 sub continue {
1310   $lxdebug->enter_sub();
1311
1312   # allow Symbolic references just here:
1313   no strict 'refs';
1314   &{ $form->{nextsub} };
1315   use strict 'refs';
1316   $lxdebug->leave_sub();
1317 }
1318
1319 sub back {
1320   $lxdebug->enter_sub();
1321   &{ $form->{lastsub} };
1322   $lxdebug->leave_sub();
1323 }
1324
1325 sub elster_hash {
1326   $lxdebug->enter_sub();
1327   my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
1328   $lxdebug->leave_sub();
1329   return $finanzamt;
1330 }
1331
1332