X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUSTVA.pm;h=b10fea6377d4d8aae149cf0f87bb3ac30291916d;hb=786b3862388eb8d4cdcc5dfc663a37fe0e9a82a1;hp=97a8a6fde282e69e13eb5ef9db5184cda30b1c1e;hpb=a205ed210bf303bff2af7abcedf128c61d957f3a;p=kivitendo-erp.git diff --git a/SL/USTVA.pm b/SL/USTVA.pm index 97a8a6fde..b10fea637 100644 --- a/SL/USTVA.pm +++ b/SL/USTVA.pm @@ -25,6 +25,78 @@ package USTVA; +use SL::DBUtils; + +sub get_coa { + + my ( $self, $form, $myconfig) = @_; + + my $query = q{ SELECT coa FROM defaults }; + + my $dbh = $form->dbconnect($myconfig); + my $sth = $dbh->prepare($query); + $sth->execute() || $form->dberror($query); + + my ($coa) = selectrow_query($form, $dbh, $query); + + $sth->finish; + $dbh->disconnect; + + $form->{coa} = $coa; + $form->{"COA_$coa"} = '1'; + $form->{COA_Germany} = '1' if ( $coa eq 'Germany-DATEV-SKR03EU' or $coa eq 'Germany-DATEV-SKR04EU'); + + return; +} + + +sub report_variables { + # Get all positions for taxreport out of the database + # Needs Databaseupdate Pg-upgrade2/USTVA_abstraction.pl + + return unless defined wantarray; + + my ( $self, + $arg_ref) = @_; + + my $myconfig = $arg_ref->{myconfig}; + my $form = $arg_ref->{form}; + my $type = $arg_ref->{type}; # 'paied' || 'received' || '' + my $attribute = $arg_ref->{attribute}; # + my $dec_places = (defined $arg_ref->{dec_places}) ? $arg_ref->{dec_places}:undef; + + my $where_type = "AND tax.report_headings.type = '$type'" if ( $type ); + my $where_dcp = "AND tax.report_variables.dec_places = '$dec_places'" if ( defined $dec_places ); + + my $query = qq| + SELECT $attribute + FROM tax.report_variables + LEFT JOIN tax.report_headings + ON (tax.report_variables.heading_id = tax.report_headings.id) + WHERE 1=1 + $where_type + $where_dcp + |; + + my $dbh = $form->dbconnect($myconfig); + my $sth = $dbh->prepare($query); + + $sth->execute() || $form->dberror($query); + + my @positions; + + while ( my $row_ref = $sth->fetchrow_arrayref() ) { + push @positions, @$row_ref; # Copy the array contents + } + + $sth->finish; + + $dbh->disconnect; + + return @positions; + +} + sub create_steuernummer { $main::lxdebug->enter_sub(); @@ -40,8 +112,8 @@ sub create_steuernummer { my $h = 0; my $i = 0; - $steuernummer_new = $part; - $elstersteuernummer_new = $elster_FFFF; + $steuernummer_new = $part; + $elstersteuernummer_new = $elster_FFFF; $elstersteuernummer_new .= '0'; for ($h = 1; $h < $patterncount; $h++) { @@ -314,11 +386,7 @@ sub info { } else { - if ($form->{error_function}) { - &{ $form->{error_function} }($msg); - } else { - die "Hinweis: $msg\n"; - } + die "Hinweis: $msg\n"; } $main::lxdebug->leave_sub(); @@ -513,12 +581,12 @@ sub process_query { # return unless (-f $filename); - open(FH, "$filename") or $form->error("$filename : $!\n"); + open my $FH, "<", "$filename" or $form->error("$filename : $!\n"); my $query = ""; my $sth; my @quote_chars; - while () { + while (<$FH>) { # Remove DOS and Unix style line endings. s/[\r\n]//g; @@ -557,7 +625,7 @@ sub process_query { } } - close FH; + close $FH; $main::lxdebug->leave_sub(); } @@ -572,18 +640,32 @@ sub ustva { my $last_period = 0; my $category = "pos_ustva"; - my @category_cent = qw( - 511 861 36 80 971 931 98 96 53 74 - 85 65 66 61 62 67 63 64 59 69 - 39 83 Z43 Z45 Z53 Z62 Z65 Z67 - ); - my @category_euro = qw( - 41 44 49 43 48 51 - 86 35 77 76 91 97 - 93 95 94 42 60 45 - 52 73 84 - ); + my @category_cent = USTVA->report_variables({ + myconfig => $myconfig, + form => $form, + type => '', + attribute => 'position', + dec_places => '2', + }); + + push @category_cent, qw(83 Z43 Z45 Z53 Z62 Z65 Z67); + + my @category_euro = USTVA->report_variables({ + myconfig => $myconfig, + form => $form, + type => '', + attribute => 'position', + dec_places => '0', + }); + + push @category_euro, USTVA->report_variables({ + myconfig => $myconfig, + form => $form, + type => '', + attribute => 'position', + dec_places => '0', + }); $form->{decimalplaces} *= 1; @@ -593,47 +675,103 @@ sub ustva { foreach $item (@category_euro) { $form->{"$item"} = 0; } + my $coa_name = coa_get($dbh); + $form->{coa} = $coa_name; + + # Controlvariable for templates + $form->{"$coa_name"} = '1'; + + $main::lxdebug->message(LXDebug::DEBUG2, "COA: '$form->{coa}', \$form->{$coa_name} = 1"); &get_accounts_ustva($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, $category); + ########################################### # - # Berechnung der USTVA Formularfelder + # Nationspecific Modfications + # + ########################################### + + # Germany + + if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU'){ + + # 16%/19% Umstellung + # Umordnen der Kennziffern + if ( $form->{year} < 2007) { + $form->{35} += $form->{81}; + $form->{36} += $form->{811}; + $form->{95} += $form->{89}; + $form->{98} += $form->{891}; + map { delete $form->{$_} } qw(81 811 89 891); + } else { + $form->{35} += $form->{51}; + $form->{36} += $form->{511}; + $form->{95} += $form->{97}; + $form->{98} += $form->{971}; + map { delete $form->{$_} } qw(51 511 97 971); + } + + } + + + # Fixme: Wird auch noch für Oesterreich gebraucht, + # weil kein eigenes Ausgabeformular + # sotte aber aus der allgeméinen Steuerberechnung verschwinden + # + # Berechnung der USTVA Formularfelder laut Bogen 207 # $form->{"51r"} = $form->{"511"}; $form->{"86r"} = $form->{"861"}; $form->{"97r"} = $form->{"971"}; $form->{"93r"} = $form->{"931"}; - $form->{"Z43"} = - $form->{"511"} + $form->{"861"} + $form->{"36"} + $form->{"80"} + - $form->{"971"} + $form->{"931"} + $form->{"96"} + $form->{"98"}; + + $form->{"Z43"} = $form->{"511"} + $form->{"811"} + $form->{"861"} + + $form->{"36"} + $form->{"80"} + $form->{"971"} + + $form->{"891"} + $form->{"931"} + $form->{"96"} + + $form->{"98"}; + $form->{"Z45"} = $form->{"Z43"}; - $form->{"Z53"} = $form->{"Z43"}; - $form->{"Z62"} = - $form->{"Z43"} - $form->{"66"} - $form->{"61"} - $form->{"62"} - - $form->{"63"} - $form->{"64"} - $form->{"59"}; - $form->{"Z65"} = $form->{"Z62"} - $form->{"69"}; - $form->{"83"} = $form->{"Z65"} - $form->{"39"}; - # Hier fehlen moeglicherweise noch einige Berechnungen! + + $form->{"Z53"} = $form->{"Z45"} + $form->{"53"} + $form->{"74"} + + $form->{"85"} + $form->{"65"}; + + $form->{"Z62"} = $form->{"Z43"} - $form->{"66"} - $form->{"61"} + - $form->{"62"} - $form->{"67"} - $form->{"63"} + - $form->{"64"} - $form->{"59"}; + + $form->{"Z65"} = $form->{"Z62"} - $form->{"69"}; + $form->{"83"} = $form->{"Z65"} - $form->{"39"}; $dbh->disconnect; $main::lxdebug->leave_sub(); } +sub coa_get { + + my ($dbh) = @_; + + my $query= qq|SELECT coa FROM defaults|; + + my $sth = $dbh->prepare($query); + + $sth->execute || $form->dberror($query); + + ($ref) = $sth->fetchrow_array; + + return $ref; + +}; + sub get_accounts_ustva { $main::lxdebug->enter_sub(); my ($dbh, $last_period, $fromdate, $todate, $form, $category) = @_; - my ($null, $department_id) = split /--/, $form->{department}; - my $query; - my $dpt_where; - my $dpt_join; - my $project; - my $where = "1 = 1"; + my $where = ""; my $glwhere = ""; my $subwhere = ""; my $ARwhere = ""; @@ -641,137 +779,198 @@ sub get_accounts_ustva { my $arwhere = ""; my $item; + my $gltaxkey_where = "(tk.pos_ustva>=59 AND tk.pos_ustva<=66)"; + if ($fromdate) { if ($form->{method} eq 'cash') { $subwhere .= " AND transdate >= '$fromdate'"; $glwhere = " AND ac.transdate >= '$fromdate'"; - $ARwhere .= " AND acc.transdate >= '$fromdate'"; - $APwhere .= " AND AP.transdate >= '$fromdate'"; + $ARwhere .= " AND acc.transdate >= '$fromdate'"; } + $APwhere .= " AND AP.transdate >= '$fromdate'"; $where .= " AND ac.transdate >= '$fromdate'"; } if ($todate) { $where .= " AND ac.transdate <= '$todate'"; $ARwhere .= " AND acc.transdate <= '$todate'"; - $subwhere .= " AND transdate <= '$todate'"; - $APwhere .= " AND AP.transdate <= '$todate'"; } - if ($department_id) { - $dpt_join = qq| - JOIN department t ON (a.department_id = t.id) - |; - $dpt_where = qq| - AND t.id = $department_id - |; - } + my $acc_trans_where = '1=1'; + if ($fromdate || $todate) { + $acc_trans_where = "ac.trans_id IN (SELECT DISTINCT trans_id FROM acc_trans WHERE "; - if ($form->{project_id}) { - $project = qq| - AND ac.project_id = $form->{project_id} - |; + if ($fromdate) { + $acc_trans_where .= "transdate >= '$fromdate'"; + } + if ($todate) { + $acc_trans_where .= " AND " if ($fromdate); + $acc_trans_where .= "transdate <= '$todate'"; + } + + $acc_trans_where .= ")"; } -######################################### -# Method eq 'cash' = IST Versteuerung -######################################### + + ############################################ + # Method eq 'cash' = IST Versteuerung + ############################################ + # Betrifft nur die eingenommene Umsatzsteuer + # + ############################################ if ($form->{method} eq 'cash') { $query = qq| - SELECT - -- Alle tatsaechlichen Zahlungseingaenge - -- im Voranmeldezeitraum erfassen - -- (Teilzahlungen werden prozentual auf verschiedene Steuern aufgeteilt) - SUM( ac.amount * - -- Bezahlt / Rechnungssumme - ( - SELECT SUM(acc.amount) - FROM acc_trans acc - INNER JOIN chart c ON (acc.chart_id = c.id AND c.link like '%AR_paid%') - WHERE - 1=1 - $ARwhere - AND acc.trans_id = ac.trans_id - ) - / - ( - select amount from ar where id = ac.trans_id - ) - ) AS amount, - c.pos_ustva - FROM acc_trans ac - JOIN chart c ON (c.id = ac.chart_id) - --JOIN ar ON (ar.id = ac.trans_id) - where - 1=1 - -- Here no where, please. All Transactions ever should be - -- testet if they are paied in the USTVA report period. - GROUP BY c.pos_ustva - - UNION -- alle Ausgaben AP erfassen - - SELECT - sum(ac.amount) AS amount, pos_ustva - FROM acc_trans ac - JOIN AP ON (AP.id = ac.trans_id ) - JOIN chart c ON (c.id = ac.chart_id AND pos_ustva NOT LIKE '') - WHERE - 1=1 - $APwhere - $dpt_where - $project - GROUP BY pos_ustva - - UNION -- alle Ausgaben und Einnahmen direkter gl Buchungen erfassen - - SELECT sum - ( - CASE WHEN c.link LIKE '%AR%' THEN ac.amount * -1 - WHEN c.link LIKE '%AP%' THEN ac.amount * 1 - END - ) AS amount, c.$category - FROM acc_trans ac - JOIN chart c ON (c.id = ac.chart_id) - JOIN gl a ON (a.id = ac.trans_id) - $dpt_join - WHERE $where - $dpt_from - AND NOT (c.link = 'AR' OR c.link = 'AP') - $project - GROUP BY c.$category - |; - - } else { -######################################### -# Method eq 'accrual' = Soll Versteuerung -######################################### - - if ($department_id) { - $dpt_join = qq| - JOIN dpt_trans t ON (t.trans_id = ac.trans_id) - |; - $dpt_where = qq| - AND t.department_id = $department_id - |; - } + SELECT + -- USTVA IST-Versteuerung + -- + -- Alle tatsaechlichen _Zahlungseingaenge_ + -- im Voranmeldezeitraum erfassen + -- (Teilzahlungen werden prozentual auf verschiedene Steuern aufgeteilt) + SUM( ac.amount * + -- Bezahlt / Rechnungssumme + ( + SELECT SUM(acc.amount) + FROM acc_trans acc + INNER JOIN chart c ON (acc.chart_id = c.id + AND c.link like '%AR_paid%') + WHERE + 1=1 + $ARwhere + AND acc.trans_id = ac.trans_id + ) + / + ( + SELECT amount FROM ar WHERE id = ac.trans_id + ) + ) AS amount, + tk.pos_ustva + FROM acc_trans ac + LEFT JOIN chart c ON (c.id = ac.chart_id) + LEFT JOIN ar ON (ar.id = ac.trans_id) + LEFT JOIN taxkeys tk ON ( + tk.id = ( + SELECT id FROM taxkeys + WHERE chart_id = ac.chart_id + -- AND taxkey_id = ac.taxkey + AND startdate <= COALESCE(ar.deliverydate,ar.transdate) + ORDER BY startdate DESC LIMIT 1 + ) + ) + WHERE + $acc_trans_where + GROUP BY tk.pos_ustva + |; + + } elsif ($form->{method} eq 'accrual') { + ######################################### + # Method eq 'accrual' = Soll Versteuerung + ######################################### $query = qq| - SELECT sum - ( - CASE WHEN c.link LIKE '%AR%' THEN ac.amount * -1 - WHEN c.link LIKE '%AP%' THEN ac.amount * 1 - END - ) AS amount, c.$category - FROM acc_trans ac - JOIN chart c ON (c.id = ac.chart_id) - $dpt_join - WHERE $where - $dpt_where - $project - GROUP BY c.$category - |; + -- Alle Einnahmen AR und pos_ustva erfassen + SELECT + - sum(ac.amount) AS amount, + tk.pos_ustva + FROM acc_trans ac + JOIN chart c ON (c.id = ac.chart_id) + JOIN ar ON (ar.id = ac.trans_id) + JOIN taxkeys tk ON ( + tk.id = ( + SELECT id FROM taxkeys + WHERE chart_id = ac.chart_id + AND startdate <= COALESCE(ar.deliverydate,ar.transdate) + ORDER BY startdate DESC LIMIT 1 + ) + ) + $dpt_join + WHERE 1 = 1 + $where + GROUP BY tk.pos_ustva + |; + + } else { + + $form->error("Unknown tax method: $form->{method}") + } + + ######################################### + # Ausgaben und Gl Buchungen sind gleich + # für Ist- und Soll-Versteuerung + ######################################### + $query .= qq| + UNION -- alle Ausgaben AP erfassen + + SELECT + sum(ac.amount) AS amount, + tk.pos_ustva + FROM acc_trans ac + JOIN ap ON (ap.id = ac.trans_id ) + JOIN chart c ON (c.id = ac.chart_id) + LEFT JOIN taxkeys tk ON ( + tk.id = ( + SELECT id FROM taxkeys + WHERE 1=1 + AND chart_id=ac.chart_id + --AND taxkey_id = ac.taxkey + AND startdate <= COALESCE(AP.transdate) + ORDER BY startdate DESC LIMIT 1 + ) + ) + WHERE + 1=1 + $where + GROUP BY tk.pos_ustva + + UNION -- Einnahmen direkter gl Buchungen erfassen + + SELECT sum + ( - ac.amount) AS amount, + tk.pos_ustva + FROM acc_trans ac + JOIN chart c ON (c.id = ac.chart_id) + JOIN gl a ON (a.id = ac.trans_id) + LEFT JOIN taxkeys tk ON ( + tk.id = ( + SELECT id FROM taxkeys + WHERE chart_id=ac.chart_id + AND NOT $gltaxkey_where + AND startdate <= COALESCE(ac.transdate) + ORDER BY startdate DESC LIMIT 1 + ) + ) + + $dpt_join + WHERE 1 = 1 + $where + GROUP BY tk.pos_ustva + + + UNION -- Ausgaben direkter gl Buchungen erfassen + + SELECT sum + (ac.amount) AS amount, + tk.pos_ustva + FROM acc_trans ac + JOIN chart c ON (c.id = ac.chart_id) + JOIN gl a ON (a.id = ac.trans_id) + LEFT JOIN taxkeys tk ON ( + tk.id = ( + SELECT id FROM taxkeys + WHERE chart_id=ac.chart_id + AND $gltaxkey_where + AND startdate <= COALESCE(ac.transdate) + ORDER BY startdate DESC LIMIT 1 + ) + ) + + $dpt_join + WHERE 1 = 1 + $where + GROUP BY tk.pos_ustva + + |; my @accno; my $accno; @@ -782,26 +981,62 @@ sub get_accounts_ustva { $main::lxdebug->message(LXDebug::QUERY, "$callingdetails \$query=\n $query"); my $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); - while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -# Bug 365 solved?! - $ref->{amount} *= -1; - if ($category eq "pos_bwa") { - if ($last_period) { - $form->{ $ref->{$category} }{kumm} += $ref->{amount}; - } else { - $form->{ $ref->{$category} }{jetzt} += $ref->{amount}; - } - } else { - $form->{ $ref->{$category} } += $ref->{amount}; - } + while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + # Bug 365 solved?! + $ref->{amount} *= -1; + $form->{ $ref->{$category} } += $ref->{amount}; } + $sth->finish; $main::lxdebug->leave_sub(); + } +sub get_config { + $main::lxdebug->enter_sub(); + + my ($self, $userspath, $filename) = @_; + + $form->error("Missing Parameter: @_") if !$userspath || !$filename; + + my $form = $main::form; + + $filename = "$form->{login}_$filename"; + $filename =~ s|.*/||; + $filename = "$userspath/$filename"; + open my $FACONF, "<", $filename or sub {# Annon Sub + # catch open error + # create file if file does not exist + open my $FANEW, ">", $filename or $form->error("CREATE: $filename : $!"); + close $FANEW or $form->error("CLOSE: $filename : $!"); + + #try again open file + open my $FACONF, "<", $filename or $form->error("OPEN: $filename : $!"); + }; + + while (<$FACONF>) { + last if (/^\[/); + next if (/^(\#|\s)/); + + # remove comments + s/\s#.*//g; + + # remove any trailing whitespace + s/^\s*(.*?)\s*$/$1/; + my ($key, $value) = split(/=/, $_, 2); + + $form->{$key} = "$value"; + + } + + close $FACONF; + + $main::lxdebug->leave_sub(); +} 1;