2 #=====================================================================
4 # Copyright (c) 2004 by Udo Spallek, Aachen
8 # Web: http://www.lx-office.org
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.
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 #======================================================================
27 require "$form->{path}/arap.pl";
32 #use warnings; # FATAL=> 'all';
33 #use vars qw($locale $form %myconfig);
35 #use CGI::Carp "fatalsToBrowser";
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')
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')
71 # $form->parse_html_template('generic/util_hidden_variables');
73 #############################
76 $lxdebug->enter_sub();
78 my $myconfig = \%myconfig;
80 $form->{title} = $locale->text('UStVA');
81 $form->{kz10} = ''; #Berichtigte Anmeldung? Ja =1 Nein=0
83 my $year = substr($form->datetonum($form->current_date(\%myconfig), \%myconfig ),
90 # Einlesen der Finanzamtdaten
91 &get_config($userspath, 'finanzamt.ini');
93 # Hier Einlesen der user-config
94 # steuernummer entfernt für prerelease
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
108 map { $form->{$_} = $myconfig->{$_} } @a;
110 my $openings = $form->{FA_Oeffnungszeiten};
111 $openings =~ s/\\\\n/<br>/g;
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>|;
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;
132 ($form->{co_street} ne ''
134 $form->{co_zip} ne ''
135 or $form->{co_city} ne ''
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')
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};
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!|
159 my $ustva_vorauswahl = &ustva_vorauswahl();
161 my @all_years = $form->all_years(\%myconfig);
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>|;
170 $select_year .= qq|</select>|;
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)')
178 . $locale->text('Amended Advance Turnover Tax Return');
180 my $method_local = ($form->{method} eq 'accrual') ? $locale->text('accrual')
181 : ($form->{method} eq 'cash') ? $locale->text('cash')
184 my $period_local = ( $form->{FA_voranmeld} eq 'month') ? $locale->text('month')
185 : ( $form->{FA_voranmeld} eq 'quarter') ? $locale->text('quarter')
188 my $tax_office_banks_ref = [
189 { BLZ => $form->{FA_BLZ_1},
190 Kontonummer => $form->{FA_Kontonummer_1},
191 Bankbezeichnung => $form->{FA_Bankbezeichnung_1}
193 { BLZ => $form->{FA_BLZ_2},
194 Kontonummer => $form->{FA_Kontonummer_2},
195 Bankbezeichnung => $form->{FA_Bankbezeichnung_oertlich}
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,
214 print($form->parse_html_template('ustva/report', $template_ref));
218 $lxdebug->leave_sub();
224 $lxdebug->enter_sub();
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';
234 #$form->{templates} = $tmp;
235 $lxdebug->leave_sub();
239 $lxdebug->enter_sub();
243 $lxdebug->leave_sub();
244 &{ $form->{nextsub} };
248 sub ustva_vorauswahl {
249 $lxdebug->enter_sub();
251 my $select_vorauswahl;
253 #Aktuelles Datum zerlegen:
254 my $date = $form->datetonum($form->current_date(\%myconfig), \%myconfig);
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|);
269 # Testdaten erzeugen:
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>
280 if ($form->{FA_voranmeld} eq 'month') {
282 # Vorauswahl bei monatlichem Voranmeldungszeitraum
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'),
299 my $yy = $form->{year} * 10000;
300 $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
304 # Offset für Dauerfristverlängerung
305 $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
308 $yymmdd <= ($yy + 110 + $dfv) && do {
309 $form->{year} = $form->{year} - 1;
313 $yymmdd <= ($yy + 210 + $dfv) && do {
317 $yymmdd <= ($yy + 310 + $dfv) && do {
321 $yymmdd <= ($yy + 410 + $dfv) && do {
325 $yymmdd <= ($yy + 510 + $dfv) && do {
329 $yymmdd <= ($yy + 610 + $dfv) && do {
333 $yymmdd <= ($yy + 710 + $dfv) && do {
337 $yymmdd <= ($yy + 810 + $dfv) && do {
341 $yymmdd <= ($yy + 910 + $dfv) && do {
345 $yymmdd <= ($yy + 1010 + $dfv) && do {
349 $yymmdd <= ($yy + 1110 + $dfv) && do {
353 $yymmdd <= ($yy + 1210) && do {
357 $yymmdd <= ($yy + 1231) && do {
363 $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
364 . $locale->text('Select a period') . qq|" >|;
367 foreach $key (sort keys %liste) {
369 $selected = 'selected' if ($sel eq $key);
370 $select_vorauswahl .= qq|
371 <option value="$key" $selected> $liste{$key}</option>
374 $select_vorauswahl .= qq|</select>|;
376 } elsif ($form->{FA_voranmeld} eq 'quarter') {
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'),);
385 my $yy = $form->{year} * 10000;
386 $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
388 my $dfv = ''; # Offset für Dauerfristverlängerung
389 $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
392 $yymmdd <= ($yy + 110 + $dfv) && do {
393 $form->{year} = $form->{year} - 1;
397 $yymmdd <= ($yy + 410 + $dfv) && do {
401 $yymmdd <= ($yy + 710 + $dfv) && do {
405 $yymmdd <= ($yy + 1010 + $dfv) && do {
409 $yymmdd <= ($yy + 1231) && do {
414 $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
415 . $locale->text('Select a period') . qq|" >|;
417 foreach $key (sort keys %liste) {
419 $selected = 'selected' if ($sel eq $key);
420 $select_vorauswahl .= qq|
421 <option value="$key" $selected>$liste{$key}</option>
424 $select_vorauswahl .= qq|\n</select>
429 # keine Vorauswahl bei Voranmeldungszeitraum
430 $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
431 . $locale->text('Select a period') . qq|" >|;
433 my %listea = ('41' => '1. Quarter',
434 '42' => '2. Quarter',
435 '43' => '3. Quarter',
436 '44' => '4. Quarter',);
438 my %listeb = ('01' => 'January',
452 foreach $key (sort keys %listea) {
453 $select_vorauswahl .= qq|
454 <option value="$key">|
455 . $locale->text("$listea{$key}")
459 foreach $key (sort keys %listeb) {
460 $select_vorauswahl .= qq|
461 <option value="$key">|
462 . $locale->text("$listeb{$key}")
465 $select_vorauswahl .= qq|</select>|;
467 $lxdebug->leave_sub();
469 return $select_vorauswahl;
473 # $lxdebug->enter_sub();
475 # $lxdebug->leave_sub();
479 $lxdebug->enter_sub();
481 $lxdebug->leave_sub();
485 $lxdebug->enter_sub();
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">|;
494 qq| <option value=html selected>|
495 . $locale->text('Preview')
497 if ($latex_templates) {
499 qq| <option value=pdf>|
500 . $locale->text('UStVA (PDF-Dokument)')
504 #my $disabled= qq|disabled="disabled"|;
505 #$disabled='' if ($form->{elster} eq '1' );
506 if ($form->{elster} eq '1') {
508 qq|<option value=elsterwinston>|
509 . $locale->text('ELSTER Export (Winston)')
511 . qq|<option value=elstertaxbird>|
512 . $locale->text('ELSTER Export (Taxbird)')
516 #$format .= qq|<option value=elster>|.$locale->text('ELSTER Export nach Winston').qq|</option>|;
517 my $show_options = qq|
520 <select name=format title = "|
521 . $locale->text('Choose Outputformat') . qq|">$format</select>
523 $lxdebug->leave_sub();
525 return $show_options;
529 $lxdebug->enter_sub();
531 # Aufruf von get_config aus bin/mozilla/ustva.pl zum
532 # Einlesen der Finanzamtdaten aus finanzamt.ini
534 get_config($userspath, 'finanzamt.ini');
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) {
543 #forgotten the year --> thisyear
544 if ($form->{year} !~ m/^\d\d\d\d$/) {
545 $form->{year} = substr(
547 $form->current_date(\%myconfig), \%myconfig
550 $lxdebug->message(LXDebug::DEBUG1,
551 qq|Actual year from Database: $form->{year}\n|);
555 # using dates in ISO-8601 format: yyyymmmdd for Postgres...
559 if ($form->{period} eq "13") {
560 $form->{fromdate} = "$form->{year}0101";
561 $form->{todate} = "$form->{year}1231";
565 if ($form->{period} eq "41") {
566 $form->{fromdate} = "$form->{year}0101";
567 $form->{todate} = "$form->{year}0331";
568 $form->{'0441'} = "X";
570 if ($form->{period} eq "42") {
571 $form->{fromdate} = "$form->{year}0401";
572 $form->{todate} = "$form->{year}0630";
573 $form->{'0442'} = "X";
575 if ($form->{period} eq "43") {
576 $form->{fromdate} = "$form->{year}0701";
577 $form->{todate} = "$form->{year}0930";
578 $form->{'0443'} = "X";
580 if ($form->{period} eq "44") {
581 $form->{fromdate} = "$form->{year}1001";
582 $form->{todate} = "$form->{year}1231";
583 $form->{'0444'} = "X";
588 $form->{period} eq "01" && do {
589 $form->{fromdate} = "$form->{year}0101";
590 $form->{todate} = "$form->{year}0131";
591 $form->{'0401'} = "X";
594 $form->{period} eq "02" && do {
595 $form->{fromdate} = "$form->{year}0201";
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";
603 $form->{period} eq "03" && do {
604 $form->{fromdate} = "$form->{year}0301";
605 $form->{todate} = "$form->{year}0331";
606 $form->{"0403"} = "X";
609 $form->{period} eq "04" && do {
610 $form->{fromdate} = "$form->{year}0401";
611 $form->{todate} = "$form->{year}0430";
612 $form->{"0404"} = "X";
615 $form->{period} eq "05" && do {
616 $form->{fromdate} = "$form->{year}0501";
617 $form->{todate} = "$form->{year}0531";
618 $form->{"0405"} = "X";
621 $form->{period} eq "06" && do {
622 $form->{fromdate} = "$form->{year}0601";
623 $form->{todate} = "$form->{year}0630";
624 $form->{"0406"} = "X";
627 $form->{period} eq "07" && do {
628 $form->{fromdate} = "$form->{year}0701";
629 $form->{todate} = "$form->{year}0731";
630 $form->{"0407"} = "X";
633 $form->{period} eq "08" && do {
634 $form->{fromdate} = "$form->{year}0801";
635 $form->{todate} = "$form->{year}0831";
636 $form->{"0408"} = "X";
639 $form->{period} eq "09" && do {
640 $form->{fromdate} = "$form->{year}0901";
641 $form->{todate} = "$form->{year}0930";
642 $form->{"0409"} = "X";
645 $form->{period} eq "10" && do {
646 $form->{fromdate} = "$form->{year}1001";
647 $form->{todate} = "$form->{year}1031";
648 $form->{"0410"} = "X";
651 $form->{period} eq "11" && do {
652 $form->{fromdate} = "$form->{year}1101";
653 $form->{todate} = "$form->{year}1130";
654 $form->{"0411"} = "X";
657 $form->{period} eq "12" && do {
658 $form->{fromdate} = "$form->{year}1201";
659 $form->{todate} = "$form->{year}1231";
660 $form->{"0412"} = "X";
669 USTVA->ustva(\%myconfig, \%$form);
671 # reformat Dates to dateformat
672 $form->{fromdate} = $locale->date(\%myconfig, $form->{fromdate}, 0, 0, 0);
674 $form->{todate} = $form->current_date(\%myconfig) unless $form->{todate};
675 $form->{todate} = $locale->date(\%myconfig, $form->{todate}, 0, 0, 0);
677 $form->{longperiod} =
678 $locale->date(\%myconfig, $form->current_date(\%myconfig), 1, 0, 0);
680 # if there are any dates construct a where
681 if ($form->{fromdate} || $form->{todate}) {
683 $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
685 my $longtodate = $locale->date($myconfig, $form->{todate}, 1, 0, 0);
686 my $shorttodate = $locale->date($myconfig, $form->{todate}, 0, 0, 0);
688 my $longfromdate = $locale->date($myconfig, $form->{fromdate}, 1, 0, 0);
689 my $shortfromdate = $locale->date($myconfig, $form->{fromdate}, 0, 0, 0);
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)')
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);
705 my $longcomparetodate =
706 $locale->date(\%myconfig, $form->{comparetodate}, 1, 0, 0);
707 my $shortcomparetodate =
708 $locale->date(\%myconfig, $form->{comparetodate}, 0, 0, 0);
710 $form->{last_period} = "$shortcomparefromdate<br>\n$shortcomparetodate";
711 $form->{longperiod} .=
712 "<br>\n$longcomparefromdate "
713 . $locale->text('to (date)')
714 . qq| $longcomparetodate|;
717 $form->{Datum_heute} =
718 $locale->date(\%myconfig, $form->current_date(\%myconfig), 0, 0, 0);
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);
728 map { $form->{$_} = $myconfig{$_} } @a;
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;
738 # Outputformat specific customisation's
741 my @category_cent = qw(511 861 36 80 971 931 98 96 53 74
742 85 65 66 61 62 67 63 64 59 69 39 83
743 Z43 Z45 Z53 Z62 Z65 Z67);
745 my @category_euro = qw(41 44 49 43 48 51 86 35 77 76 91 97 93
746 95 94 42 60 45 52 73 84);
748 if ( $form->{format} eq 'pdf' or $form->{format} eq 'postscript') {
750 $form->{IN} = "$form->{type}-$form->{year}.tex";
751 $form->{padding} = "~~";
752 $form->{bold} = "\textbf{";
753 $form->{endbold} = "}";
754 $form->{br} = '\\\\';
756 # Zahlenformatierung für Latex USTVA Formulare
758 foreach my $number (@category_euro) {
759 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
762 my ${decimal_comma} = ( $myconfig{numberformat} eq '1.000,00'
763 or $myconfig{numberformat} eq '1000,00' ) ? ',':'.';
765 foreach my $number (@category_cent) {
766 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '');
767 $form->{$number} =~ s/${decimal_comma}/~~/g;
770 } elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
772 $form->{IN} = $form->{type} . '.html';
773 $form->{padding} = " ";
774 $form->{bold} = "<b>";
775 $form->{endbold} = "</b>";
776 $form->{br} = "<br>";
777 $form->{address} =~ s/\\n/\n/g;
779 foreach $number (@category_cent) {
780 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
783 foreach $number (@category_euro) {
784 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '0');
787 } elsif ( $form->{format} eq 'elsterwinston' ) {
789 $form->{IN} = 'winston.xml';
792 # Build Winston filename
795 my $file = 'U'; # 1. char 'U' = USTVA
796 $file .= $form->{period};
797 #4. and 5. char = year modulo 100
798 $file .= sprintf("%02d", $form->{year} % 100);
799 #6. to 18. char = Elstersteuernummer
800 #Beispiel: Steuernummer in Bayern
801 #111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
802 $file .= $form->{elsterFFFF};
803 $file .= $form->{elstersteuernummer};
806 $form->{tmpfile} = "$userspath/$file";
808 $form->{attachment_filename} = "$file";
810 # Zahlenformatierung für Winston
812 my $temp_numberformat = $myconfig{numberformat};
814 # Numberformat must be '1000.00' for Winston
816 $myconfig{numberformat} = '1000.00';
818 foreach my $number (@category_cent) {
819 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
822 foreach my $number (@category_euro) {
823 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
825 # Re-set Numberformat
826 $myconfig{numberformat} = $temp_numberformat;
830 elsif ( $form->{format} eq 'elstertaxbird' ) {
832 $form->{IN} = 'taxbird.txb';
834 $form->{attachment_filename} = "USTVA-" . $form->{period}
835 . sprintf("%02d", $form->{year} % 100) . ".txb";
837 $form->{tmpfile} = "$userspath/" . $form->{attachment_filename};
839 if ($form->{period} =~ /^[4]\d$/ ){
840 my %periods = ( # Lx => taxbird
847 foreach my $quarter ( keys %periods ) {
848 $form->{taxbird_period} = $periods{$quarter} if ( $form->{period} eq $quarter);
851 my %lands = ( # Lx => taxbird # TODO: besser als array...
852 'Baden Würtemberg' => '0',
855 'Brandenburg' => '3',
859 'Mecklenburg Vorpommern' => '7',
860 'Niedersachsen' => '8',
861 'Nordrhein Westfalen' => '9',
862 'Rheinland Pfalz' => '10',
865 'Sachsen Anhalt' => '13',
866 'Schleswig Holstein' => '14',
870 foreach my $land ( keys %lands ){
871 $form->{taxbird_land_nr} = $lands{$land} if ($form->{elsterland} eq $land );
876 $form->{co_zip} = $form->{co_city};
877 $form->{co_zip} =~ s/\D//g;
878 $form->{co_city} =~ s/\d//g;
879 $form->{co_city} =~ s/^\s//g;
881 ($form->{co_phone_prefix}, $form->{co_phone}) = split("-", $form->{tel});
882 $form->{co_phone_prefix} =~ s/\s//g;
883 $form->{co_phone} =~ s/\s//g;
885 $form->{taxbird_steuernummer} = $form->{steuernummer};
886 # $form->{taxbird_steuernummer} =~ s/\D//g;
887 $form->{taxbird_steuernummer} =~ s/\///; # ersten Querstrich ersetzen
889 # Numberformatting for Taxbird
891 my $temp_numberformat = $myconfig{numberformat};
892 # Numberformat must be '1000.00' for Taxbird ?!
894 $myconfig{numberformat} = '1000.00';
896 foreach my $number (@category_cent) {
897 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
900 foreach my $number (@category_euro) {
901 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
903 # Re-set Numberformat
904 $myconfig{numberformat} = $temp_numberformat;
906 } elsif ($form->{period} =~ /^\d+$/ ) {
907 $form->{period} =~ s/^0//g;
908 my $period = $form->{period};
911 $form->{period} = $period;
914 USTVA::error( $locale->text('Wrong Period' ));
918 } elsif ( $form->{format} eq '' ){ # No format error.
920 USTVA::error( $locale->text('Application Error. No Format given' ) . "!");
923 } else { # All other Formats are wrong
925 USTVA::error( $locale->text('Application Error. Wrong Format') . ": " . $form->{format} );
929 if ( $form->{period} eq '13' and $form->{format} ne 'html') {
933 'Yearly taxreport not yet implemented')
937 $form->{templates} = $myconfig{templates};
938 $form->{templates} = "doc" if ( $form->{type} eq 'help' );
940 $form->parse_template(\%myconfig, $userspath);
942 $lxdebug->leave_sub();
946 $lxdebug->enter_sub();
948 # edit all taxauthority prefs
951 &get_config($userspath, 'finanzamt.ini');
953 my $land = $form->{elsterland};
954 my $amt = $form->{elsterFFFF};
957 if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
958 $callback = qq|$form->{cbscript}|
959 .qq|?action="config_step1"|
960 .qq|&login="$form->{cblogin}"|
961 .qq|&path="$form->{cbpath}"|
962 .qq|&root="$form->{cbroot}"|
963 .qq|&rpw="$form->{cbrpw}"|;
966 $form->{title} = $locale->text('Tax Office Preferences');
969 my $select_tax_office = USTVA->fa_auswahl($land, $amt, &elster_hash());
970 my $checked_accrual = q|checked="checked"| if ($form->{method} eq 'accrual');
971 my $checked_cash = q|checked="checked"| if ($form->{method} eq 'cash');
972 my $checked_monthly = "checked" if ($form->{FA_voranmeld} eq 'month');
973 my $checked_quarterly = "checked" if ($form->{FA_voranmeld} eq 'quarter');
974 my $checked_dauerfristverlaengerung = "checked" if ($form->{FA_dauerfrist} eq '1');
975 my $checked_kz_71 = "checked" if ($form->{FA_71} eq 'X');
977 my $_hidden_variables_ref;
979 my %_hidden_local_variables = (
980 'saved' => $locale->text('Check Details'),
981 'nextsub' => 'config_step2',
985 foreach my $variable (keys %_hidden_local_variables) {
986 push @{ $_hidden_variables_ref },
987 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
990 my @_hidden_form_variables = qw(
991 FA_Name FA_Strasse FA_PLZ
992 FA_Ort FA_Telefon FA_Fax
993 FA_PLZ_Grosskunden FA_PLZ_Postfach FA_Postfach
994 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
995 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
996 FA_Oeffnungszeiten FA_Email FA_Internet
997 steuernummer elsterland elstersteuernummer
998 elsterFFFF path login
1002 foreach my $variable (@_hidden_form_variables) {
1003 push @{ $_hidden_variables_ref},
1004 { 'variable' => $variable, 'value' => $form->{$variable} };
1008 my $steuernummer_new = '';
1010 # Variablen für das Template zur Verfügung stellen
1011 my $template_ref = {
1012 select_tax_office => $select_tax_office,
1013 checked_accrual => $checked_accrual,
1014 checked_cash => $checked_cash,
1015 checked_monthly => $checked_monthly,
1016 checked_quarterly => $checked_quarterly,
1017 checked_dauerfristverlaengerung => $checked_dauerfristverlaengerung,
1018 hidden_variables => $_hidden_variables_ref,
1022 # Ausgabe des Templates
1023 print($form->parse_html_template('ustva/config_step1', $template_ref));
1025 $lxdebug->leave_sub();
1029 $lxdebug->enter_sub();
1036 my $elsterland = '';
1037 my $elster_amt = '';
1038 my $elsterFFFF = '';
1039 my $elstersteuernummer = '';
1040 &get_config($userspath, 'finanzamt.ini')
1041 if ($form->{saved} eq $locale->text('saved'));
1043 # Auf Übergabefehler checken
1044 USTVA::info( $locale->text('Missing Tax Authoritys Preferences') . "\n"
1045 . $locale->text('USTVA-Hint: Tax Authoritys'))
1046 if ( $form->{elsterFFFF_new} eq 'Auswahl'
1047 || $form->{elsterland_new} eq 'Auswahl');
1048 USTVA::info( $locale->text('Missing Method!') . "\n"
1049 . $locale->text('USTVA-Hint: Method'))
1050 if ($form->{method} eq '');
1052 # Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
1053 # der vorherigen Maske stattfanden: $change = 1(in der edit sub,
1054 # mittels get_config)
1056 my $change = $form->{elsterland} eq $form->{elsterland_new}
1057 && $form->{elsterFFFF} eq $form->{elsterFFFF_new} ? '0' : '1';
1058 $change = '0' if ($form->{saved} eq $locale->text('saved'));
1059 my $elster_init = &elster_hash();
1061 my %elster_init = %$elster_init;
1063 if ($change eq '1') {
1066 $elsterland = $form->{elsterland_new};
1067 $elsterFFFF = $form->{elsterFFFF_new};
1068 $form->{elsterland} = $elsterland;
1069 $form->{elsterFFFF} = $elsterFFFF;
1070 $form->{steuernummer} = '';
1072 create_steuernummer();
1074 # rebuild elster_amt
1076 foreach $amt (keys %{ $elster_init{ $form->{elsterland} } }) {
1078 if ($elster_init{ $form->{elsterland}{$amt} eq $form->{elsterFFFF} });
1081 # load the predefined hash data into the FA_* Vars
1082 my @variables = qw(FA_Name FA_Strasse FA_PLZ FA_Ort
1083 FA_Telefon FA_Fax FA_PLZ_Grosskunden FA_PLZ_Postfach
1085 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1086 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1087 FA_Oeffnungszeiten FA_Email FA_Internet);
1089 for (my $i = 0; $i <= 20; $i++) {
1090 $form->{ $variables[$i] } =
1091 $elster_init->{$elsterland}->{$elsterFFFF}->[$i];
1096 $elsterland = $form->{elsterland};
1097 $elsterFFFF = $form->{elsterFFFF};
1100 my $stnr = $form->{steuernummer};
1102 my $patterncount = $form->{patterncount};
1103 my $elster_pattern = $form->{elster_pattern};
1104 my $delimiter = $form->{delimiter};
1105 my $steuernummer = $form->{steuernummer} if ($steuernummer eq '');
1107 $form->{FA_Oeffnungszeiten} =~ s/\\\\n/\n/g;
1111 my $input_steuernummer = USTVA->steuernummer_input(
1112 $form->{elsterland},
1113 $form->{elsterFFFF},
1114 $form->{steuernummer}
1117 $lxdebug->message(LXDebug::DEBUG1, qq|$input_steuernummer|);
1120 my $_hidden_variables_ref;
1122 my %_hidden_local_variables = (
1123 'elsterland' => $elsterland,
1124 'elsterFFFF' => $elsterFFFF,
1125 'warnung' => $warnung,
1126 'elstersteuernummer' => $elstersteuernummer,
1127 'steuernummer' => $stnr,
1128 'lastsub' => 'config_step1',
1129 'nextsub' => 'save',
1133 foreach my $variable (keys %_hidden_local_variables) {
1134 push @{ $_hidden_variables_ref },
1135 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1138 my @_hidden_form_variables = qw(
1139 FA_steuerberater_name FA_steuerberater_street
1140 FA_steuerberater_city FA_steuerberater_tel
1151 foreach my $variable (@_hidden_form_variables) {
1152 push @{ $_hidden_variables_ref},
1153 { 'variable' => $variable, 'value' => $form->{$variable} };
1156 my $template_ref = {
1157 tax_office_data => $tax_office_data,
1158 input_steuernummer => $input_steuernummer,
1159 readonly => '', #q|disabled="disabled"|,
1160 callback => $callback,
1161 hidden_variables => $_hidden_variables_ref,
1164 # Ausgabe des Templates
1165 print($form->parse_html_template('ustva/config_step2', $template_ref));
1168 $lxdebug->leave_sub();
1171 sub create_steuernummer {
1172 $lxdebug->enter_sub();
1173 my $part = $form->{part};
1174 my $patterncount = $form->{patterncount};
1175 my $delimiter = $form->{delimiter};
1176 my $elster_pattern = $form->{elster_pattern};
1178 # rebuild steuernummer and elstersteuernummer
1179 # es gibt eine gespeicherte steuernummer $form->{steuernummer}
1180 # und die parts und delimiter
1185 my $steuernummer_new = $part;
1186 my $elstersteuernummer_new = $form->{elster_FFFF};
1187 $elstersteuernummer_new .= '0';
1189 for ($h = 1; $h < $patterncount; $h++) {
1190 $steuernummer_new .= qq|$delimiter|;
1191 for (my $i = 1; $i <= length($elster_pattern); $i++) {
1192 $steuernummer_new .= $form->{"part_$h\_$i"};
1193 $elstersteuernummer_new .= $form->{"part_$h\_$i"};
1196 if ($form->{steuernummer} ne $steuernummer_new) {
1197 $form->{steuernummer} = $steuernummer_new;
1198 $form->{elstersteuernummer} = $elstersteuernummer_new;
1199 $form->{steuernummer_new} = $steuernummer_new;
1201 $form->{steuernummer_new} = '';
1202 $form->{elstersteuernummer_new} = '';
1204 $lxdebug->leave_sub();
1208 $lxdebug->enter_sub();
1210 my ($userpath, $filename) = @_;
1211 my ($key, $value) = '';
1212 open(FACONF, "$userpath/$form->{login}_$filename")
1213 or #falls Datei nicht vorhanden ist
1215 open(FANEW, ">$userpath/$form->{login}_$filename")
1216 or $form->error("$userpath/$filename : $!");
1218 open(FACONF, "$userpath/$form->{login}_$filename")
1219 or $form->error("$userpath/$form->{username}_$filename : $!");
1228 # remove any trailing whitespace
1229 s/^\s*(.*?)\s*$/$1/;
1230 ($key, $value) = split /=/, $_, 2;
1232 $form->{$key} = "$value";
1237 $lxdebug->leave_sub();
1241 $lxdebug->enter_sub();
1242 my $filename = "$form->{login}_$form->{filename}";
1244 #zuerst die steuernummer aus den part, parts_X_Y und delimiter herstellen
1245 create_steuernummer();
1247 # Textboxen formatieren: Linebreaks entfernen
1249 $form->{FA_Oeffnungszeiten} =~ s/\r\n/\\n/g;
1251 #URL mit http:// davor?
1252 $form->{FA_Internet} =~ s/^http:\/\///;
1253 $form->{FA_Internet} = 'http://' . $form->{FA_Internet};
1255 my @config = qw(elster elsterland elstersteuernummer steuernummer
1256 elsteramt elsterFFFF FA_Name FA_Strasse
1257 FA_PLZ FA_Ort FA_Telefon FA_Fax FA_PLZ_Grosskunden
1258 FA_PLZ_Postfach FA_Postfach FA_BLZ_1 FA_Kontonummer_1
1259 FA_Bankbezeichnung_1 FA_BLZ_2 FA_Kontonummer_2
1260 FA_Bankbezeichnung_oertlich FA_Oeffnungszeiten
1261 FA_Email FA_Internet FA_voranmeld method FA_steuerberater_name
1262 FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
1263 FA_71 FA_dauerfrist);
1265 # Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
1266 if ($form->{elstersteuernummer} ne '000000000') {
1267 $form->{elster} = '1';
1268 open(CONF, ">$userspath/$filename") or $form->error("$filename : $!");
1270 # create the config file
1271 print CONF qq|# Configuration file for USTVA\n\n|;
1273 foreach $key (sort @config) {
1274 $form->{$key} =~ s/\\/\\\\/g;
1276 $form->{$key} =~ s/\r\n/\n/g;
1278 print CONF qq|$key=|;
1279 if ($form->{$key} ne 'Y') {
1280 print CONF qq|$form->{$key}\n|;
1282 if ($form->{$key} eq 'Y') {
1283 print CONF qq|checked \n|;
1286 print CONF qq|\n\n|;
1288 $form->{saved} = $locale->text('saved');
1292 $form->{saved} = $locale->text('Choose a Tax Number');
1296 $lxdebug->leave_sub();
1301 $lxdebug->enter_sub();
1303 # allow Symbolic references just here:
1305 &{ $form->{nextsub} };
1307 $lxdebug->leave_sub();
1311 $lxdebug->enter_sub();
1312 &{ $form->{lastsub} };
1313 $lxdebug->leave_sub();
1317 $lxdebug->enter_sub();
1318 my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
1319 $lxdebug->leave_sub();