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 "bin/mozilla/arap.pl";
 
  28 require "bin/mozilla/common.pl";
 
  33 #use warnings; # FATAL=> 'all';
 
  34 #use vars qw($locale $form %myconfig);
 
  36 #use CGI::Carp "fatalsToBrowser";
 
  44 # this is for our long dates
 
  45 # $locale->text('January')
 
  46 # $locale->text('February')
 
  47 # $locale->text('March')
 
  48 # $locale->text('April')
 
  49 # $locale->text('May ')
 
  50 # $locale->text('June')
 
  51 # $locale->text('July')
 
  52 # $locale->text('August')
 
  53 # $locale->text('September')
 
  54 # $locale->text('October')
 
  55 # $locale->text('November')
 
  56 # $locale->text('December')
 
  58 # this is for our short month
 
  59 # $locale->text('Jan')
 
  60 # $locale->text('Feb')
 
  61 # $locale->text('Mar')
 
  62 # $locale->text('Apr')
 
  63 # $locale->text('May')
 
  64 # $locale->text('Jun')
 
  65 # $locale->text('Jul')
 
  66 # $locale->text('Aug')
 
  67 # $locale->text('Sep')
 
  68 # $locale->text('Oct')
 
  69 # $locale->text('Nov')
 
  70 # $locale->text('Dec')
 
  72 # $form->parse_html_template('generic/util_hidden_variables');
 
  74 #############################
 
  77   $lxdebug->enter_sub();
 
  79   my $myconfig = \%myconfig;
 
  81   $form->{title} = $locale->text('UStVA');
 
  82   $form->{kz10}  = '';                       #Berichtigte Anmeldung? Ja =1 Nein=0
 
  84   my $year = substr($form->datetonum($form->current_date(\%myconfig), \%myconfig ),
 
  91   # Einlesen der Finanzamtdaten
 
  92   USTVA->get_config($userspath, 'finanzamt.ini');
 
  94   # Hier Einlesen der user-config
 
  95   # steuernummer entfernt für prerelease
 
  97     signature      name          company       address        businessnumber 
 
  98     tel            fax           email         co_chief       co_department 
 
  99     co_custom1     co_custom2    co_custom3    co_custom4     co_custom5
 
 100     co_name1       co_name2      co_street     co_street1     co_zip 
 
 101     co_city        co_city1      co_country    co_tel         co_tel1 
 
 102     co_tel2        co_fax        co_fax1       co_email       co_email1
 
 103     co_url         co_url1       ustid         duns           co_bankname 
 
 104     co_bankname1   co_bankname2  co_bankname3  co_blz         co_blz1
 
 105     co_blz2        co_blz3       co_accountnr  co_accountnr1  co_accountnr2 
 
 109   map { $form->{$_} = $myconfig->{$_} } @a;
 
 111   my $openings = $form->{FA_Oeffnungszeiten};
 
 112   $openings =~ s/\\\\n/<br>/g;
 
 114   my $company_given = ($form->{company} ne '') 
 
 115     ? qq|<h3>$form->{company}</h3>\n|
 
 116     : qq|<a href=am.pl?action=config|
 
 117       . qq|&level=Programm--Preferences&login=$form->{login}|
 
 118       . qq|&password=$form->{password}>| 
 
 119       . $locale->text('No Company Name given') . qq|!</a><br>|;
 
 122   # Anpassungen der Variablennamen auf pre 2.1.1 Namen
 
 123   # klären, ob $form->{company_street|_address} gesetzt sind
 
 124   if ($form->{address} ne '') {
 
 125     my $temp = $form->{address};
 
 126     $temp =~ s/\\n/<br \/>/;
 
 127     ($form->{co_street}, $form->{co_city}) = split("<br \/>", $temp);
 
 128     $form->{co_city} =~ s/\\n//g;
 
 133     ($form->{co_street} ne '' 
 
 135         $form->{co_zip} ne ''
 
 136           or $form->{co_city} ne ''
 
 139     ? qq|$form->{co_street}<br>|
 
 140         . qq|$form->{co_street1}<br>|
 
 141         . qq|$form->{co_zip} $form->{co_city}|
 
 142     : qq|<a href=am.pl?action=config|
 
 143         . qq|&level=Programm--Preferences&login=$form->{login}|
 
 144         . qq|&password=$form->{password}>| 
 
 145         . $locale->text('No Company Address given') 
 
 148   $form->{co_email} = $form->{email} unless $form->{co_email};
 
 149   $form->{co_tel}   = $form->{tel}   unless $form->{co_tel};
 
 150   $form->{co_fax}   = $form->{fax}   unless $form->{co_fax};
 
 151   $form->{co_url}   = $form->{urlx}  unless $form->{co_url};
 
 153   my $taxnumber_given = ($form->{steuernummer} ne '')
 
 154     ? qq|$form->{steuernummer}|
 
 155     : qq|<a href="ustva.pl?action="config_step1"|
 
 156       . qq|&level=Programm--Finanzamteinstellungen&login=$form->{login}|
 
 157       . qq|&password=$form->{password}">Keine Steuernummer hinterlegt!|
 
 160   my $ustva_vorauswahl = &ustva_vorauswahl();
 
 162   my @all_years = $form->all_years(\%myconfig);
 
 164   my $select_year = qq|<select name=year title="| 
 
 165     . $locale->text('Year') . qq|">|;
 
 166   foreach my $key (@all_years) {
 
 167     $select_year .= qq|<option |;
 
 168     $select_year .= qq|selected| if ($key eq $form->{year});
 
 169     $select_year .= qq| >$key</option>|;
 
 171   $select_year   .=  qq|</select>|;
 
 174   $_checked = "checked" if ($form->{kz10} eq '1');
 
 175   my $checkbox_kz_10 = qq|<input name="FA_10" id=FA_10 class=checkbox|
 
 176     . qq| type=checkbox value="1" $_checked title = "|
 
 177     . $locale->text('Amended Advance Turnover Tax Return (Nr. 10)')
 
 179     . $locale->text('Amended Advance Turnover Tax Return'); 
 
 181   my $method_local = ($form->{method} eq 'accrual') ? $locale->text('accrual') 
 
 182                    : ($form->{method} eq 'cash')    ? $locale->text('cash')
 
 185   my $period_local = ( $form->{FA_voranmeld} eq 'month')   ? $locale->text('month')
 
 186                    : ( $form->{FA_voranmeld} eq 'quarter') ? $locale->text('quarter')
 
 189   my $tax_office_banks_ref = [
 
 190     { BLZ             => $form->{FA_BLZ_1},
 
 191       Kontonummer     => $form->{FA_Kontonummer_1},
 
 192       Bankbezeichnung => $form->{FA_Bankbezeichnung_1}
 
 194     { BLZ             => $form->{FA_BLZ_2},
 
 195       Kontonummer     => $form->{FA_Kontonummer_2},
 
 196       Bankbezeichnung => $form->{FA_Bankbezeichnung_oertlich}
 
 202     openings         => $openings,  
 
 203     company_given    => $company_given,
 
 204     address_given    => $address_given,     
 
 205     taxnumber_given  => $taxnumber_given,
 
 206     select_year      => $select_year,      
 
 207     period_local     => $period_local,
 
 208     method_local     => $method_local,
 
 209     ustva_vorauswahl => $ustva_vorauswahl,
 
 210     checkbox_kz_10   => $checkbox_kz_10,
 
 211     tax_office_banks => $tax_office_banks_ref,    
 
 212     select_options   => &show_options,    
 
 215   print($form->parse_html_template('ustva/report', $template_ref));
 
 219   $lxdebug->leave_sub();
 
 225   $lxdebug->enter_sub();
 
 227   # parse help documents under doc
 
 228   my $tmp = $form->{templates};
 
 229   $form->{templates} = 'doc';
 
 230   $form->{help}      = 'ustva';
 
 231   $form->{type}      = 'help';
 
 232   $form->{format}    = 'html';
 
 235   #$form->{templates} = $tmp;
 
 236   $lxdebug->leave_sub();
 
 240   $lxdebug->enter_sub();
 
 244   $lxdebug->leave_sub();
 
 245   call_sub($form->{"nextsub"});
 
 249 sub ustva_vorauswahl {
 
 250   $lxdebug->enter_sub();
 
 252   my $select_vorauswahl;
 
 254   #Aktuelles Datum zerlegen:
 
 255   my $date = $form->datetonum($form->current_date(\%myconfig), \%myconfig);
 
 257   #$locale->date($myconfig, $form->current_date($myconfig), 0)=~ /(\d\d).(\d\d).(\d\d\d\d)/;
 
 258   $form->{day}   = substr($date, 6, 2);
 
 259   $form->{month} = substr($date, 4, 2);
 
 260   $form->{year}  = substr($date, 0, 4);
 
 261   $lxdebug->message(LXDebug::DEBUG1, qq|
 
 262     Actual date from Database: $date\n    
 
 263     Actual year from Database: $form->{year}\n
 
 264     Actual day from Database: $form->{day}\n
 
 265     Actual month from Database: $form->{month}\n|);
 
 270   # Testdaten erzeugen:
 
 272   #$form->{month}= '01';
 
 273   #$form->{year}= 2004;
 
 274   $select_vorauswahl = qq|
 
 275      <input type=hidden name=day value=$form->{day}>
 
 276      <input type=hidden name=month value=$form->{month}>
 
 277      <input type=hidden name=yymmdd value=$yymmdd>
 
 278      <input type=hidden name=sel value=$sel>
 
 281   if ($form->{FA_voranmeld} eq 'month') {
 
 283     # Vorauswahl bei monatlichem Voranmeldungszeitraum
 
 285     my %liste = ('01' => $locale->text('January'),
 
 286                  '02' => $locale->text('February'),
 
 287                  '03' => $locale->text('March'),
 
 288                  '04' => $locale->text('April'),
 
 289                  '05' => $locale->text('May'),
 
 290                  '06' => $locale->text('June'),
 
 291                  '07' => $locale->text('July'),
 
 292                  '08' => $locale->text('August'),
 
 293                  '09' => $locale->text('September'),
 
 294                  '10' => $locale->text('October'),
 
 295                  '11' => $locale->text('November'),
 
 296                  '12' => $locale->text('December'),
 
 297                  '13' => $locale->text('Yearly'),
 
 300     my $yy = $form->{year} * 10000;
 
 301     $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
 
 305     # Offset für Dauerfristverlängerung
 
 306     $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
 
 309       $yymmdd <= ($yy + 110 + $dfv) && do {
 
 310         $form->{year} = $form->{year} - 1;
 
 314       $yymmdd <= ($yy + 210 + $dfv) && do {
 
 318       $yymmdd <= ($yy + 310 + $dfv) && do {
 
 322       $yymmdd <= ($yy + 410 + $dfv) && do {
 
 326       $yymmdd <= ($yy + 510 + $dfv) && do {
 
 330       $yymmdd <= ($yy + 610 + $dfv) && do {
 
 334       $yymmdd <= ($yy + 710 + $dfv) && do {
 
 338       $yymmdd <= ($yy + 810 + $dfv) && do {
 
 342       $yymmdd <= ($yy + 910 + $dfv) && do {
 
 346       $yymmdd <= ($yy + 1010 + $dfv) && do {
 
 350       $yymmdd <= ($yy + 1110 + $dfv) && do {
 
 354       $yymmdd <= ($yy + 1210) && do {
 
 358       $yymmdd <= ($yy + 1231) && do {
 
 364     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
 
 365   . $locale->text('Select a period') . qq|" >|;
 
 368     foreach $key (sort keys %liste) {
 
 370       $selected = 'selected' if ($sel eq $key);
 
 371       $select_vorauswahl .= qq|
 
 372          <option value="$key" $selected> $liste{$key}</option>
 
 375     $select_vorauswahl .= qq|</select>|;
 
 377   } elsif ($form->{FA_voranmeld} eq 'quarter') {
 
 379     # Vorauswahl bei quartalsweisem Voranmeldungszeitraum
 
 380     my %liste = ('41'  => $locale->text('1. Quarter'),
 
 381                  '42'  => $locale->text('2. Quarter'),
 
 382                  '43'  => $locale->text('3. Quarter'),
 
 383                  '44'  => $locale->text('4. Quarter'),
 
 384                  '13' => $locale->text('Yearly'),);
 
 386     my $yy = $form->{year} * 10000;
 
 387     $yymmdd = "$form->{year}$form->{month}$form->{day}" * 1;
 
 389     my $dfv = '';    # Offset für Dauerfristverlängerung
 
 390     $dfv = '100' if ($form->{FA_dauerfrist} eq '1');
 
 393       $yymmdd <= ($yy + 110 + $dfv) && do {
 
 394         $form->{year} = $form->{year} - 1;
 
 398       $yymmdd <= ($yy + 410 + $dfv) && do {
 
 402       $yymmdd <= ($yy + 710 + $dfv) && do {
 
 406       $yymmdd <= ($yy + 1010 + $dfv) && do {
 
 410       $yymmdd <= ($yy + 1231) && do {
 
 415     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
 
 416       . $locale->text('Select a period') . qq|" >|;
 
 418     foreach $key (sort keys %liste) {
 
 420       $selected = 'selected' if ($sel eq $key);
 
 421       $select_vorauswahl .= qq|
 
 422          <option value="$key" $selected>$liste{$key}</option>
 
 425     $select_vorauswahl .= qq|\n</select>
 
 430     # keine Vorauswahl bei Voranmeldungszeitraum
 
 431     $select_vorauswahl .= qq|<select id="zeitraum" name="period" title="|
 
 432       . $locale->text('Select a period') . qq|" >|;
 
 434     my %listea = ('41' => '1. Quarter',
 
 435                   '42' => '2. Quarter',
 
 436                   '43' => '3. Quarter',
 
 437                   '44' => '4. Quarter',);
 
 439     my %listeb = ('01' => 'January',
 
 453     foreach $key (sort keys %listea) {
 
 454       $select_vorauswahl .= qq|
 
 455          <option value="$key">|
 
 456         . $locale->text("$listea{$key}")
 
 460     foreach $key (sort keys %listeb) {
 
 461       $select_vorauswahl .= qq|
 
 462          <option value="$key">|
 
 463         . $locale->text("$listeb{$key}")
 
 466     $select_vorauswahl .= qq|</select>|;
 
 468   $lxdebug->leave_sub();
 
 470   return $select_vorauswahl;
 
 474 #  $lxdebug->enter_sub();
 
 476 #  $lxdebug->leave_sub();
 
 480   $lxdebug->enter_sub();
 
 482   $lxdebug->leave_sub();
 
 486   $lxdebug->enter_sub();
 
 488   #  $form->{PD}{$form->{type}} = "selected";
 
 489   #  $form->{DF}{$form->{format}} = "selected";
 
 490   #  $form->{OP}{$form->{media}} = "selected";
 
 491   #  $form->{SM}{$form->{sendmode}} = "selected";
 
 492   my $type   = qq|      <input type=hidden name="type" value="ustva">|;
 
 493   my $media  = qq|      <input type=hidden name="media" value="screen">|;
 
 495       qq|       <option value=html selected>|
 
 496     . $locale->text('Preview')
 
 498   if ($latex_templates) {
 
 500         qq|    <option value=pdf>|
 
 501       . $locale->text('UStVA (PDF-Dokument)')
 
 505   #my $disabled= qq|disabled="disabled"|;
 
 506   #$disabled='' if ($form->{elster} eq '1' );
 
 507   if ($form->{elster} eq '1') {
 
 509         qq|<option value=elsterwinston>|
 
 510       . $locale->text('ELSTER Export (Winston)')
 
 512       . qq|<option value=elstertaxbird>|
 
 513       . $locale->text('ELSTER Export (Taxbird)')
 
 517   #$format .= qq|<option value=elster>|.$locale->text('ELSTER Export nach Winston').qq|</option>|;
 
 518   my $show_options = qq|
 
 521     <select name=format title = "|
 
 522     . $locale->text('Choose Outputformat') . qq|">$format</select>
 
 524   $lxdebug->leave_sub();
 
 526   return $show_options;
 
 530   $lxdebug->enter_sub();
 
 532   # Aufruf von get_config zum Einlesen der Finanzamtdaten aus finanzamt.ini
 
 534   USTVA->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;
 
 743   ################################
 
 745   # Nation specific customisations
 
 747   ################################
 
 751   if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU') {
 
 754     # Outputformat specific customisation's
 
 757     my @category_cent = qw(
 
 758       511 861 36   80   971  931  98   96   53   74
 
 759       85  65  66   61   62   67   63   64   59   69 
 
 760       39  83  811  891  Z43  Z45  Z53  Z62  Z65  Z67
 
 764     my @category_euro = qw(
 
 765       41 44 49 43 48 51 86 35 77 76 91 89
 
 766       97 93 95 94 42 60 45 52 73 84 81 
 
 770     $form->{amount} = [];
 
 772     if ( $form->{format} eq 'pdf' or $form->{format} eq 'postscript') {
 
 774       $form->{IN} = "$form->{type}-$form->{year}.tex";
 
 775       $form->{padding} = "~~";
 
 776       $form->{bold}    = "\textbf{";
 
 777       $form->{endbold} = "}";
 
 778       $form->{br}      = '\\\\';
 
 780       # Zahlenformatierung für Latex USTVA Formulare
 
 782       foreach my $number (@category_euro) {
 
 783         $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '');
 
 786       my ${decimal_comma} = ( $myconfig{numberformat} eq '1.000,00'
 
 787            or $myconfig{numberformat} eq '1000,00' ) ? ',':'.';
 
 789       foreach my $number (@category_cent) {
 
 790         $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '');
 
 791         $form->{$number} =~ s/${decimal_comma}/~~/g;
 
 794     } elsif ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
 
 796       $form->{IN} = $form->{type} . '.html';
 
 797       $form->{padding} = "  ";
 
 798       $form->{bold}    = "<b>";
 
 799       $form->{endbold} = "</b>";
 
 800       $form->{br}      = "<br>";
 
 801       $form->{address} =~ s/\\n/\n/g;
 
 803       foreach $number (@category_cent) {
 
 804         $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
 
 807       foreach $number (@category_euro) {
 
 808         $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '0', '0');
 
 811     } elsif ( $form->{format} eq 'elsterwinston' ) {
 
 813       $form->{IN} = 'winston.xml';
 
 816       # Build Winston filename
 
 819       my $file = 'U';     # 1. char 'U' = USTVA
 
 820       $file .= $form->{period};
 
 821       #4. and 5. char = year modulo 100
 
 822       $file .= sprintf("%02d", $form->{year} % 100);
 
 823       #6. to 18. char = Elstersteuernummer
 
 824       #Beispiel: Steuernummer in Bayern
 
 825       #111/222/33334 ergibt für UStVA Jan 2004: U01049111022233334
 
 826       $file .= $form->{elsterFFFF};
 
 827       $file .= $form->{elstersteuernummer};
 
 830       $form->{tmpfile} = "$userspath/$file";
 
 832       $form->{attachment_filename} = "$file";
 
 834       # Zahlenformatierung für Winston
 
 836       my $temp_numberformat = $myconfig{numberformat};
 
 838       # Numberformat must be '1000.00' for Winston
 
 840       $myconfig{numberformat} = '1000.00';
 
 842       foreach my $number (@category_cent) {
 
 843         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
 
 846       foreach my $number (@category_euro) {
 
 847         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
 
 849       # Re-set Numberformat
 
 850       $myconfig{numberformat} = $temp_numberformat;
 
 853       # push Kennziffern to <%foreach Array fo easyer
 
 854       # output in xml format. Thx to Moritz.
 
 855       my %winston_id_for = (
 
 860       foreach my $kennziffer (@category_cent, @category_euro) {
 
 862         next if ( $kennziffer =~ m/Z\d\d/);
 
 863         next if (   $form->{$kennziffer} == 0 );
 
 865         if (defined $winston_id_for{$kennziffer} ) {
 
 866           push(@{ $form->{id}}, $winston_id_for{$kennziffer});
 
 868           push(@{ $form->{id}}, "$kennziffer"); 
 
 870         push(@{ $form->{amount}}, $form->{$kennziffer});
 
 874     } elsif ( $form->{format} eq 'elstertaxbird' ) {
 
 876       # Define serveral filenames
 
 877       $form->{IN} = 'taxbird.txb';
 
 879       $form->{attachment_filename} = "USTVA-" . $form->{period} 
 
 880       . sprintf("%02d", $form->{year} % 100) . ".txb";
 
 882       $form->{tmpfile} = "$userspath/" . $form->{attachment_filename};
 
 884       # TODO: set Output to UTF-8 or system Preference
 
 885       #$form->{"iconv"} = Text::Iconv->new($myconfig{dbcharset}, "UTF-8");
 
 886       #my $iconv = $self->{"iconv"};
 
 887       #$iconv->convert($variable);
 
 888       if ($form->{period} =~ /^[4]\d$/ ){
 
 889         my %periods = ( # Lx => taxbird
 
 896         foreach my $quarter ( keys %periods ) {
 
 897           $form->{taxbird_period} = $periods{$quarter} if ( $form->{period} eq $quarter);
 
 899       } elsif ($form->{period} =~ /^\d+$/ ) {
 
 900         $form->{period} =~ s/^0//g;
 
 901         my $period = $form->{period};
 
 904         $form->{period} = $period;
 
 907         USTVA::error( $locale->text('Wrong Period' ));
 
 911       my %lands = ( # Lx => taxbird # TODO: besser als array...
 
 912                   'Baden Würtemberg'       => '0',
 
 915                   'Brandenburg'            => '3',
 
 919                   'Mecklenburg Vorpommern' => '7',
 
 920                   'Niedersachsen'          => '8',
 
 921                   'Nordrhein Westfalen'    => '9',
 
 922                   'Rheinland Pfalz'        => '10',
 
 925                   'Sachsen Anhalt'         => '13',
 
 926                   'Schleswig Holstein'     => '14',
 
 929       foreach my $land ( keys %lands ){
 
 930         $form->{taxbird_land_nr} = $lands{$land} if ($form->{elsterland} eq $land );
 
 933       $form->{co_zip} = $form->{co_city};
 
 934       $form->{co_zip} =~ s/\D//g;
 
 935       $form->{co_city} =~ s/\d//g;
 
 936       $form->{co_city} =~ s/^\s//g;
 
 938       ($form->{co_phone_prefix}, $form->{co_phone}) = split("-", $form->{tel});
 
 939       $form->{co_phone_prefix} =~ s/\s//g;
 
 940       $form->{co_phone} =~ s/\s//g;
 
 942        $form->{taxbird_steuernummer} = $form->{steuernummer};
 
 943       #      $form->{taxbird_steuernummer} =~ s/\D//g;
 
 944       $form->{taxbird_steuernummer} =~ s/\///; # ersten Querstrich ersetzen
 
 946       # Numberformatting for Taxbird
 
 947       my $temp_numberformat = $myconfig{numberformat};
 
 948       # Numberformat must be '1000,00' for Taxbird ?!
 
 949       $myconfig{numberformat} = '1000,00';
 
 950       foreach my $number (@category_cent) {
 
 951         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '2', '') : '';
 
 954       foreach my $number (@category_euro) {
 
 955         $form->{$number} = ( $form->{$number} !=0 ) ? $form->format_amount(\%myconfig, $form->{$number}, '0', '') : '';
 
 957       # Re-set Numberformat
 
 958       $myconfig{numberformat} = $temp_numberformat;
 
 960       # push Kennziffern to <%foreach Array fo easyer
 
 961       # output in xml format. Thx to Moritz.
 
 962       my %taxbird_id_for = (
 
 964           '511'  =>  'Kz51-calc',
 
 965           '861'  =>  'Kz86-calc',
 
 966           '971'  =>  'Kz97-calc',
 
 967           '931'  =>  'Kz93-calc',
 
 968           '811'  =>  'Kz81-calc',
 
 969           '891'  =>  'Kz89-calc',
 
 970           'Z45'  =>  'uebertrag',
 
 972           'Z62'  =>  'ust-minus-vost',
 
 973           'Z65'  =>  'ust-sum+69',
 
 978       for my $kennziffer (@category_cent, @category_euro) {
 
 980         next if ($kennziffer eq 'Z43');
 
 982         if ($form->{$kennziffer} != 0){
 
 983           if (defined $taxbird_id_for{$kennziffer}) {
 
 984             push(@{ $form->{id}}, $taxbird_id_for{$kennziffer});
 
 986             push(@{ $form->{id}}, "Kz$kennziffer"); 
 
 988           push(@{ $form->{amount}}, $form->{$kennziffer});
 
 992     } elsif ( $form->{format} eq '' ){ # No format error.
 
 994       USTVA::error( $locale->text('Application Error. No Format given' ) . "!");
 
 997     } else { # All other Formats are wrong
 
 999       USTVA::error( $locale->text('Application Error. Wrong Format') . ": " . $form->{format} );
 
1004   } elsif ($form->{coa} eq 'Austria') {
 
1007     # Outputformat specific customisation's
 
1010     my @category_euro = qw(
 
1011       511 861 36   80   971  931  98   96   53   74
 
1012       85  65  66   61   62   67   63   64   59   69 
 
1013       39  83  811  891  Z43  Z45  Z53  Z62  Z65  Z67
 
1014       41 44 49 43 48 51 86 35 77 76 91 89
 
1015       97 93 95 94 42 60 45 52 73 84 81 
 
1019     if ( $form->{format} eq 'html') { # Formatierungen für HTML Ausgabe
 
1021       $form->{IN} = $form->{type} . '.html';
 
1022       $form->{padding} = "  ";
 
1023       $form->{bold}    = "<b>";
 
1024       $form->{endbold} = "</b>";
 
1025       $form->{br}      = "<br>";
 
1026       $form->{address} =~ s/\\n/\n/g;
 
1028       foreach $number (@category_euro) {
 
1029         $form->{$number} = $form->format_amount(\%myconfig, $form->{$number}, '2', '0');
 
1035   # end nation specific customisations
 
1037   if ( $form->{period} eq '13' and $form->{format} ne 'html') {
 
1041       'Yearly taxreport not yet implemented')
 
1045   $form->{templates} = $myconfig{templates};
 
1046   $form->{templates} = "doc" if ( $form->{type} eq 'help' );
 
1048   $form->parse_template(\%myconfig, $userspath);
 
1050   $lxdebug->leave_sub();
 
1054   $lxdebug->enter_sub();
 
1056   # edit all taxauthority prefs
 
1059   USTVA->get_config($userspath, 'finanzamt.ini');
 
1061   my $land = $form->{elsterland};
 
1062   my $amt  = $form->{elsterFFFF};
 
1065   if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
 
1066     $callback =  qq|$form->{cbscript}|
 
1067                 .qq|?action="config_step1"|
 
1068                 .qq|&login="$form->{cblogin}"|
 
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          login             password
 
1108   foreach my $variable (@_hidden_form_variables) {
 
1109     push @{ $_hidden_variables_ref}, 
 
1110         { 'variable' => $variable, 'value' => $form->{$variable} };
 
1114   my $steuernummer_new = '';
 
1116   # Variablen für das Template zur Verfügung stellen
 
1117   my $template_ref = {
 
1118      select_tax_office               => $select_tax_office,
 
1119      checked_accrual                 => $checked_accrual,
 
1120      checked_cash                    => $checked_cash,
 
1121      checked_monthly                 => $checked_monthly,
 
1122      checked_quarterly               => $checked_quarterly,
 
1123      checked_dauerfristverlaengerung => $checked_dauerfristverlaengerung,
 
1124      hidden_variables                => $_hidden_variables_ref,
 
1128   # Ausgabe des Templates
 
1129   print($form->parse_html_template('ustva/config_step1', $template_ref));
 
1131   $lxdebug->leave_sub();
 
1135   $lxdebug->enter_sub();
 
1142   my $elsterland         = '';
 
1143   my $elster_amt         = '';
 
1144   my $elsterFFFF         = '';
 
1145   my $elstersteuernummer = '';
 
1146   USTVA->get_config($userspath, 'finanzamt.ini')
 
1147     if ($form->{saved} eq $locale->text('saved'));
 
1149   # Auf Übergabefehler checken
 
1150   USTVA::info(  $locale->text('Missing Tax Authoritys Preferences') . "\n"
 
1151               . $locale->text('USTVA-Hint: Tax Authoritys'))
 
1152     if (   $form->{elsterFFFF_new} eq 'Auswahl'
 
1153         || $form->{elsterland_new} eq 'Auswahl');
 
1154   USTVA::info(  $locale->text('Missing Method!') . "\n"
 
1155               . $locale->text('USTVA-Hint: Method'))
 
1156     if ($form->{method} eq '');
 
1158   # Klären, ob Variablen bereits befüllt sind UND ob veräderungen auf
 
1159   # der vorherigen Maske stattfanden: $change = 1(in der edit sub,
 
1160   # mittels get_config)
 
1162   my $change = $form->{elsterland} eq $form->{elsterland_new}
 
1163     && $form->{elsterFFFF} eq $form->{elsterFFFF_new} ? '0' : '1';
 
1164   $change = '0' if ($form->{saved} eq $locale->text('saved'));
 
1165   my $elster_init = &elster_hash();
 
1167   my %elster_init = %$elster_init;
 
1169   if ($change eq '1') {
 
1172     $elsterland           = $form->{elsterland_new};
 
1173     $elsterFFFF           = $form->{elsterFFFF_new};
 
1174     $form->{elsterland}   = $elsterland;
 
1175     $form->{elsterFFFF}   = $elsterFFFF;
 
1176     $form->{steuernummer} = '';
 
1178     create_steuernummer();
 
1180     # rebuild elster_amt
 
1182     foreach $amt (keys %{ $elster_init{ $form->{elsterland} } }) {
 
1184         if ($elster_init{ $form->{elsterland}{$amt} eq $form->{elsterFFFF} });
 
1187     # load the predefined hash data into the FA_* Vars
 
1188     my @variables = qw(FA_Name FA_Strasse FA_PLZ FA_Ort
 
1189       FA_Telefon FA_Fax FA_PLZ_Grosskunden FA_PLZ_Postfach
 
1191       FA_BLZ_1 FA_Kontonummer_1 FA_Bankbezeichnung_1
 
1192       FA_BLZ_2 FA_Kontonummer_2 FA_Bankbezeichnung_oertlich
 
1193       FA_Oeffnungszeiten FA_Email FA_Internet);
 
1195     for (my $i = 0; $i <= 20; $i++) {
 
1196       $form->{ $variables[$i] } =
 
1197         $elster_init->{$elsterland}->{$elsterFFFF}->[$i];
 
1202     $elsterland = $form->{elsterland};
 
1203     $elsterFFFF = $form->{elsterFFFF};
 
1206   my $stnr = $form->{steuernummer};
 
1208   my $patterncount   = $form->{patterncount};
 
1209   my $elster_pattern = $form->{elster_pattern};
 
1210   my $delimiter      = $form->{delimiter};
 
1211   my $steuernummer = $form->{steuernummer} if ($steuernummer eq '');
 
1213   $form->{FA_Oeffnungszeiten} =~ s/\\\\n/\n/g;
 
1217   my $input_steuernummer = USTVA->steuernummer_input(
 
1218                              $form->{elsterland}, 
 
1219                              $form->{elsterFFFF},
 
1220                              $form->{steuernummer}
 
1223   $lxdebug->message(LXDebug::DEBUG1, qq|$input_steuernummer|);
 
1226   my $_hidden_variables_ref;
 
1228   my %_hidden_local_variables = (
 
1229       'elsterland'          => $elsterland,
 
1230       'elsterFFFF'          => $elsterFFFF,
 
1231       'warnung'             => $warnung,
 
1232       'elstersteuernummer'  => $elstersteuernummer,
 
1233       'steuernummer'        => $stnr,
 
1234       'lastsub'             => 'config_step1',
 
1235       'nextsub'             => 'save',
 
1239   foreach my $variable (keys %_hidden_local_variables) {
 
1240     push @{ $_hidden_variables_ref }, 
 
1241         { 'variable' => $variable, 'value' => $_hidden_local_variables{$variable} };
 
1244   my @_hidden_form_variables = qw(
 
1245     FA_steuerberater_name   FA_steuerberater_street 
 
1246     FA_steuerberater_city   FA_steuerberater_tel
 
1257   foreach my $variable (@_hidden_form_variables) {
 
1258     push @{ $_hidden_variables_ref}, 
 
1259         { 'variable' => $variable, 'value' => $form->{$variable} };
 
1262   my $template_ref = {
 
1263      tax_office_data                 => $tax_office_data,
 
1264      input_steuernummer              => $input_steuernummer,
 
1265      readonly                        => '', #q|disabled="disabled"|,
 
1266      callback                        => $callback,
 
1267      hidden_variables                => $_hidden_variables_ref,
 
1270   # Ausgabe des Templates
 
1271   print($form->parse_html_template('ustva/config_step2', $template_ref));
 
1274   $lxdebug->leave_sub();
 
1277 sub create_steuernummer {
 
1278   $lxdebug->enter_sub();
 
1279   my $part           = $form->{part};
 
1280   my $patterncount   = $form->{patterncount};
 
1281   my $delimiter      = $form->{delimiter};
 
1282   my $elster_pattern = $form->{elster_pattern};
 
1284   # rebuild steuernummer and elstersteuernummer
 
1285   # es gibt eine gespeicherte steuernummer $form->{steuernummer}
 
1286   # und die parts und delimiter
 
1291   my $steuernummer_new       = $part;
 
1292   my $elstersteuernummer_new = $form->{elster_FFFF};
 
1293   $elstersteuernummer_new .= '0';
 
1295   for ($h = 1; $h < $patterncount; $h++) {
 
1296     $steuernummer_new .= qq|$delimiter|;
 
1297     for (my $i = 1; $i <= length($elster_pattern); $i++) {
 
1298       $steuernummer_new       .= $form->{"part_$h\_$i"};
 
1299       $elstersteuernummer_new .= $form->{"part_$h\_$i"};
 
1302   if ($form->{steuernummer} ne $steuernummer_new) {
 
1303     $form->{steuernummer}       = $steuernummer_new;
 
1304     $form->{elstersteuernummer} = $elstersteuernummer_new;
 
1305     $form->{steuernummer_new}   = $steuernummer_new;
 
1307     $form->{steuernummer_new}       = '';
 
1308     $form->{elstersteuernummer_new} = '';
 
1310   $lxdebug->leave_sub();
 
1314   $lxdebug->enter_sub();
 
1315   my $filename = "$form->{login}_$form->{filename}";
 
1317   #zuerst die steuernummer aus den part, parts_X_Y und delimiter herstellen
 
1318   create_steuernummer();
 
1320   # Textboxen formatieren: Linebreaks entfernen
 
1322   $form->{FA_Oeffnungszeiten} =~ s/\r\n/\\n/g;
 
1324   #URL mit http:// davor?
 
1325   $form->{FA_Internet} =~ s/^http:\/\///;
 
1326   $form->{FA_Internet} = 'http://' . $form->{FA_Internet};
 
1329     elster              elsterland            elstersteuernummer  steuernummer
 
1330     elsteramt           elsterFFFF            FA_Name             FA_Strasse
 
1331     FA_PLZ              FA_Ort                FA_Telefon          FA_Fax 
 
1332     FA_PLZ_Grosskunden  FA_PLZ_Postfach       FA_Postfach         FA_BLZ_1 
 
1333     FA_Kontonummer_1    FA_Bankbezeichnung_1  FA_BLZ_2            FA_Kontonummer_2
 
1334     FA_Bankbezeichnung_oertlich FA_Oeffnungszeiten
 
1335     FA_Email FA_Internet FA_voranmeld method FA_steuerberater_name
 
1336     FA_steuerberater_street FA_steuerberater_city FA_steuerberater_tel
 
1337     FA_71 FA_dauerfrist);
 
1339   # Hier kommt dann die Plausibilitätsprüfung der ELSTERSteuernummer
 
1340   if ($form->{elstersteuernummer} ne '000000000') {
 
1341     $form->{elster} = '1';
 
1342     open(CONF, ">$userspath/$filename") or $form->error("$filename : $!");
 
1344     # create the config file
 
1345     print CONF qq|# Configuration file for USTVA\n\n|;
 
1347     foreach $key (sort @config) {
 
1348       $form->{$key} =~ s/\\/\\\\/g;
 
1350       $form->{$key} =~ s/\r\n/\n/g;
 
1352       print CONF qq|$key=|;
 
1353       if ($form->{$key} ne 'Y') {
 
1354         print CONF qq|$form->{$key}\n|;
 
1356       if ($form->{$key} eq 'Y') {
 
1357         print CONF qq|checked \n|;
 
1360     print CONF qq|\n\n|;
 
1362     $form->{saved} = $locale->text('saved');
 
1366     $form->{saved} = $locale->text('Choose a Tax Number');
 
1370   $lxdebug->leave_sub();
 
1375   $lxdebug->enter_sub();
 
1377   # allow Symbolic references just here:
 
1379   call_sub($form->{"nextsub"});
 
1381   $lxdebug->leave_sub();
 
1385   $lxdebug->enter_sub();
 
1386   call_sub($form->{"lastsub"});
 
1387   $lxdebug->leave_sub();
 
1391   $lxdebug->enter_sub();
 
1392   my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
 
1393   $lxdebug->leave_sub();