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 USTVA->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 zum Einlesen der Finanzamtdaten aus finanzamt.ini
533 USTVA->get_config($userspath, 'finanzamt.ini');
535 # init some form vars
536 my @anmeldungszeitraum =
537 qw('0401' '0402' '0403'
541 '0441' '0442' '0443' '0444');
543 foreach my $item (@anmeldungszeitraum) {
547 #forgotten the year --> thisyear
548 if ($form->{year} !~ m/^\d\d\d\d$/) {
549 $form->{year} = substr(
551 $form->current_date(\%myconfig), \%myconfig
554 $lxdebug->message(LXDebug::DEBUG1,
555 qq|Actual year from Database: $form->{year}\n|);
559 # using dates in ISO-8601 format: yyyymmmdd for Postgres...
563 if ($form->{period} eq "13") {
564 $form->{fromdate} = "$form->{year}0101";
565 $form->{todate} = "$form->{year}1231";
569 if ($form->{period} eq "41") {
570 $form->{fromdate} = "$form->{year}0101";
571 $form->{todate} = "$form->{year}0331";
572 $form->{'0441'} = "X";
574 if ($form->{period} eq "42") {
575 $form->{fromdate} = "$form->{year}0401";
576 $form->{todate} = "$form->{year}0630";
577 $form->{'0442'} = "X";
579 if ($form->{period} eq "43") {
580 $form->{fromdate} = "$form->{year}0701";
581 $form->{todate} = "$form->{year}0930";
582 $form->{'0443'} = "X";
584 if ($form->{period} eq "44") {
585 $form->{fromdate} = "$form->{year}1001";
586 $form->{todate} = "$form->{year}1231";
587 $form->{'0444'} = "X";
592 $form->{period} eq "01" && do {
593 $form->{fromdate} = "$form->{year}0101";
594 $form->{todate} = "$form->{year}0131";
595 $form->{'0401'} = "X";
598 $form->{period} eq "02" && do {
599 $form->{fromdate} = "$form->{year}0201";
601 #this works from 1901 to 2099, 1900 and 2100 fail.
602 my $leap = ($form->{year} % 4 == 0) ? "29" : "28";
603 $form->{todate} = "$form->{year}02$leap";
604 $form->{"0402"} = "X";
607 $form->{period} eq "03" && do {
608 $form->{fromdate} = "$form->{year}0301";
609 $form->{todate} = "$form->{year}0331";
610 $form->{"0403"} = "X";
613 $form->{period} eq "04" && do {
614 $form->{fromdate} = "$form->{year}0401";
615 $form->{todate} = "$form->{year}0430";
616 $form->{"0404"} = "X";
619 $form->{period} eq "05" && do {
620 $form->{fromdate} = "$form->{year}0501";
621 $form->{todate} = "$form->{year}0531";
622 $form->{"0405"} = "X";
625 $form->{period} eq "06" && do {
626 $form->{fromdate} = "$form->{year}0601";
627 $form->{todate} = "$form->{year}0630";
628 $form->{"0406"} = "X";
631 $form->{period} eq "07" && do {
632 $form->{fromdate} = "$form->{year}0701";
633 $form->{todate} = "$form->{year}0731";
634 $form->{"0407"} = "X";
637 $form->{period} eq "08" && do {
638 $form->{fromdate} = "$form->{year}0801";
639 $form->{todate} = "$form->{year}0831";
640 $form->{"0408"} = "X";
643 $form->{period} eq "09" && do {
644 $form->{fromdate} = "$form->{year}0901";
645 $form->{todate} = "$form->{year}0930";
646 $form->{"0409"} = "X";
649 $form->{period} eq "10" && do {
650 $form->{fromdate} = "$form->{year}1001";
651 $form->{todate} = "$form->{year}1031";
652 $form->{"0410"} = "X";
655 $form->{period} eq "11" && do {
656 $form->{fromdate} = "$form->{year}1101";
657 $form->{todate} = "$form->{year}1130";
658 $form->{"0411"} = "X";
661 $form->{period} eq "12" && do {
662 $form->{fromdate} = "$form->{year}1201";
663 $form->{todate} = "$form->{year}1231";
664 $form->{"0412"} = "X";
669 # Kontrollvariable für die Templates
670 $form->{'year2007'} = ($form->{year} >= 2007 ) ? "1":"0";
674 USTVA->ustva(\%myconfig, \%$form);
676 # reformat Dates to dateformat
677 $form->{fromdate} = $locale->date(\%myconfig, $form->{fromdate}, 0, 0, 0);
679 $form->{todate} = $form->current_date(\%myconfig) unless $form->{todate};
680 $form->{todate} = $locale->date(\%myconfig, $form->{todate}, 0, 0, 0);
682 $form->{longperiod} =
683 $locale->date(\%myconfig, $form->current_date(\%myconfig), 1, 0, 0);
685 # if there are any dates construct a where
686 if ($form->{fromdate} || $form->{todate}) {
688 $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
690 my $longtodate = $locale->date($myconfig, $form->{todate}, 1, 0, 0);
691 my $shorttodate = $locale->date($myconfig, $form->{todate}, 0, 0, 0);
693 my $longfromdate = $locale->date($myconfig, $form->{fromdate}, 1, 0, 0);
694 my $shortfromdate = $locale->date($myconfig, $form->{fromdate}, 0, 0, 0);
696 $form->{this_period} = "$shortfromdate<br>\n$shorttodate";
697 $form->{longperiod} =
698 $locale->text('for Period')
699 . qq|<br>\n$longfromdate |
700 . $locale->text('to (date)')
704 if ($form->{comparefromdate} || $form->{comparetodate}) {
705 my $longcomparefromdate =
706 $locale->date(\%myconfig, $form->{comparefromdate}, 1, 0, 0);
707 my $shortcomparefromdate =
708 $locale->date(\%myconfig, $form->{comparefromdate}, 0, 0, 0);
710 my $longcomparetodate =
711 $locale->date(\%myconfig, $form->{comparetodate}, 1, 0, 0);
712 my $shortcomparetodate =
713 $locale->date(\%myconfig, $form->{comparetodate}, 0, 0, 0);
715 $form->{last_period} = "$shortcomparefromdate<br>\n$shortcomparetodate";
716 $form->{longperiod} .=
717 "<br>\n$longcomparefromdate "
718 . $locale->text('to (date)')
719 . qq| $longcomparetodate|;
722 $form->{Datum_heute} =
723 $locale->date(\%myconfig, $form->current_date(\%myconfig), 0, 0, 0);
725 # setup variables for the form
726 my @a = qw(company businessnumber tel fax email
727 co_chief co_department co_custom1 co_custom2 co_custom3 co_custom4 co_custom5
728 co_name1 co_name2 co_street co_street1 co_zip co_city co_city1 co_country co_tel co_tel1 co_tel2
729 co_fax co_fax1 co_email co_email1 co_url co_url1 ustid duns
730 co_bankname co_bankname1 co_bankname2 co_bankname3 co_blz co_blz1
731 co_blz2 co_blz3 co_accountnr co_accountnr1 co_accountnr2 co_accountnr3);
733 map { $form->{$_} = $myconfig{$_} } @a;
735 if ($form->{address} ne '') {
736 my $temp = $form->{address};
737 $temp =~ s/\\n/<br \/>/;
738 ($form->{co_street}, $form->{co_city}) = split("<br \/>", $temp);
739 $form->{co_city} =~ s/\\n//g;
742 ################################
744 # Nation specific customisations
746 ################################
750 if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU') {
753 # Outputformat specific customisation's
756 my @category_cent = qw(
757 511 861 36 80 971 931 98 96 53 74
758 85 65 66 61 62 67 63 64 59 69
759 39 83 811 891 Z43 Z45 Z53 Z62 Z65 Z67
763 my @category_euro = qw(
764 41 44 49 43 48 51 86 35 77 76 91 89
765 97 93 95 94 42 60 45 52 73 84 81
769 $form->{amount} = [];
771 if ( $form->{format} eq 'pdf' or $form->{format} eq 'postscript') {
773 $form->{IN} = "$form->{type}-$form->{year}.tex";
774 $form->{padding} = "~~";
775 $form->{bold} = "\textbf{";
776 $form->{endbold} = "}";
777 $form->{br} = '\\\\';
779 # Zahlenformatierung für Latex USTVA Formulare
781 foreach my $number (@category_euro) {
782 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
785 my ${decimal_comma} = ( $myconfig{numberformat} eq '1.000,00'
786 or $myconfig{numberformat} eq '1000,00' ) ? ',':'.';
788 foreach my $number (@category_cent) {
789 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '');
790 $form->{$number} =~ s/${decimal_comma}/~~/g;
793 } elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
795 $form->{IN} = $form->{type} . '.html';
796 $form->{padding} = " ";
797 $form->{bold} = "<b>";
798 $form->{endbold} = "</b>";
799 $form->{br} = "<br>";
800 $form->{address} =~ s/\\n/\n/g;
802 foreach $number (@category_cent) {
803 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
806 foreach $number (@category_euro) {
807 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '0');
810 } elsif ( $form->{format} eq 'elsterwinston' ) {
812 $form->{IN} = 'winston.xml';
815 # Build Winston filename
818 my $file = 'U'; # 1. char 'U' = USTVA
819 $file .= $form->{period};
820 #4. and 5. char = year modulo 100
821 $file .= sprintf("%02d", $form->{year} % 100);
822 #6. to 18. char = Elstersteuernummer
823 #Beispiel: Steuernummer in Bayern
824 #111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
825 $file .= $form->{elsterFFFF};
826 $file .= $form->{elstersteuernummer};
829 $form->{tmpfile} = "$userspath/$file";
831 $form->{attachment_filename} = "$file";
833 # Zahlenformatierung für Winston
835 my $temp_numberformat = $myconfig{numberformat};
837 # Numberformat must be '1000.00' for Winston
839 $myconfig{numberformat} = '1000.00';
841 foreach my $number (@category_cent) {
842 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
845 foreach my $number (@category_euro) {
846 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
848 # Re-set Numberformat
849 $myconfig{numberformat} = $temp_numberformat;
852 # push Kennziffern to <%foreach Array fo easyer
853 # output in xml format. Thx to Moritz.
854 my %winston_id_for = (
859 foreach my $kennziffer (@category_cent, @category_euro) {
861 next if ( $kennziffer =~ m/Z\d\d/);
862 next if ( $form->{$kennziffer} == 0 );
864 if (defined $winston_id_for{$kennziffer} ) {
865 push(@{ $form->{id}}, $winston_id_for{$kennziffer});
867 push(@{ $form->{id}}, "$kennziffer");
869 push(@{ $form->{amount}}, $form->{$kennziffer});
873 } elsif ( $form->{format} eq 'elstertaxbird' ) {
875 # Define serveral filenames
876 $form->{IN} = 'taxbird.txb';
878 $form->{attachment_filename} = "USTVA-" . $form->{period}
879 . sprintf("%02d", $form->{year} % 100) . ".txb";
881 $form->{tmpfile} = "$userspath/" . $form->{attachment_filename};
883 # TODO: set Output to UTF-8 or system Preference
884 #$form->{"iconv"} = Text::Iconv->new($myconfig{dbcharset}, "UTF-8");
885 #my $iconv = $self->{"iconv"};
886 #$iconv->convert($variable);
887 if ($form->{period} =~ /^[4]\d$/ ){
888 my %periods = ( # Lx => taxbird
895 foreach my $quarter ( keys %periods ) {
896 $form->{taxbird_period} = $periods{$quarter} if ( $form->{period} eq $quarter);
898 } elsif ($form->{period} =~ /^\d+$/ ) {
899 $form->{period} =~ s/^0//g;
900 my $period = $form->{period};
903 $form->{period} = $period;
906 USTVA::error( $locale->text('Wrong Period' ));
910 my %lands = ( # Lx => taxbird # TODO: besser als array...
911 'Baden Würtemberg' => '0',
914 'Brandenburg' => '3',
918 'Mecklenburg Vorpommern' => '7',
919 'Niedersachsen' => '8',
920 'Nordrhein Westfalen' => '9',
921 'Rheinland Pfalz' => '10',
924 'Sachsen Anhalt' => '13',
925 'Schleswig Holstein' => '14',
928 foreach my $land ( keys %lands ){
929 $form->{taxbird_land_nr} = $lands{$land} if ($form->{elsterland} eq $land );
932 $form->{co_zip} = $form->{co_city};
933 $form->{co_zip} =~ s/\D//g;
934 $form->{co_city} =~ s/\d//g;
935 $form->{co_city} =~ s/^\s//g;
937 ($form->{co_phone_prefix}, $form->{co_phone}) = split("-", $form->{tel});
938 $form->{co_phone_prefix} =~ s/\s//g;
939 $form->{co_phone} =~ s/\s//g;
941 $form->{taxbird_steuernummer} = $form->{steuernummer};
942 # $form->{taxbird_steuernummer} =~ s/\D//g;
943 $form->{taxbird_steuernummer} =~ s/\///; # ersten Querstrich ersetzen
945 # Numberformatting for Taxbird
946 my $temp_numberformat = $myconfig{numberformat};
947 # Numberformat must be '1000,00' for Taxbird ?!
948 $myconfig{numberformat} = '1000,00';
949 foreach my $number (@category_cent) {
950 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
953 foreach my $number (@category_euro) {
954 $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
956 # Re-set Numberformat
957 $myconfig{numberformat} = $temp_numberformat;
959 # push Kennziffern to <%foreach Array fo easyer
960 # output in xml format. Thx to Moritz.
961 my %taxbird_id_for = (
963 '511' => 'Kz51-calc',
964 '861' => 'Kz86-calc',
965 '971' => 'Kz97-calc',
966 '931' => 'Kz93-calc',
967 '811' => 'Kz81-calc',
968 '891' => 'Kz89-calc',
969 'Z45' => 'uebertrag',
971 'Z62' => 'ust-minus-vost',
972 'Z65' => 'ust-sum+69',
977 for my $kennziffer (@category_cent, @category_euro) {
979 next if ($kennziffer eq 'Z43');
981 if ($form->{$kennziffer} != 0){
982 if (defined $taxbird_id_for{$kennziffer}) {
983 push(@{ $form->{id}}, $taxbird_id_for{$kennziffer});
985 push(@{ $form->{id}}, "Kz$kennziffer");
987 push(@{ $form->{amount}}, $form->{$kennziffer});
991 } elsif ( $form->{format} eq '' ){ # No format error.
993 USTVA::error( $locale->text('Application Error. No Format given' ) . "!");
996 } else { # All other Formats are wrong
998 USTVA::error( $locale->text('Application Error. Wrong Format') . ": " . $form->{format} );
1003 } elsif ($form->{coa} eq 'Austria') {
1006 # Outputformat specific customisation's
1009 my @category_euro = qw(
1010 511 861 36 80 971 931 98 96 53 74
1011 85 65 66 61 62 67 63 64 59 69
1012 39 83 811 891 Z43 Z45 Z53 Z62 Z65 Z67
1013 41 44 49 43 48 51 86 35 77 76 91 89
1014 97 93 95 94 42 60 45 52 73 84 81
1018 if ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
1020 $form->{IN} = $form->{type} . '.html';
1021 $form->{padding} = " ";
1022 $form->{bold} = "<b>";
1023 $form->{endbold} = "</b>";
1024 $form->{br} = "<br>";
1025 $form->{address} =~ s/\\n/\n/g;
1027 foreach $number (@category_euro) {
1028 $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
1034 # end nation specific customisations
1036 if ( $form->{period} eq '13' and $form->{format} ne 'html') {
1040 'Yearly taxreport not yet implemented')
1044 $form->{templates} = $myconfig{templates};
1045 $form->{templates} = "doc" if ( $form->{type} eq 'help' );
1047 $form->parse_template(\%myconfig, $userspath);
1049 $lxdebug->leave_sub();
1053 $lxdebug->enter_sub();
1055 # edit all taxauthority prefs
1058 USTVA->get_config($userspath, 'finanzamt.ini');
1060 my $land = $form->{elsterland};
1061 my $amt = $form->{elsterFFFF};
1064 if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
1065 $callback = qq|$form->{cbscript}|
1066 .qq|?action="config_step1"|
1067 .qq|&login="$form->{cblogin}"|
1068 .qq|&path="$form->{cbpath}"|
1069 .qq|&root="$form->{cbroot}"|
1070 .qq|&rpw="$form->{cbrpw}"|;
1073 $form->{title} = $locale->text('Tax Office Preferences');
1076 my $select_tax_office = USTVA->fa_auswahl($land, $amt, &elster_hash());
1077 my $checked_accrual = q|checked="checked"| if ($form->{method} eq 'accrual');
1078 my $checked_cash = q|checked="checked"| if ($form->{method} eq 'cash');
1079 my $checked_monthly = "checked" if ($form->{FA_voranmeld} eq 'month');
1080 my $checked_quarterly = "checked" if ($form->{FA_voranmeld} eq 'quarter');
1081 my $checked_dauerfristverlaengerung = "checked" if ($form->{FA_dauerfrist} eq '1');
1082 my $checked_kz_71 = "checked" if ($form->{FA_71} eq 'X');
1084 my $_hidden_variables_ref;
1086 my %_hidden_local_variables = (
1087 'saved' => $locale->text('Check Details'),
1088 'nextsub' => 'config_step2',
1092 foreach my $variable (keys %_hidden_local_variables) {
1093 push @{ $_hidden_variables_ref },
1094 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1097 my @_hidden_form_variables = qw(
1098 FA_Name FA_Strasse FA_PLZ
1099 FA_Ort FA_Telefon FA_Fax
1100 FA_PLZ_Grosskunden FA_PLZ_Postfach FA_Postfach
1101 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1102 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1103 FA_Oeffnungszeiten FA_Email FA_Internet
1104 steuernummer elsterland elstersteuernummer
1105 elsterFFFF path login
1109 foreach my $variable (@_hidden_form_variables) {
1110 push @{ $_hidden_variables_ref},
1111 { 'variable' => $variable, 'value' => $form->{$variable} };
1115 my $steuernummer_new = '';
1117 # Variablen für das Template zur Verfügung stellen
1118 my $template_ref = {
1119 select_tax_office => $select_tax_office,
1120 checked_accrual => $checked_accrual,
1121 checked_cash => $checked_cash,
1122 checked_monthly => $checked_monthly,
1123 checked_quarterly => $checked_quarterly,
1124 checked_dauerfristverlaengerung => $checked_dauerfristverlaengerung,
1125 hidden_variables => $_hidden_variables_ref,
1129 # Ausgabe des Templates
1130 print($form->parse_html_template('ustva/config_step1', $template_ref));
1132 $lxdebug->leave_sub();
1136 $lxdebug->enter_sub();
1143 my $elsterland = '';
1144 my $elster_amt = '';
1145 my $elsterFFFF = '';
1146 my $elstersteuernummer = '';
1147 USTVA->get_config($userspath, 'finanzamt.ini')
1148 if ($form->{saved} eq $locale->text('saved'));
1150 # Auf Übergabefehler checken
1151 USTVA::info( $locale->text('Missing Tax Authoritys Preferences') . "\n"
1152 . $locale->text('USTVA-Hint: Tax Authoritys'))
1153 if ( $form->{elsterFFFF_new} eq 'Auswahl'
1154 || $form->{elsterland_new} eq 'Auswahl');
1155 USTVA::info( $locale->text('Missing Method!') . "\n"
1156 . $locale->text('USTVA-Hint: Method'))
1157 if ($form->{method} eq '');
1159 # Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
1160 # der vorherigen Maske stattfanden: $change = 1(in der edit sub,
1161 # mittels get_config)
1163 my $change = $form->{elsterland} eq $form->{elsterland_new}
1164 && $form->{elsterFFFF} eq $form->{elsterFFFF_new} ? '0' : '1';
1165 $change = '0' if ($form->{saved} eq $locale->text('saved'));
1166 my $elster_init = &elster_hash();
1168 my %elster_init = %$elster_init;
1170 if ($change eq '1') {
1173 $elsterland = $form->{elsterland_new};
1174 $elsterFFFF = $form->{elsterFFFF_new};
1175 $form->{elsterland} = $elsterland;
1176 $form->{elsterFFFF} = $elsterFFFF;
1177 $form->{steuernummer} = '';
1179 create_steuernummer();
1181 # rebuild elster_amt
1183 foreach $amt (keys %{ $elster_init{ $form->{elsterland} } }) {
1185 if ($elster_init{ $form->{elsterland}{$amt} eq $form->{elsterFFFF} });
1188 # load the predefined hash data into the FA_* Vars
1189 my @variables = qw(FA_Name FA_Strasse FA_PLZ FA_Ort
1190 FA_Telefon FA_Fax FA_PLZ_Grosskunden FA_PLZ_Postfach
1192 FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
1193 FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
1194 FA_Oeffnungszeiten FA_Email FA_Internet);
1196 for (my $i = 0; $i <= 20; $i++) {
1197 $form->{ $variables[$i] } =
1198 $elster_init->{$elsterland}->{$elsterFFFF}->[$i];
1203 $elsterland = $form->{elsterland};
1204 $elsterFFFF = $form->{elsterFFFF};
1207 my $stnr = $form->{steuernummer};
1209 my $patterncount = $form->{patterncount};
1210 my $elster_pattern = $form->{elster_pattern};
1211 my $delimiter = $form->{delimiter};
1212 my $steuernummer = $form->{steuernummer} if ($steuernummer eq '');
1214 $form->{FA_Oeffnungszeiten} =~ s/\\\\n/\n/g;
1218 my $input_steuernummer = USTVA->steuernummer_input(
1219 $form->{elsterland},
1220 $form->{elsterFFFF},
1221 $form->{steuernummer}
1224 $lxdebug->message(LXDebug::DEBUG1, qq|$input_steuernummer|);
1227 my $_hidden_variables_ref;
1229 my %_hidden_local_variables = (
1230 'elsterland' => $elsterland,
1231 'elsterFFFF' => $elsterFFFF,
1232 'warnung' => $warnung,
1233 'elstersteuernummer' => $elstersteuernummer,
1234 'steuernummer' => $stnr,
1235 'lastsub' => 'config_step1',
1236 'nextsub' => 'save',
1240 foreach my $variable (keys %_hidden_local_variables) {
1241 push @{ $_hidden_variables_ref },
1242 { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
1245 my @_hidden_form_variables = qw(
1246 FA_steuerberater_name FA_steuerberater_street
1247 FA_steuerberater_city FA_steuerberater_tel
1258 foreach my $variable (@_hidden_form_variables) {
1259 push @{ $_hidden_variables_ref},
1260 { 'variable' => $variable, 'value' => $form->{$variable} };
1263 my $template_ref = {
1264 tax_office_data => $tax_office_data,
1265 input_steuernummer => $input_steuernummer,
1266 readonly => '', #q|disabled="disabled"|,
1267 callback => $callback,
1268 hidden_variables => $_hidden_variables_ref,
1271 # Ausgabe des Templates
1272 print($form->parse_html_template('ustva/config_step2', $template_ref));
1275 $lxdebug->leave_sub();
1278 sub create_steuernummer {
1279 $lxdebug->enter_sub();
1280 my $part = $form->{part};
1281 my $patterncount = $form->{patterncount};
1282 my $delimiter = $form->{delimiter};
1283 my $elster_pattern = $form->{elster_pattern};
1285 # rebuild steuernummer and elstersteuernummer
1286 # es gibt eine gespeicherte steuernummer $form->{steuernummer}
1287 # und die parts und delimiter
1292 my $steuernummer_new = $part;
1293 my $elstersteuernummer_new = $form->{elster_FFFF};
1294 $elstersteuernummer_new .= '0';
1296 for ($h = 1; $h < $patterncount; $h++) {
1297 $steuernummer_new .= qq|$delimiter|;
1298 for (my $i = 1; $i <= length($elster_pattern); $i++) {
1299 $steuernummer_new .= $form->{"part_$h\_$i"};
1300 $elstersteuernummer_new .= $form->{"part_$h\_$i"};
1303 if ($form->{steuernummer} ne $steuernummer_new) {
1304 $form->{steuernummer} = $steuernummer_new;
1305 $form->{elstersteuernummer} = $elstersteuernummer_new;
1306 $form->{steuernummer_new} = $steuernummer_new;
1308 $form->{steuernummer_new} = '';
1309 $form->{elstersteuernummer_new} = '';
1311 $lxdebug->leave_sub();
1315 $lxdebug->enter_sub();
1316 my $filename = "$form->{login}_$form->{filename}";
1318 #zuerst die steuernummer aus den part, parts_X_Y und delimiter herstellen
1319 create_steuernummer();
1321 # Textboxen formatieren: Linebreaks entfernen
1323 $form->{FA_Oeffnungszeiten} =~ s/\r\n/\\n/g;
1325 #URL mit http:// davor?
1326 $form->{FA_Internet} =~ s/^http:\/\///;
1327 $form->{FA_Internet} = 'http://' . $form->{FA_Internet};
1330 elster elsterland elstersteuernummer steuernummer
1331 elsteramt elsterFFFF FA_Name FA_Strasse
1332 FA_PLZ FA_Ort FA_Telefon FA_Fax
1333 FA_PLZ_Grosskunden FA_PLZ_Postfach FA_Postfach FA_BLZ_1
1334 FA_Kontonummer_1 FA_Bankbezeichnung_1 FA_BLZ_2 FA_Kontonummer_2
1335 FA_Bankbezeichnung_oertlich FA_Oeffnungszeiten
1336 FA_Email FA_Internet FA_voranmeld method FA_steuerberater_name
1337 FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
1338 FA_71 FA_dauerfrist);
1340 # Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
1341 if ($form->{elstersteuernummer} ne '000000000') {
1342 $form->{elster} = '1';
1343 open(CONF, ">$userspath/$filename") or $form->error("$filename : $!");
1345 # create the config file
1346 print CONF qq|# Configuration file for USTVA\n\n|;
1348 foreach $key (sort @config) {
1349 $form->{$key} =~ s/\\/\\\\/g;
1351 $form->{$key} =~ s/\r\n/\n/g;
1353 print CONF qq|$key=|;
1354 if ($form->{$key} ne 'Y') {
1355 print CONF qq|$form->{$key}\n|;
1357 if ($form->{$key} eq 'Y') {
1358 print CONF qq|checked \n|;
1361 print CONF qq|\n\n|;
1363 $form->{saved} = $locale->text('saved');
1367 $form->{saved} = $locale->text('Choose a Tax Number');
1371 $lxdebug->leave_sub();
1376 $lxdebug->enter_sub();
1378 # allow Symbolic references just here:
1380 &{ $form->{nextsub} };
1382 $lxdebug->leave_sub();
1386 $lxdebug->enter_sub();
1387 &{ $form->{lastsub} };
1388 $lxdebug->leave_sub();
1392 $lxdebug->enter_sub();
1393 my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
1394 $lxdebug->leave_sub();