package USTVA;
+use Carp;
+use Data::Dumper;
use List::Util qw(first);
use SL::DB;
use SL::DBUtils;
use SL::DB::Default;
use SL::DB::Finanzamt;
+use SL::Locale::String qw(t8);
use utf8;
use strict;
$form->{coa} = $::instance_conf->get_coa;
+ unless ($form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU') {
+ croak t8("Advance turnover tax return only valid for SKR03 or SKR04");
+ }
my @category_cent = USTVA->report_variables({
myconfig => $myconfig,
form => $form,
attribute => 'position',
dec_places => '2',
});
-
+ push @category_cent, ("pos_ustva_811b_kivi", "pos_ustva_861b_kivi");
if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU') {
push @category_cent, qw(Z43 Z45 Z53 Z54 Z62 Z65 Z67);
}
attribute => 'position',
dec_places => '0',
});
-
+ push @category_euro, ("pos_ustva_81b_kivi", "pos_ustva_86b_kivi");
@{$form->{category_cent}} = @category_cent;
@{$form->{category_euro}} = @category_euro;
$form->{decimalplaces} *= 1;
# Germany
- if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU'){
+ if ( $form->{coa} eq 'Germany-DATEV-SKR03EU' or $form->{coa} eq 'Germany-DATEV-SKR04EU') {
# 16%/19% Umstellung
# Umordnen der Kennziffern
1=1
$ARwhere
AND acc.trans_id = ac.trans_id
- )
- /
+ ) /
(
SELECT amount FROM ar WHERE id = ac.trans_id
)
) AS amount,
- tk.pos_ustva
+ tk.pos_ustva, t.rate, c.accno
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 tax t ON (t.id = ac.tax_id)
LEFT JOIN taxkeys tk ON (
tk.id = (
SELECT id FROM taxkeys
)
WHERE
$acc_trans_where
- GROUP BY tk.pos_ustva
+ GROUP BY tk.pos_ustva, t.rate, c.accno
|;
} elsif ($form->{accounting_method} eq 'accrual') {
-- Alle Einnahmen AR und pos_ustva erfassen
SELECT
- sum(ac.amount) AS amount,
- tk.pos_ustva
+ tk.pos_ustva, t.rate, c.accno
FROM acc_trans ac
JOIN chart c ON (c.id = ac.chart_id)
JOIN ar ON (ar.id = ac.trans_id)
+ JOIN tax t ON (t.id = ac.tax_id)
JOIN taxkeys tk ON (
tk.id = (
SELECT id FROM taxkeys
$dpt_join
WHERE 1 = 1
$where
- GROUP BY tk.pos_ustva
+ GROUP BY tk.pos_ustva, t.rate, c.accno
|;
} else {
SELECT
sum(ac.amount) AS amount,
- tk.pos_ustva
+ tk.pos_ustva, t.rate, c.accno
FROM acc_trans ac
JOIN ap ON (ap.id = ac.trans_id )
JOIN chart c ON (c.id = ac.chart_id)
+ JOIN tax t ON (t.id = ac.tax_id)
LEFT JOIN taxkeys tk ON (
tk.id = (
SELECT id FROM taxkeys
WHERE
1=1
$where
- GROUP BY tk.pos_ustva
+ GROUP BY tk.pos_ustva, t.rate, c.accno
UNION -- Einnahmen direkter gl Buchungen erfassen
SELECT sum
( - ac.amount) AS amount,
- tk.pos_ustva
+ tk.pos_ustva, t.rate, c.accno
FROM acc_trans ac
JOIN chart c ON (c.id = ac.chart_id)
JOIN gl a ON (a.id = ac.trans_id)
+ JOIN tax t ON (t.id = ac.tax_id)
LEFT JOIN taxkeys tk ON (
tk.id = (
SELECT id FROM taxkeys
$dpt_join
WHERE 1 = 1
$where
- GROUP BY tk.pos_ustva
+ GROUP BY tk.pos_ustva, t.rate, c.accno
UNION -- Ausgaben direkter gl Buchungen erfassen
SELECT sum
(ac.amount) AS amount,
- tk.pos_ustva
+ tk.pos_ustva, t.rate, c.accno
FROM acc_trans ac
JOIN chart c ON (c.id = ac.chart_id)
JOIN gl a ON (a.id = ac.trans_id)
+ JOIN tax t ON (t.id = ac.tax_id)
LEFT JOIN taxkeys tk ON (
tk.id = (
SELECT id FROM taxkeys
$dpt_join
WHERE 1 = 1
$where
- GROUP BY tk.pos_ustva
+ GROUP BY tk.pos_ustva, t.rate, c.accno
|;
- my @accno;
- my $accno;
- my $ref;
-
# Show all $query in Debuglevel LXDebug::QUERY
my $callingdetails = (caller (0))[3];
$main::lxdebug->message(LXDebug->QUERY(), "$callingdetails \$query=\n $query");
my $sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
+ # ugly, but we need to use static accnos
+ my ($accno_five, $accno_sixteen, $corr);
+
+ if ($form->{coa} eq 'Germany-DATEV-SKR03EU') {
+ $accno_five = 1773;
+ $accno_sixteen = 1775;
+ } elsif (($form->{coa} eq 'Germany-DATEV-SKR04EU')) {
+ $accno_five = 3803; # SKR04
+ $accno_sixteen = 3805; # SKR04
+ } else {die "wrong call"; }
while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
next unless $ref->{$category};
+ $corr = 0;
$ref->{amount} *= -1;
- $form->{ $ref->{$category} } += $ref->{amount};
+ # USTVA Pos 35
+ if ($ref->{pos_ustva} eq '35') {
+ if ($ref->{rate} == 0.16) {
+ $form->{"pos_ustva_81b_kivi"} += $ref->{amount};
+ } elsif ($ref->{rate} == 0.05) {
+ $form->{"pos_ustva_86b_kivi"} += $ref->{amount};
+ } elsif ($ref->{rate} == 0.19) {
+ # pos_ustva says 16, but rate says 19
+ # (pos_ustva should be tax dependent and not taxkeys dependent)
+ # correction hotfix for this case:
+ # bookings exists with 19% ->
+ # move 19% bookings to the 19% position
+ # Dont rely on dates of taxkeys
+ $corr = 1;
+ $form->{"81"} += $ref->{amount};
+ } elsif ($ref->{rate} == 0.07) {
+ # pos_ustva says 5, but rate says 7
+ # see comment above:
+ # Dont rely on dates of taxkeys
+ $corr = 1;
+ $form->{"86"} += $ref->{amount};
+ } else {die ("No valid tax rate for pos 35" . Dumper($ref)); }
+ }
+ # USTVA Pos 36 (Steuerkonten)
+ if ($ref->{pos_ustva} eq '36') {
+ if ($ref->{accno} =~ /^$accno_sixteen/) {
+ $form->{"pos_ustva_811b_kivi"} += $ref->{amount};
+ } elsif ($ref->{accno} =~ /^$accno_five/) {
+ $form->{"pos_ustva_861b_kivi"} += $ref->{amount};
+ } else { die ("No valid accno for pos 36" . Dumper($ref)); }
+ }
+ $form->{ $ref->{$category} } += $ref->{amount} unless $corr;
}
$sth->finish;