X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAP.pm;h=d399b7c1bff4365537f0f9861070320f86acf766;hb=2a0cbd885790174fa0f212e6661b30362650a42c;hp=8a3394baf028c9eea76369bc70aaa8480e239c46;hpb=5734251762d9fc172a5110472d029bb6a36578a0;p=kivitendo-erp.git diff --git a/SL/AP.pm b/SL/AP.pm index 8a3394baf..d399b7c1b 100644 --- a/SL/AP.pm +++ b/SL/AP.pm @@ -142,7 +142,7 @@ sub _post_transaction { transdate = ?, ordnumber = ?, vendor_id = ?, taxincluded = ?, amount = ?, duedate = ?, deliverydate = ?, tax_point = ?, paid = ?, netamount = ?, currency_id = (SELECT id FROM currencies WHERE name = ?), notes = ?, department_id = ?, storno = ?, storno_id = ?, - globalproject_id = ?, direct_debit = ?, payment_id = ? + globalproject_id = ?, direct_debit = ?, payment_id = ?, transaction_description = ? WHERE id = ?|; @values = ($form->{invnumber}, conv_date($form->{transdate}), $form->{ordnumber}, conv_i($form->{vendor_id}), @@ -153,7 +153,7 @@ sub _post_transaction { conv_i($form->{department_id}), $form->{storno}, $form->{storno_id}, conv_i($form->{globalproject_id}), $form->{direct_debit} ? 't' : 'f', - conv_i($form->{payment_id}), + conv_i($form->{payment_id}), $form->{transaction_description}, $form->{id}); do_query($form, $dbh, $query, @values); @@ -428,10 +428,6 @@ sub _post_transaction { sub _reverse_charge { my ($self, $myconfig, $form) = @_; - # check taxkey settings or return - my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => 94 ]); - return unless ref $tax eq 'SL::DB::Tax'; - # delete previous bookings, if they exists (repost) my $ap_gl = SL::DB::Manager::ApGl->get_first(where => [ ap_id => $form->{id} ]); my $gl_id = ref $ap_gl eq 'SL::DB::ApGl' ? $ap_gl->gl_id : undef; @@ -440,20 +436,22 @@ sub _reverse_charge { SL::DB::Manager::ApGl-> delete_all(where => [ ap_id => $form->{id} ]) if $gl_id; SL::DB::Manager::RecordLink-> delete_all(where => [ from_table => 'ap', to_table => 'gl', from_id => $form->{id} ]); - # gl booking - my ($credit, $debit); - $credit = SL::DB::Manager::Chart->find_by(id => $tax->chart_id); - $debit = SL::DB::Manager::Chart->find_by(id => $tax->reverse_charge_chart_id); - - croak("No such Chart ID" . $tax->chart_id) unless ref $credit eq 'SL::DB::Chart'; - croak("No such Chart ID" . $tax->reverse_chart_id) unless ref $debit eq 'SL::DB::Chart'; - my ($i, $current_transaction); for $i (1 .. $form->{rowcount}) { - next unless $form->{"taxkey_$i"} == 94; - my ($tmpnetamount, $tmptaxamount) = $form->calculate_tax($form->{"amount_$i"}, 0.19, $form->{taxincluded}, 2); + my $tax = SL::DB::Manager::Tax->get_first( where => [id => $form->{"tax_id_$i"}, '!reverse_charge_chart_id' => undef ]); + next unless ref $tax eq 'SL::DB::Tax'; + + # gl booking + my ($credit, $debit); + $credit = SL::DB::Manager::Chart->find_by(id => $tax->chart_id); + $debit = SL::DB::Manager::Chart->find_by(id => $tax->reverse_charge_chart_id); + + croak("No such Chart ID" . $tax->chart_id) unless ref $credit eq 'SL::DB::Chart'; + croak("No such Chart ID" . $tax->reverse_chart_id) unless ref $debit eq 'SL::DB::Chart'; + + my ($tmpnetamount, $tmptaxamount) = $form->calculate_tax($form->{"amount_$i"}, $tax->rate, $form->{taxincluded}, 2); $current_transaction = SL::DB::GLTransaction->new( employee_id => $form->{employee_id}, transdate => $form->{transdate}, @@ -463,13 +461,15 @@ sub _reverse_charge { imported => 0, # not imported taxincluded => 0, )->add_chart_booking( - chart => $tmptaxamount < 0 ? $credit : $debit, - credit => abs($tmptaxamount), + chart => $tmptaxamount > 0 ? $debit : $credit, + debit => abs($tmptaxamount), source => "Reverse Charge for " . $form->{invnumber}, + tax_id => 0, )->add_chart_booking( - chart => $tmptaxamount < 0 ? $debit : $credit, - debit => abs($tmptaxamount), + chart => $tmptaxamount > 0 ? $credit : $debit, + credit => abs($tmptaxamount), source => "Reverse Charge for " . $form->{invnumber}, + tax_id => 0, )->post; # add a stable link from ap to gl my %props_gl = ( @@ -564,16 +564,16 @@ sub ap_transactions { # Permissions: # - Always return invoices & AP transactions for projects the employee has "view invoices" permissions for, no matter what the other rules say. # - Exclude AP transactions if no permissions for them exist. - # - Limit to own invoices unless may edit all invoices. - # - If may edit all, allow filtering by employee. + # - Limit to own invoices unless may edit all invoices or view invoices is allowed. + # - If may edit all or view invoices is allowed, allow filtering by employee. my (@permission_where, @permission_values); - if ($::auth->assert('vendor_invoice_edit', 1)) { + if ($::auth->assert('vendor_invoice_edit', 1) || $::auth->assert('purchase_invoice_view', 1)) { if (!$::auth->assert('show_ap_transactions', 1)) { push @permission_where, "NOT invoice = 'f'"; # remove ap transactions from Purchase -> Reports -> Invoices } - if (!$::auth->assert('purchase_all_edit', 1)) { + if (!$::auth->assert('purchase_all_edit', 1) && !$::auth->assert('purchase_invoice_view', 1)) { # only show own invoices push @permission_where, "a.employee_id = ?"; push @permission_values, SL::DB::Manager::Employee->current->id; @@ -586,7 +586,7 @@ sub ap_transactions { } } - if (@permission_where || !$::auth->assert('vendor_invoice_edit', 1)) { + if (@permission_where || (!$::auth->assert('vendor_invoice_edit', 1) && !$::auth->assert('purchase_invoice_view', 1))) { my $permission_where_str = @permission_where ? "OR (" . join(" AND ", map { "($_)" } @permission_where) . ")" : ""; $where .= qq| AND ( (a.globalproject_id IN ( @@ -618,6 +618,10 @@ sub ap_transactions { $where .= " AND a.ordnumber ILIKE ?"; push(@values, like($form->{ordnumber})); } + if ($form->{taxzone_id}) { + $where .= " AND a.taxzone_id = ?"; + push(@values, $form->{taxzone_id}); + } if ($form->{transaction_description}) { $where .= " AND a.transaction_description ILIKE ?"; push(@values, like($form->{transaction_description})); @@ -698,7 +702,7 @@ SQL my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortorder = join(', ', map { "$_ $sortdir" } @a); - if (grep({ $_ eq $form->{sort} } qw(transdate id invnumber ordnumber name netamount tax amount paid datepaid due duedate notes employee transaction_description direct_debit department))) { + if (grep({ $_ eq $form->{sort} } qw(transdate id invnumber ordnumber name netamount tax amount paid datepaid due duedate notes employee transaction_description direct_debit department taxzone))) { $sortorder = $form->{sort} . " $sortdir"; }