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'
542 '0441' '0442' '0443' '0444');
544 foreach my $item (@anmeldungszeitraum) {
548 #forgotten the year --> thisyear
549 if ($form->{year} !~ m/^\d\d\d\d$/) {
550 $form->{year} = substr(
552 $form->current_date(\%myconfig), \%myconfig
555 $lxdebug->message(LXDebug::DEBUG1,
556 qq|Actual year from Database: $form->{year}\n|);
560 # using dates in ISO-8601 format: yyyymmmdd for Postgres...
564 if ($form->{period} eq "13") {
565 $form->{fromdate} = "$form->{year}0101";
566 $form->{todate} = "$form->{year}1231";
570 if ($form->{period} eq "41") {
571 $form->{fromdate} = "$form->{year}0101";
572 $form->{todate} = "$form->{year}0331";
573 $form->{'0441'} = "X";
575 if ($form->{period} eq "42") {
576 $form->{fromdate} = "$form->{year}0401";
577 $form->{todate} = "$form->{year}0630";
578 $form->{'0442'} = "X";
580 if ($form->{period} eq "43") {
581 $form->{fromdate} = "$form->{year}0701";
582 $form->{todate} = "$form->{year}0930";
583 $form->{'0443'} = "X";
585 if ($form->{period} eq "44") {
586 $form->{fromdate} = "$form->{year}1001";
587 $form->{todate} = "$form->{year}1231";
588 $form->{'0444'} = "X";
593 $form->{period} eq "01" && do {
594 $form->{fromdate} = "$form->{year}0101";
595 $form->{todate} = "$form->{year}0131";
596 $form->{'0401'} = "X";
599 $form->{period} eq "02" && do {
600 $form->{fromdate} = "$form->{year}0201";
602 #this works from 1901 to 2099, 1900 and 2100 fail.
603 my $leap = ($form->{year} % 4 == 0) ? "29" : "28";
604 $form->{todate} = "$form->{year}02$leap";
605 $form->{"0402"} = "X";
608 $form->{period} eq "03" && do {
609 $form->{fromdate} = "$form->{year}0301";
610 $form->{todate} = "$form->{year}0331";
611 $form->{"0403"} = "X";
614 $form->{period} eq "04" && do {
615 $form->{fromdate} = "$form->{year}0401";
616 $form->{todate} = "$form->{year}0430";
617 $form->{"0404"} = "X";
620 $form->{period} eq "05" && do {
621 $form->{fromdate} = "$form->{year}0501";
622 $form->{todate} = "$form->{year}0531";
623 $form->{"0405"} = "X";
626 $form->{period} eq "06" && do {
627 $form->{fromdate} = "$form->{year}0601";
628 $form->{todate} = "$form->{year}0630";
629 $form->{"0406"} = "X";
632 $form->{period} eq "07" && do {
633 $form->{fromdate} = "$form->{year}0701";
634 $form->{todate} = "$form->{year}0731";
635 $form->{"0407"} = "X";
638 $form->{period} eq "08" && do {
639 $form->{fromdate} = "$form->{year}0801";
640 $form->{todate} = "$form->{year}0831";
641 $form->{"0408"} = "X";
644 $form->{period} eq "09" && do {
645 $form->{fromdate} = "$form->{year}0901";
646 $form->{todate} = "$form->{year}0930";
647 $form->{"0409"} = "X";
650 $form->{period} eq "10" && do {
651 $form->{fromdate} = "$form->{year}1001";
652 $form->{todate} = "$form->{year}1031";
653 $form->{"0410"} = "X";
656 $form->{period} eq "11" && do {
657 $form->{fromdate} = "$form->{year}1101";
658 $form->{todate} = "$form->{year}1130";
659 $form->{"0411"} = "X";
662 $form->{period} eq "12" && do {
663 $form->{fromdate} = "$form->{year}1201";
664 $form->{todate} = "$form->{year}1231";
665 $form->{"0412"} = "X";
670 # Kontrollvariable für die Templates
671 $form->{'year2007'} = ($form->{year} >= 2007 ) ? "1":"0";
675 USTVA->ustva(\%myconfig, \%$form);
677 # reformat Dates to dateformat
678 $form->{fromdate} = $locale->date(\%myconfig, $form->{fromdate}, 0, 0, 0);
680 $form->{todate} = $form->current_date(\%myconfig) unless $form->{todate};
681 $form->{todate} = $locale->date(\%myconfig, $form->{todate}, 0, 0, 0);
683 $form->{longperiod} =
684 $locale->date(\%myconfig, $form->current_date(\%myconfig), 1, 0, 0);
686 # if there are any dates construct a where
687 if ($form->{fromdate} || $form->{todate}) {
689 $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
691 my $longtodate = $locale->date($myconfig, $form->{todate}, 1, 0, 0);
692 my $shorttodate = $locale->date($myconfig, $form->{todate}, 0, 0, 0);
694 my $longfromdate = $locale->date($myconfig, $form->{fromdate}, 1, 0, 0);
695 my $shortfromdate = $locale->date($myconfig, $form->{fromdate}, 0, 0, 0);
697 $form->{this_period} = "$shortfromdate<br>\n$shorttodate";
698 $form->{longperiod} =
699 $locale->text('for Period')
700 . qq|<br>\n$longfromdate |
701 . $locale->text('to (date)')
705 if ($form->{comparefromdate} || $form->{comparetodate}) {
706 my $longcomparefromdate =
707 $locale->date(\%myconfig, $form->{comparefromdate}, 1, 0, 0);
708 my $shortcomparefromdate =
709 $locale->date(\%myconfig, $form->{comparefromdate}, 0, 0, 0);
711 my $longcomparetodate =
712 $locale->date(\%myconfig, $form->{comparetodate}, 1, 0, 0);
713 my $shortcomparetodate =
714 $locale->date(\%myconfig, $form->{comparetodate}, 0, 0, 0);
716 $form->{last_period} = "$shortcomparefromdate<br>\n$shortcomparetodate";
717 $form->{longperiod} .=
718 "<br>\n$longcomparefromdate "
719 . $locale->text('to (date)')
720 . qq| $longcomparetodate|;
723 $form->{Datum_heute} =
724 $locale->date(\%myconfig, $form->current_date(\%myconfig), 0, 0, 0);
726 # setup variables for the form
727 my @a = qw(company businessnumber tel fax email
728 co_chief co_department co_custom1 co_custom2 co_custom3 co_custom4 co_custom5
729 co_name1 co_name2 co_street co_street1 co_zip co_city co_city1 co_country co_tel co_tel1 co_tel2
730 co_fax co_fax1 co_email co_email1 co_url co_url1 ustid duns
731 co_bankname co_bankname1 co_bankname2 co_bankname3 co_blz co_blz1
732 co_blz2 co_blz3 co_accountnr co_accountnr1 co_accountnr2 co_accountnr3);
734 map { $form->{$_} = $myconfig{$_} } @a;
736 if ($form->{address} ne '') {
737 my $temp = $form->{address};
738 $temp =~ s/\\n/<br \/>/;
739 ($form->{co_street}, $form->{co_city}) = split("<br \/>", $temp);
740 $form->{co_city} =~ s/\\n//g;
744 # Outputformat specific customisation's
747 my @category_cent = qw(
748 511 861 36 80 971 931 98 96 53 74
749 85 65 66 61 62 67 63 64 59 69
750 39 83 811 891 Z43 Z45 Z53 Z62 Z65 Z67
754 my @category_euro = qw(
755 41 44 49 43 48 51 86 35 77 76 91 89
756 97 93 95 94 42 60 45 52 73 84 81
760 $form->{amount} = [];
762 if ( $form->{format} eq 'pdf' or $form->{format} eq 'postscript') {
764 $form->{IN} = "$form->{type}-$form->{year}.tex";
765 $form->{padding} = "~~";
766 $form->{bold} = "\textbf{";
767 $form->{endbold} = "}";
768 $form->{br} = '\\\\';
770 # Zahlenformatierung für Latex USTVA Formulare
772 foreach my $number (@category_euro) {
773 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
776 my ${decimal_comma} = ( $myconfig{numberformat} eq '1.000,00'
777 or $myconfig{numberformat} eq '1000,00' ) ? ',':'.';
779 foreach my $number (@category_cent) {
780 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '');
781 $form->{$number} =~ s/${decimal_comma}/~~/g;
784 } elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
786 $form->{IN} = $form->{type} . '.html';
787 $form->{padding} = " ";
788 $form->{bold} = "<b>";
789 $form->{endbold} = "</b>";
790 $form->{br} = "<br>";
791 $form->{address} =~ s/\\n/\n/g;
793 foreach $number (@category_cent) {
794 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
797 foreach $number (@category_euro) {
798 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '0');
801 } elsif ( $form->{format} eq 'elsterwinston' ) {
803 $form->{IN} = 'winston.xml';
806 # Build Winston filename
809 my $file = 'U'; # 1. char 'U' = USTVA
810 $file .= $form->{period};
811 #4. and 5. char = year modulo 100
812 $file .= sprintf("%02d", $form->{year} % 100);
813 #6. to 18. char = Elstersteuernummer
814 #Beispiel: Steuernummer in Bayern
815 #111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
816 $file .= $form->{elsterFFFF};
817 $file .= $form->{elstersteuernummer};
820 $form->{tmpfile} = "$userspath/$file";
822 $form->{attachment_filename} = "$file";
824 # Zahlenformatierung für Winston
826 my $temp_numberformat = $myconfig{numberformat};
828 # Numberformat must be '1000.00' for Winston
830 $myconfig{numberformat} = '1000.00';
832 foreach my $number (@category_cent) {
833 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
836 foreach my $number (@category_euro) {
837 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
839 # Re-set Numberformat
840 $myconfig{numberformat} = $temp_numberformat;
843 # push Kennziffern to <%foreach Array fo easyer
844 # output in xml format. Thx to Moritz.
845 my %winston_id_for = (
850 foreach my $kennziffer (@category_cent, @category_euro) {
852 next if ( $kennziffer =~ m/Z\d\d/);
853 next if ( $form->{$kennziffer} == 0 );
855 if (defined $winston_id_for{$kennziffer} ) {
856 push(@{ $form->{id}}, $winston_id_for{$kennziffer});
858 push(@{ $form->{id}}, "$kennziffer");
860 push(@{ $form->{amount}}, $form->{$kennziffer});
864 } elsif ( $form->{format} eq 'elstertaxbird' ) {
866 # Define serveral filenames
867 $form->{IN} = 'taxbird.txb';
869 $form->{attachment_filename} = "USTVA-" . $form->{period}
870 . sprintf("%02d", $form->{year} % 100) . ".txb";
872 $form->{tmpfile} = "$userspath/" . $form->{attachment_filename};
874 # TODO: set Output to UTF-8 or system Preference
875 #$form->{"iconv"} = Text::Iconv->new($myconfig{dbcharset}, "UTF-8");
876 #my $iconv = $self->{"iconv"};
877 #$iconv->convert($variable);
878 if ($form->{period} =~ /^[4]\d$/ ){
879 my %periods = ( # Lx => taxbird
886 foreach my $quarter ( keys %periods ) {
887 $form->{taxbird_period} = $periods{$quarter} if ( $form->{period} eq $quarter);
889 } elsif ($form->{period} =~ /^\d+$/ ) {
890 $form->{period} =~ s/^0//g;
891 my $period = $form->{period};
894 $form->{period} = $period;
897 USTVA::error( $locale->text('Wrong Period' ));
901 my %lands = ( # Lx => taxbird # TODO: besser als array...
902 'Baden Würtemberg' => '0',
905 'Brandenburg' => '3',
909 'Mecklenburg Vorpommern' => '7',
910 'Niedersachsen' => '8',
911 'Nordrhein Westfalen' => '9',
912 'Rheinland Pfalz' => '10',
915 'Sachsen Anhalt' => '13',
916 'Schleswig Holstein' => '14',
919 foreach my $land ( keys %lands ){
920 $form->{taxbird_land_nr} = $lands{$land} if ($form->{elsterland} eq $land );
923 $form->{co_zip} = $form->{co_city};
924 $form->{co_zip} =~ s/\D//g;
925 $form->{co_city} =~ s/\d//g;
926 $form->{co_city} =~ s/^\s//g;
928 ($form->{co_phone_prefix}, $form->{co_phone}) = split("-", $form->{tel});
929 $form->{co_phone_prefix} =~ s/\s//g;
930 $form->{co_phone} =~ s/\s//g;
932 $form->{taxbird_steuernummer} = $form->{steuernummer};
933 # $form->{taxbird_steuernummer} =~ s/\D//g;
934 $form->{taxbird_steuernummer} =~ s/\///; # ersten Querstrich ersetzen
936 # Numberformatting for Taxbird
937 my $temp_numberformat = $myconfig{numberformat};
938 # Numberformat must be '1000,00' for Taxbird ?!
939 $myconfig{numberformat} = '1000,00';
940 foreach my $number (@category_cent) {
941 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
944 foreach my $number (@category_euro) {
945 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
947 # Re-set Numberformat
948 $myconfig{numberformat} = $temp_numberformat;
950 # push Kennziffern to <%foreach Array fo easyer
951 # output in xml format. Thx to Moritz.
952 my %taxbird_id_for = (
954 '511' => 'Kz51-calc',
955 '861' => 'Kz86-calc',
956 '971' => 'Kz97-calc',
957 '931' => 'Kz93-calc',
958 '811' => 'Kz81-calc',
959 '891' => 'Kz89-calc',
960 'Z45' => 'uebertrag',
962 'Z62' => 'ust-minus-vost',
963 'Z65' => 'ust-sum+69',
968 for my $kennziffer (@category_cent, @category_euro) {
970 next if ($kennziffer eq 'Z43');
972 if ($form->{$kennziffer} != 0){
973 if (defined $taxbird_id_for{$kennziffer}) {
974 push(@{ $form->{id}}, $taxbird_id_for{$kennziffer});
976 push(@{ $form->{id}}, "Kz$kennziffer");
978 push(@{ $form->{amount}}, $form->{$kennziffer});
982 } elsif ( $form->{format} eq '' ){ # No format error.
984 USTVA::error( $locale->text('Application Error. No Format given' ) . "!");
987 } else { # All other Formats are wrong
989 USTVA::error( $locale->text('Application Error. Wrong Format') . ": " . $form->{format} );
994 if ( $form->{period} eq '13' and $form->{format} ne 'html') {
998 'Yearly taxreport not yet implemented')
1002 $form->{templates} = $myconfig{templates};
1003 $form->{templates} = "doc" if ( $form->{type} eq 'help' );
1005 $form->parse_template(\%myconfig, $userspath);
1007 $lxdebug->leave_sub();
1011 $lxdebug->enter_sub();
1013 # edit all taxauthority prefs
1016 &get_config($userspath, 'finanzamt.ini');
1018 my $land = $form->{elsterland};
1019 my $amt = $form->{elsterFFFF};
1022 if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
1023 $callback = qq|$form->{cbscript}|
1024 .qq|?action="config_step1"|
1025 .qq|&login="$form->{cblogin}"|
1026 .qq|&path="$form->{cbpath}"|
1027 .qq|&root="$form->{cbroot}"|
1028 .qq|&rpw="$form->{cbrpw}"|;
1031 $form->{title} = $locale->text('Tax Office Preferences');
1034 my $select_tax_office = USTVA->fa_auswahl($land, $amt, &elster_hash());
1035 my $checked_accrual = q|checked="checked"| if ($form->{method} eq 'accrual');
1036 my $checked_cash = q|checked="checked"| if ($form->{method} eq 'cash');
1037 my $checked_monthly = "checked" if ($form->{FA_voranmeld} eq 'month');
1038 my $checked_quarterly = "checked" if ($form->{FA_voranmeld} eq 'quarter');
1039 my $checked_dauerfristverlaengerung = "checked" if ($form->{FA_dauerfrist} eq '1');
1040 my $checked_kz_71 = "checked" if ($form->{FA_71} eq 'X');
1042 my $_hidden_variables_ref;
1044 my %_hidden_local_variables = (
1045 'saved' => $locale->text('Check Details'),
1046 'nextsub' => 'config_step2',
1050 foreach my $variable (keys %_hidden_local_variables) {
1051 push @{ $_hidden_variables_ref },
1052 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1055 my @_hidden_form_variables = qw(
1056 FA_Name FA_Strasse FA_PLZ
1057 FA_Ort FA_Telefon FA_Fax
1058 FA_PLZ_Grosskunden FA_PLZ_Postfach FA_Postfach
1059 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1060 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1061 FA_Oeffnungszeiten FA_Email FA_Internet
1062 steuernummer elsterland elstersteuernummer
1063 elsterFFFF path login
1067 foreach my $variable (@_hidden_form_variables) {
1068 push @{ $_hidden_variables_ref},
1069 { 'variable' => $variable, 'value' => $form->{$variable} };
1073 my $steuernummer_new = '';
1075 # Variablen für das Template zur Verfügung stellen
1076 my $template_ref = {
1077 select_tax_office => $select_tax_office,
1078 checked_accrual => $checked_accrual,
1079 checked_cash => $checked_cash,
1080 checked_monthly => $checked_monthly,
1081 checked_quarterly => $checked_quarterly,
1082 checked_dauerfristverlaengerung => $checked_dauerfristverlaengerung,
1083 hidden_variables => $_hidden_variables_ref,
1087 # Ausgabe des Templates
1088 print($form->parse_html_template('ustva/config_step1', $template_ref));
1090 $lxdebug->leave_sub();
1094 $lxdebug->enter_sub();
1101 my $elsterland = '';
1102 my $elster_amt = '';
1103 my $elsterFFFF = '';
1104 my $elstersteuernummer = '';
1105 &get_config($userspath, 'finanzamt.ini')
1106 if ($form->{saved} eq $locale->text('saved'));
1108 # Auf Übergabefehler checken
1109 USTVA::info( $locale->text('Missing Tax Authoritys Preferences') . "\n"
1110 . $locale->text('USTVA-Hint: Tax Authoritys'))
1111 if ( $form->{elsterFFFF_new} eq 'Auswahl'
1112 || $form->{elsterland_new} eq 'Auswahl');
1113 USTVA::info( $locale->text('Missing Method!') . "\n"
1114 . $locale->text('USTVA-Hint: Method'))
1115 if ($form->{method} eq '');
1117 # Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
1118 # der vorherigen Maske stattfanden: $change = 1(in der edit sub,
1119 # mittels get_config)
1121 my $change = $form->{elsterland} eq $form->{elsterland_new}
1122 && $form->{elsterFFFF} eq $form->{elsterFFFF_new} ? '0' : '1';
1123 $change = '0' if ($form->{saved} eq $locale->text('saved'));
1124 my $elster_init = &elster_hash();
1126 my %elster_init = %$elster_init;
1128 if ($change eq '1') {
1131 $elsterland = $form->{elsterland_new};
1132 $elsterFFFF = $form->{elsterFFFF_new};
1133 $form->{elsterland} = $elsterland;
1134 $form->{elsterFFFF} = $elsterFFFF;
1135 $form->{steuernummer} = '';
1137 create_steuernummer();
1139 # rebuild elster_amt
1141 foreach $amt (keys %{ $elster_init{ $form->{elsterland} } }) {
1143 if ($elster_init{ $form->{elsterland}{$amt} eq $form->{elsterFFFF} });
1146 # load the predefined hash data into the FA_* Vars
1147 my @variables = qw(FA_Name FA_Strasse FA_PLZ FA_Ort
1148 FA_Telefon FA_Fax FA_PLZ_Grosskunden FA_PLZ_Postfach
1150 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1151 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1152 FA_Oeffnungszeiten FA_Email FA_Internet);
1154 for (my $i = 0; $i <= 20; $i++) {
1155 $form->{ $variables[$i] } =
1156 $elster_init->{$elsterland}->{$elsterFFFF}->[$i];
1161 $elsterland = $form->{elsterland};
1162 $elsterFFFF = $form->{elsterFFFF};
1165 my $stnr = $form->{steuernummer};
1167 my $patterncount = $form->{patterncount};
1168 my $elster_pattern = $form->{elster_pattern};
1169 my $delimiter = $form->{delimiter};
1170 my $steuernummer = $form->{steuernummer} if ($steuernummer eq '');
1172 $form->{FA_Oeffnungszeiten} =~ s/\\\\n/\n/g;
1176 my $input_steuernummer = USTVA->steuernummer_input(
1177 $form->{elsterland},
1178 $form->{elsterFFFF},
1179 $form->{steuernummer}
1182 $lxdebug->message(LXDebug::DEBUG1, qq|$input_steuernummer|);
1185 my $_hidden_variables_ref;
1187 my %_hidden_local_variables = (
1188 'elsterland' => $elsterland,
1189 'elsterFFFF' => $elsterFFFF,
1190 'warnung' => $warnung,
1191 'elstersteuernummer' => $elstersteuernummer,
1192 'steuernummer' => $stnr,
1193 'lastsub' => 'config_step1',
1194 'nextsub' => 'save',
1198 foreach my $variable (keys %_hidden_local_variables) {
1199 push @{ $_hidden_variables_ref },
1200 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1203 my @_hidden_form_variables = qw(
1204 FA_steuerberater_name FA_steuerberater_street
1205 FA_steuerberater_city FA_steuerberater_tel
1216 foreach my $variable (@_hidden_form_variables) {
1217 push @{ $_hidden_variables_ref},
1218 { 'variable' => $variable, 'value' => $form->{$variable} };
1221 my $template_ref = {
1222 tax_office_data => $tax_office_data,
1223 input_steuernummer => $input_steuernummer,
1224 readonly => '', #q|disabled="disabled"|,
1225 callback => $callback,
1226 hidden_variables => $_hidden_variables_ref,
1229 # Ausgabe des Templates
1230 print($form->parse_html_template('ustva/config_step2', $template_ref));
1233 $lxdebug->leave_sub();
1236 sub create_steuernummer {
1237 $lxdebug->enter_sub();
1238 my $part = $form->{part};
1239 my $patterncount = $form->{patterncount};
1240 my $delimiter = $form->{delimiter};
1241 my $elster_pattern = $form->{elster_pattern};
1243 # rebuild steuernummer and elstersteuernummer
1244 # es gibt eine gespeicherte steuernummer $form->{steuernummer}
1245 # und die parts und delimiter
1250 my $steuernummer_new = $part;
1251 my $elstersteuernummer_new = $form->{elster_FFFF};
1252 $elstersteuernummer_new .= '0';
1254 for ($h = 1; $h < $patterncount; $h++) {
1255 $steuernummer_new .= qq|$delimiter|;
1256 for (my $i = 1; $i <= length($elster_pattern); $i++) {
1257 $steuernummer_new .= $form->{"part_$h\_$i"};
1258 $elstersteuernummer_new .= $form->{"part_$h\_$i"};
1261 if ($form->{steuernummer} ne $steuernummer_new) {
1262 $form->{steuernummer} = $steuernummer_new;
1263 $form->{elstersteuernummer} = $elstersteuernummer_new;
1264 $form->{steuernummer_new} = $steuernummer_new;
1266 $form->{steuernummer_new} = '';
1267 $form->{elstersteuernummer_new} = '';
1269 $lxdebug->leave_sub();
1273 $lxdebug->enter_sub();
1275 my ($userpath, $filename) = @_;
1276 my ($key, $value) = '';
1277 open(FACONF, "$userpath/$form->{login}_$filename")
1278 or #falls Datei nicht vorhanden ist
1280 open(FANEW, ">$userpath/$form->{login}_$filename")
1281 or $form->error("$userpath/$filename : $!");
1283 open(FACONF, "$userpath/$form->{login}_$filename")
1284 or $form->error("$userpath/$form->{username}_$filename : $!");
1293 # remove any trailing whitespace
1294 s/^\s*(.*?)\s*$/$1/;
1295 ($key, $value) = split /=/, $_, 2;
1297 $form->{$key} = "$value";
1302 $lxdebug->leave_sub();
1306 $lxdebug->enter_sub();
1307 my $filename = "$form->{login}_$form->{filename}";
1309 #zuerst die steuernummer aus den part, parts_X_Y und delimiter herstellen
1310 create_steuernummer();
1312 # Textboxen formatieren: Linebreaks entfernen
1314 $form->{FA_Oeffnungszeiten} =~ s/\r\n/\\n/g;
1316 #URL mit http:// davor?
1317 $form->{FA_Internet} =~ s/^http:\/\///;
1318 $form->{FA_Internet} = 'http://' . $form->{FA_Internet};
1321 elster elsterland elstersteuernummer steuernummer
1322 elsteramt elsterFFFF FA_Name FA_Strasse
1323 FA_PLZ FA_Ort FA_Telefon FA_Fax
1324 FA_PLZ_Grosskunden FA_PLZ_Postfach FA_Postfach FA_BLZ_1
1325 FA_Kontonummer_1 FA_Bankbezeichnung_1 FA_BLZ_2 FA_Kontonummer_2
1326 FA_Bankbezeichnung_oertlich FA_Oeffnungszeiten
1327 FA_Email FA_Internet FA_voranmeld method FA_steuerberater_name
1328 FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
1329 FA_71 FA_dauerfrist);
1331 # Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
1332 if ($form->{elstersteuernummer} ne '000000000') {
1333 $form->{elster} = '1';
1334 open(CONF, ">$userspath/$filename") or $form->error("$filename : $!");
1336 # create the config file
1337 print CONF qq|# Configuration file for USTVA\n\n|;
1339 foreach $key (sort @config) {
1340 $form->{$key} =~ s/\\/\\\\/g;
1342 $form->{$key} =~ s/\r\n/\n/g;
1344 print CONF qq|$key=|;
1345 if ($form->{$key} ne 'Y') {
1346 print CONF qq|$form->{$key}\n|;
1348 if ($form->{$key} eq 'Y') {
1349 print CONF qq|checked \n|;
1352 print CONF qq|\n\n|;
1354 $form->{saved} = $locale->text('saved');
1358 $form->{saved} = $locale->text('Choose a Tax Number');
1362 $lxdebug->leave_sub();
1367 $lxdebug->enter_sub();
1369 # allow Symbolic references just here:
1371 &{ $form->{nextsub} };
1373 $lxdebug->leave_sub();
1377 $lxdebug->enter_sub();
1378 &{ $form->{lastsub} };
1379 $lxdebug->leave_sub();
1383 $lxdebug->enter_sub();
1384 my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
1385 $lxdebug->leave_sub();