From a68089fb83a276f3ce78e5bd145c1cf05cc9a762 Mon Sep 17 00:00:00 2001 From: "mh@waldpark.octosoft.eu" Date: Mon, 5 Jan 2015 18:14:10 +0100 Subject: [PATCH] =?utf8?q?Geierlein:=20alter=20Elsterexport=20=C3=BCberarb?= =?utf8?q?eitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Generierung der Params in ODGeierlein Neuer Controller für AJAX Request Verallgemeinern (Teile aus ustva.pl nach SL/USTVA.pm elster_format angepasst Die Formate der Steuernummern für Baden-Württemberg und Rheinland-Pfalz sind in Geierlein anders als früher in taxbird Geierlein auf gleichem Webserver Da LocalStorage nur innerhalb einer Domaine funktioniert, Wurde nun innerhalb Kivitendo der crome/content Baum von Geierlein installiert. Also cd geierlein/chrome/content mkdir {kivitendoDocumentRoot}/geierlein tar cf - * | tar xf - -C {kivitendoDocumentRoot}/geierlein Natürlich gibt es auch Möglichkeiten, dies per alias-Config im apache2 zu machen Konfigurerierbar in kivitendo.conf Falls geierlein_path gestetzt ist das Feature enabled Pfadnahme zeigt zu geierleinverzeichnis innerhalb des kivitendo Verzeichnisses UStVa Einstellungen in Datenbank Kein finanzamt.ini mehr sondern fa_bufa_nr in Defaults, über diese BundesFinanzamtnummer greift man auf Finanzamt Rose-Objekt zu. Das ist nun auch modifizierbar. Nutzung von Rose, Sonderfälle in stnr pattern (BaWü) Falls keine Daten in Defaults wird ein ggf. vorhandenes finanzamt.ini gelesen und die Daten von dort übernommen Die Steuernummer wird nun nicht mehr in der Mandantenkonfig sondern in den UStVa Einstellungen editiert Bisher Keine Umstellung auf IBAN, BIC (ist dies notwendig?) Übergabe ohne kz83 Geierlein berechnet das Ergebnis selbst, es werden nun nur Eingangsbeträge übergeben UTF-8 Umwandlung finanzamt.ini Texte Links zu Mandantenkonfig eingearbeitet Implementiert RedMine Feature #168 --- SL/Controller/ODGeierlein.pm | 129 +++++ SL/DB/MetaSetup/Default.pm | 7 + SL/USTVA.pm | 486 ++++++++++------ bin/mozilla/ustva.pl | 521 ++++++------------ config/kivitendo.conf.default | 4 + doc/changelog | 2 + locale/de/all | 12 +- .../defaults_add_finanzamt_data.sql | 10 + .../client_config/_miscellaneous.html | 2 +- templates/webpages/ustva/config_step1.html | 36 +- templates/webpages/ustva/config_step2.html | 83 +-- templates/webpages/ustva/report.html | 95 ++-- 12 files changed, 756 insertions(+), 631 deletions(-) create mode 100644 SL/Controller/ODGeierlein.pm create mode 100644 sql/Pg-upgrade2/defaults_add_finanzamt_data.sql diff --git a/SL/Controller/ODGeierlein.pm b/SL/Controller/ODGeierlein.pm new file mode 100644 index 000000000..749941d6b --- /dev/null +++ b/SL/Controller/ODGeierlein.pm @@ -0,0 +1,129 @@ +package SL::Controller::ODGeierlein; + +use strict; +use utf8; +use List::Util qw(first); + +use parent qw(SL::Controller::Base); + +use SL::USTVA; + +use Rose::Object::MakeMethods::Generic; + +# +# actions +# + +sub action_send { + $::lxdebug->enter_sub(); + my ($self) = @_; + my $err = ''; + + # Aufruf von get_config zum Einlesen der Daten aus Finanzamt und Defaults + + my $ustva = USTVA->new(); + $ustva->get_config(); + $ustva->get_finanzamt(); + $ustva->set_FromTo(\%$::form); + $::lxdebug->message($LXDebug::DEBUG2,"fromdate=".$::form->{fromdate}." todate=".$::form->{todate}." meth=".$::form->{method}); + + my $tax_office = first { $_->{id} eq $::form->{fa_land_nr} } @{ $ustva->{tax_office_information} }; + + if ( !$::form->{co_zip} ) { + $::form->{co_zip} = $::form->{co_city}; + $::form->{co_zip} =~ s/\D//g; + $::form->{co_city} =~ s/\d//g; + $::form->{co_city} =~ s/^\s//g; + } + $::form->{period}=~ s/^0//; + + # Aufbau der Geierlein Parameter + my $params= + "name = " .$::form->{company}."\nstrasse = ".$::form->{co_street}. + "\nplz = " .$::form->{co_zip}."\nort = " .$::form->{co_city}. + "\ntelefon = ".$::form->{co_tel}."\nemail = ".$::form->{co_email}. + "\nland = ".$tax_office->{taxbird_nr}."\nsteuernummer = ".$::form->{taxnumber}."\njahr = ".$::form->{year}. + "\nzeitraum = ".$::form->{period}."\n"; + + $::lxdebug->message($LXDebug::DEBUG2,"param1=".$params ); + + # USTVA Daten erzeugen + # benötigt $form->{fromdate}, $form->{todate} $form->{method} + $ustva->ustva(\%::myconfig, \%$::form); + + my @category_cent = $ustva->report_variables({ + myconfig => \%::myconfig, + form => $::form, + type => '', + attribute => 'position', + dec_places => '2', + }); + + #push @category_cent, qw(Z43 Z45 Z53 Z54 Z62 Z65 Z67); + + my @category_euro = $ustva->report_variables({ + myconfig => \%::myconfig, + form => $::form, + type => '', + attribute => 'position', + dec_places => '0', + }); + + # Numberformatting for Geierlein + my $temp_numberformat = $::myconfig{numberformat}; + # Numberformat must be '1000,00' ?! + $::myconfig{numberformat} = '1000,00'; + foreach my $number (@{ $::form->{category_cent} }) { + $::form->{$number} = ($::form->{$number} !=0) ? $::form->format_amount(\%::myconfig, $::form->{$number},'2',''):''; + } + + foreach my $number (@{ $::form->{category_euro} }) { + $::form->{$number} = ($::form->{$number} !=0) ? $::form->format_amount(\%::myconfig, $::form->{$number},'0',''):''; + } + # Re-set Numberformat + $::myconfig{numberformat} = $temp_numberformat; + + # Berichtigte Anmeldung + $params .= "kz10 = 1\n" if $::form->{FA_10}; + + # Belege (Verträge, Rechnungen, Erläuterungen usw.) werden gesondert eingereicht + $params .= "kz22 = 1\n" if $::form->{FA_22}; + + # Verrechnung des Erstattungsbetrags erwünscht / Erstattungsbetrag ist abgetreten + $params .= "kz29 = 1\n" if $::form->{FA_29}; + + # Die Einzugsermächtigung wird ausnahmsweise (z.B. wegen Verrechnungswünschen) für diesen Voranmeldungszeitraum widerrufen. + # Ein ggf. verbleibender Restbetrag ist gesondert zu entrichten. + $params .= "kz26 = 1\n" if $::form->{FA_26}; + + my @unused_ids = qw(511 861 971 931 Z43 811 891 Z43 Z45 Z53 Z54 Z62 Z65 Z67 83); + + for my $kennziffer (@{$::form->{category_cent}}, @{$::form->{category_euro}}) { + $::lxdebug->message($LXDebug::DEBUG2,"kennziffer ".$kennziffer."=".$::form->{$kennziffer}); + + next if first { $_ eq $kennziffer } @unused_ids; + + if ($::form->{$kennziffer} != 0) { + $params .= "kz".$kennziffer." = ".$::form->{$kennziffer}."\n"; + } + } + + $::lxdebug->message($LXDebug::DEBUG2,"param2=".$params ); + + + $self->js->flash($err?'error':'info', + $err?$err: + $::locale->text('USTVA Data sent to geierlein')); + $self->js->run('openGeierlein',$params) if !$err; + $::lxdebug->leave_sub(); + $self->js->render; +} + + + +# +# filters / helpers +# + + +1; diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm index 50764a454..775961593 100644 --- a/SL/DB/MetaSetup/Default.pm +++ b/SL/DB/MetaSetup/Default.pm @@ -49,6 +49,13 @@ __PACKAGE__->meta->columns( duns => { type => 'text' }, email_journal => { type => 'integer', default => 2 }, expense_accno_id => { type => 'integer' }, + fa_bufa_nr => { type => 'text' }, + fa_dauerfrist => { type => 'text' }, + fa_steuerberater_city => { type => 'text' }, + fa_steuerberater_name => { type => 'text' }, + fa_steuerberater_street => { type => 'text' }, + fa_steuerberater_tel => { type => 'text' }, + fa_voranmeld => { type => 'text' }, feature_balance => { type => 'boolean', default => 'true', not_null => 1 }, feature_datev => { type => 'boolean', default => 'true', not_null => 1 }, feature_erfolgsrechnung => { type => 'boolean', default => 'false', not_null => 1 }, diff --git a/SL/USTVA.pm b/SL/USTVA.pm index 93f83df0e..33a29ddd8 100644 --- a/SL/USTVA.pm +++ b/SL/USTVA.pm @@ -28,29 +28,43 @@ package USTVA; use List::Util qw(first); use SL::DBUtils; +use SL::DB::Default; +use SL::DB::Finanzamt; use utf8; use strict; my @tax_office_information = ( - { 'id' => 8, 'name' => 'Baden-Württemberg', 'taxbird_nr' => '0', 'elster_format' => 'FF/BBB/UUUUP', }, - { 'id' => 9, 'name' => 'Bayern', 'taxbird_nr' => '1', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 11, 'name' => 'Berlin', 'taxbird_nr' => '2', 'elster_format' => 'FF/BBB/UUUUP', }, - { 'id' => 12, 'name' => 'Brandenburg', 'taxbird_nr' => '3', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 4, 'name' => 'Bremen', 'taxbird_nr' => '4', 'elster_format' => 'FF BBB UUUUP', }, - { 'id' => 2, 'name' => 'Hamburg', 'taxbird_nr' => '5', 'elster_format' => 'FF/BBB/UUUUP', }, - { 'id' => 6, 'name' => 'Hessen', 'taxbird_nr' => '6', 'elster_format' => '0FF BBB UUUUP', }, - { 'id' => 13, 'name' => 'Mecklenburg-Vorpommern', 'taxbird_nr' => '7', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 3, 'name' => 'Niedersachsen', 'taxbird_nr' => '8', 'elster_format' => 'FF/BBB/UUUUP', }, - { 'id' => 5, 'name' => 'Nordrhein-Westfalen', 'taxbird_nr' => '9', 'elster_format' => 'FFF/BBBB/UUUP', }, - { 'id' => 7, 'name' => 'Rheinland-Pfalz', 'taxbird_nr' => '10', 'elster_format' => 'FF/BBB/UUUU/P', }, - { 'id' => 10, 'name' => 'Saarland', 'taxbird_nr' => '11', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 14, 'name' => 'Sachsen', 'taxbird_nr' => '12', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 15, 'name' => 'Sachsen-Anhalt', 'taxbird_nr' => '13', 'elster_format' => 'FFF/BBB/UUUUP', }, - { 'id' => 1, 'name' => 'Schleswig-Holstein', 'taxbird_nr' => '14', 'elster_format' => 'FF BBB UUUUP', }, - { 'id' => 16, 'name' => 'Thüringen', 'taxbird_nr' => '15', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 8, 'name' => 'Baden-Württemberg', 'taxbird_nr' => '1', 'elster_format' => 'FFBBB/UUUUP', }, + { 'id' => 9, 'name' => 'Bayern', 'taxbird_nr' => '2', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 11, 'name' => 'Berlin', 'taxbird_nr' => '3', 'elster_format' => 'FF/BBB/UUUUP', }, + { 'id' => 12, 'name' => 'Brandenburg', 'taxbird_nr' => '4', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 4, 'name' => 'Bremen', 'taxbird_nr' => '5', 'elster_format' => 'FF BBB UUUUP', }, + { 'id' => 2, 'name' => 'Hamburg', 'taxbird_nr' => '6', 'elster_format' => 'FF/BBB/UUUUP', }, + { 'id' => 6, 'name' => 'Hessen', 'taxbird_nr' => '7', 'elster_format' => '0FF BBB UUUUP', }, + { 'id' => 13, 'name' => 'Mecklenburg-Vorpommern', 'taxbird_nr' => '8', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 3, 'name' => 'Niedersachsen', 'taxbird_nr' => '9', 'elster_format' => 'FF/BBB/UUUUP', }, + { 'id' => 5, 'name' => 'Nordrhein-Westfalen', 'taxbird_nr' => '10', 'elster_format' => 'FFF/BBBB/UUUP', }, + { 'id' => 7, 'name' => 'Rheinland-Pfalz', 'taxbird_nr' => '11', 'elster_format' => 'FF/BBB/UUUUP', }, + { 'id' => 10, 'name' => 'Saarland', 'taxbird_nr' => '12', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 14, 'name' => 'Sachsen', 'taxbird_nr' => '13', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 15, 'name' => 'Sachsen-Anhalt', 'taxbird_nr' => '14', 'elster_format' => 'FFF/BBB/UUUUP', }, + { 'id' => 1, 'name' => 'Schleswig-Holstein', 'taxbird_nr' => '15', 'elster_format' => 'FF BBB UUUUP', }, + { 'id' => 16, 'name' => 'Thüringen', 'taxbird_nr' => '16', 'elster_format' => 'FFF/BBB/UUUUP', }, ); + my @fiamt_config = qw(taxnumber fa_bufa_nr fa_dauerfrist fa_steuerberater_city fa_steuerberater_name + fa_steuerberater_street fa_steuerberater_tel fa_voranmeld); + + my @fiamt_finanzamt = qw( + fa_land_nr fa_bufa_nr fa_name fa_strasse + fa_plz fa_ort fa_telefon fa_fax + fa_plz_grosskunden fa_plz_postfach fa_postfach + fa_blz_1 fa_kontonummer_1 fa_bankbezeichnung_1 + fa_blz_2 fa_kontonummer_2 fa_bankbezeichnung_2 fa_oeffnungszeiten + fa_email fa_internet); + + sub new { my $type = shift; @@ -133,44 +147,6 @@ sub report_variables { } -sub create_steuernummer { - $main::lxdebug->enter_sub(); - - my $form = $main::form; - - our ($elster_FFFF); - - my $part = $form->{part}; - my $patterncount = $form->{patterncount}; - my $delimiter = $form->{delimiter}; - my $elster_pattern = $form->{elster_pattern}; - - # rebuild steuernummer and elstersteuernummer - # es gibt eine gespeicherte steuernummer $form->{steuernummer} - # und die parts und delimiter - - my $h = 0; - my $i = 0; - - my $steuernummer_new = $part; - my $elstersteuernummer_new = $elster_FFFF; - $elstersteuernummer_new .= '0'; - - for ($h = 1; $h < $patterncount; $h++) { - $steuernummer_new .= qq|$delimiter|; - for ($i = 1; $i <= length($elster_pattern); $i++) { - $steuernummer_new .= $form->{"part_$h\_$i"}; - $elstersteuernummer_new .= $form->{"part_$h\_$i"}; - } - } - if ($form->{steuernummer} ne $steuernummer_new) { - $form->{steuernummer} = $steuernummer_new; - $form->{elstersteuernummer} = $elstersteuernummer_new; - $form->{steuernummer_new} = $steuernummer_new; - } - $main::lxdebug->leave_sub(); - return ($steuernummer_new, $elstersteuernummer_new); -} sub steuernummer_input { $main::lxdebug->enter_sub(); @@ -191,16 +167,27 @@ sub steuernummer_input { #Pattern description Elstersteuernummer #split the pattern - my $tax_office = first { $_->{name} eq $elster_land } @{ $self->{tax_office_information} }; + my $tax_office = first { $_->{id} eq $elster_land } @{ $self->{tax_office_information} }; my $elster_pattern = $tax_office->{elster_format}; + # $::lxdebug->message(LXDebug->DEBUG2, "stnr=".$stnr." elster_FFFF=".$elster_FFFF. + # " pattern=".$elster_pattern." land=".$elster_land); my @elster_pattern = split(' ', $elster_pattern); - my $delimiter = ' '; + my $delimiter1 = ' '; + my $delimiter2 = ' '; my $patterncount = @elster_pattern; if ($patterncount < 2) { @elster_pattern = (); @elster_pattern = split('/', $elster_pattern); - $delimiter = '/'; + $delimiter1 = '/'; + $delimiter2 = '/'; $patterncount = @elster_pattern; + if ($patterncount < 2) { + @elster_pattern = (); + @elster_pattern = split(' ', $elster_pattern); + $delimiter1 = ' '; + $delimiter2 = ' '; + $patterncount = @elster_pattern; + } } # no we have an array of patternparts and a delimiter @@ -208,6 +195,7 @@ sub steuernummer_input { $steuernummer_input .= qq||; my $part = ''; +# $::lxdebug->message(LXDebug->DEBUG2, "pattern0=".$elster_pattern[0]); SWITCH: { $elster_pattern[0] eq 'FFF' && do { $part = substr($elster_FFFF, 1, 4); @@ -219,6 +207,15 @@ SWITCH: { $steuernummer_input .= qq|$part|; last SWITCH; }; + $elster_pattern[0] eq 'FFBBB' && do { + $part = substr($elster_FFFF, 2, 4); + $steuernummer_input .= qq|$part|; + $delimiter1 = ''; + $patterncount++ ; + # Sonderfall BW + @elster_pattern = ('FF','BBB','UUUUP'); + last SWITCH; + }; $elster_pattern[0] eq 'FF' && do { $part = substr($elster_FFFF, 2, 4); $steuernummer_input .= qq|$part|; @@ -231,19 +228,22 @@ SWITCH: { } #now the rest of the Steuernummer ... - $steuernummer_input .= qq||; + $steuernummer_input .= qq||; $steuernummer_input .= qq|\n - + + |; my $k = 0; for (my $h = 1; $h < $patterncount; $h++) { + my $delimiter = ( $h==1?$delimiter1:$delimiter2); $steuernummer_input .= qq| $delimiter \n|; +# $::lxdebug->message(LXDebug->DEBUG2, "pattern[$h]=".$elster_pattern[$h]); for (my $i = 1; $i <= length($elster_pattern[$h]); $i++) { $steuernummer_input .= qq|