X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=5c6cec6581cb45fd56cff6e7e54591e124e100f3;hb=06af498f71c9424b2d373d12b4dd90cdac58e070;hp=faae5d6f7a1ef45057ad8a8349273ce644d414c1;hpb=0000e2ae1b32d360b1cb44996f5a86a7207340a2;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index faae5d6f7..5c6cec658 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -148,7 +148,7 @@ sub transactions { push(@values, '%' . $form->{transaction_description} . '%'); } - my $sortdir = $form->{sortdir} ? 'ASC' : 'DESC'; + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortorder = join(', ', map { "${_} ${sortdir} " } ("o.id", $form->sort_columns("transdate", $ordnumber, "name"))); my %allowed_sort_columns = ( "transdate" => "o.transdate", @@ -201,10 +201,13 @@ sub transactions_for_todo_list { $query = qq|SELECT oe.id, oe.transdate, oe.reqdate, oe.quonumber, oe.transaction_description, oe.amount, + CASE WHEN (COALESCE(0, oe.customer_id) = 0) THEN 'vendor' ELSE 'customer' END AS vc, c.name AS customer, + v.name AS vendor, e.name AS employee FROM oe LEFT JOIN customer c ON (oe.customer_id = c.id) + LEFT JOIN vendor v ON (oe.vendor_id = v.id) LEFT JOIN employee e ON (oe.employee_id = e.id) WHERE (COALESCE(quotation, FALSE) = TRUE) AND (COALESCE(closed, FALSE) = FALSE) @@ -467,15 +470,25 @@ sub save { $form->save_status($dbh); # Link this record to the records it was created from. - RecordLinks->create_links('dbh' => $dbh, - 'mode' => 'ids', - 'from_table' => 'oe', - 'from_ids' => $form->{convert_from_oe_ids}, - 'to_table' => 'oe', - 'to_id' => $form->{id}, - ); + $form->{convert_from_oe_ids} =~ s/^\s+//; + $form->{convert_from_oe_ids} =~ s/\s+$//; + my @convert_from_oe_ids = split m/\s+/, $form->{convert_from_oe_ids}; delete $form->{convert_from_oe_ids}; + if (scalar @convert_from_oe_ids) { + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'oe', + 'from_ids' => \@convert_from_oe_ids, + 'to_table' => 'oe', + 'to_id' => $form->{id}, + ); + + $self->_close_quotations_rfqs('dbh' => $dbh, + 'from_id' => \@convert_from_oe_ids, + 'to_id' => $form->{id}); + } + if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { if ($form->{vc} eq 'customer') { $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, $form->{exchangerate}, 0); @@ -498,40 +511,48 @@ sub save { return $rc; } -# this function closes multiple orders given in $form->{ordnumber_#}. -# use this for multiple orders that don't have to be saved back -# single orders should use OE::save instead. -sub close_orders { +sub _close_quotations_rfqs { $main::lxdebug->enter_sub(); - my ($self, $myconfig, $form) = @_; + my $self = shift; + my %params = @_; - # get ids from $form - map { push @ids, $form->{"ordnumber_$_"} if $form->{"ordnumber_$_"} } - (1 .. $form->{rowcount}); + Common::check_params(\%params, qw(from_id to_id)); - my $dbh = $form->dbconnect($myconfig); - $query = qq|UPDATE oe SET | . - qq|closed = TRUE | . - qq|WHERE ordnumber IN (| - . join(', ', map { $dbh->quote($_) } @ids) . qq|)|; - $dbh->do($query) || $form->dberror($query); - $dbh->disconnect; + my $myconfig = \%main::myconfig; + my $form = $main::form; - $main::lxdebug->leave_sub(); -} + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); -sub close_order { - $main::lxdebug->enter_sub(); + my $query = qq|SELECT quotation FROM oe WHERE id = ?|; + my $sth = prepare_query($form, $dbh, $query); - my ($self, $myconfig, $form) = @_; + do_statement($form, $sth, $query, conv_i($params{to_id})); - return $main::lxdebug->leave_sub() unless ($form->{"id"}); + my ($quotation) = $sth->fetchrow_array(); - my $dbh = $form->dbconnect($myconfig); - do_query($form, $dbh, qq|UPDATE oe SET closed = TRUE where id = ?|, - $form->{"id"}); - $dbh->disconnect; + if ($quotation) { + $main::lxdebug->leave_sub(); + return; + } + + my @close_ids; + + foreach my $from_id (@{ $params{from_id} }) { + $from_id = conv_i($from_id); + do_statement($form, $sth, $query, $from_id); + ($quotation) = $sth->fetchrow_array(); + push @close_ids, $from_id if ($quotation); + } + + $sth->finish(); + + if (scalar @close_ids) { + $query = qq|UPDATE oe SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar @close_ids) . qq|)|; + do_query($form, $dbh, $query, @close_ids); + + $dbh->commit() unless ($params{dbh}); + } $main::lxdebug->leave_sub(); } @@ -927,6 +948,8 @@ sub order_details { $form->{"globalprojectnumber"} = $projectnumbers{$form->{"globalproject_id"}}; + $form->{discount} = []; + my @arrays = qw(runningnumber number description longdescription qty ship unit bin partnotes serialnumber reqdate sellprice listprice netprice @@ -987,8 +1010,9 @@ sub order_details { my ($dec) = ($sellprice =~ /\.(\d+)/); my $decimalplaces = max 2, length($dec); - my $discount = $form->round_amount($form->{"qty_$i"} * $sellprice * $form->{"discount_$i"} / 100 / $price_factor->{factor}, $decimalplaces); - my $linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice * (100 - $form->{"discount_$i"}) / 100 / $price_factor->{factor}, 2); + my $parsed_discount = $form->parse_amount($myconfig, $form->{"discount_$i"}); + my $discount = $form->round_amount($form->{"qty_$i"} * $sellprice * $parsed_discount / 100 / $price_factor->{factor}, $decimalplaces); + my $linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice * (100 - $parsed_discount) / 100 / $price_factor->{factor}, 2); my $nodiscount_linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice / $price_factor->{factor}, 2); $form->{"netprice_$i"} = $form->round_amount($form->{"qty_$i"} ? ($linetotal / $form->{"qty_$i"}) : 0, 2); @@ -996,7 +1020,7 @@ sub order_details { $linetotal = ($linetotal != 0) ? $linetotal : ''; - push @{ $form->{discount} }, ($discount != 0) ? $form->format_amount($myconfig, $discount * -1, $decimalplaces) : ''; + push @{ $form->{discount} }, ($discount != 0) ? $form->format_amount($myconfig, $discount * -1, 2) : ''; push @{ $form->{p_discount} }, $form->{"discount_$i"}; $form->{ordtotal} += $linetotal;