X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=28eb85436718d973686be97d99944b3b018e31ec;hb=26ba876e4863567ba21fddd5ec8f909aacfbdfde;hp=18fba890a4e2689e685d0440167c2c01a41eb899;hpb=e73b17d69ae188821a87c133edb315284d74dfb5;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index 18fba890a..28eb85436 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -39,6 +39,7 @@ use YAML; use SL::AM; use SL::Common; use SL::DBUtils; +use SL::RecordLinks; sub transactions { $main::lxdebug->enter_sub(); @@ -141,12 +142,13 @@ sub transactions { "transaction_description" => "dord.transaction_description" ); - my $sortoder = "dord.id"; + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; + my $sortorder = "dord.id"; if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) { $sortorder = $allowed_sort_columns{$form->{sort}}; } - $query .= qq| ORDER by | . $sortorder; + $query .= qq| ORDER by | . $sortorder . " $sortdir"; $form->{DO} = selectall_hashref_query($form, $dbh, $query, @values); @@ -342,7 +344,17 @@ sub save { # save printed, emailed, queued $form->save_status($dbh); - $self->close_order_if_delivered('do_id' => $form->{id}, + # Link this delivery order to the quotations it was created from. + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'oe', + 'from_ids' => $form->{convert_from_oe_ids}, + 'to_table' => 'delivery_orders', + 'to_id' => $form->{id}, + ); + delete $form->{convert_from_oe_ids}; + + $self->mark_orders_if_delivered('do_id' => $form->{id}, 'type' => $form->{type} eq 'sales_delivery_order' ? 'sales' : 'purchase', 'dbh' => $dbh,); @@ -357,7 +369,7 @@ sub save { return $rc; } -sub close_order_if_delivered { +sub mark_orders_if_delivered { $main::lxdebug->enter_sub(); my $self = shift; @@ -365,41 +377,32 @@ sub close_order_if_delivered { Common::check_params(\%params, qw(do_id type)); - my $myconfig = \%main::myconfig; - my $form = $main::form; - - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - - my $query = qq|SELECT ordnumber FROM delivery_orders WHERE id = ?|; - my ($ordnumber) = selectfirst_array_query($form, $dbh, $query, conv_i($params{do_id})); + my $myconfig = \%main::myconfig; + my $form = $main::form; - return $main::lxdebug->leave_sub() if (!$ordnumber); + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - my $vc = $params{type} eq 'purchase' ? 'vendor' : 'customer'; - $query = qq|SELECT id - FROM oe - WHERE NOT COALESCE(quotation, FALSE) - AND (COALESCE(${vc}_id, 0) > 0) - AND (ordnumber = ?) - ORDER BY id - LIMIT 1|; + my @links = RecordLinks->get_links('dbh' => $dbh, + 'from_table' => 'oe', + 'to_table' => 'delivery_orders', + 'to_id' => $params{do_id}); - my ($oe_id) = selectfirst_array_query($form, $dbh, $query, $ordnumber); + my ($oe_id) = $links[0]->{from_id} if (scalar @links); return $main::lxdebug->leave_sub() if (!$oe_id); my $all_units = AM->retrieve_all_units(); - my %shipped = $self->get_shipped_qty('type' => $params{type}, - 'ordnumber' => $ordnumber,); - my %ordered = (); - - $query = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit + my $query = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit FROM orderitems oi LEFT JOIN parts p ON (oi.parts_id = p.id) WHERE (oi.trans_id = ?)|; my $sth = prepare_execute_query($form, $dbh, $query, $oe_id); + my %shipped = $self->get_shipped_qty('type' => $params{type}, + 'oe_id' => $oe_id,); + my %ordered = (); + while (my $ref = $sth->fetchrow_hashref()) { $ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor}; @@ -424,16 +427,42 @@ sub close_order_if_delivered { if ($delivered) { $query = qq|UPDATE oe - SET delivered = TRUE, closed = TRUE + SET delivered = TRUE WHERE id = ?|; do_query($form, $dbh, $query, $oe_id); - $dbh->commit() if (!$params{dbh}); } $main::lxdebug->leave_sub(); } +sub close_orders { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(ids)); + + if (('ARRAY' ne ref $params{ids}) || !scalar @{ $params{ids} }) { + $main::lxdebug->leave_sub(); + return; + } + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $query = qq|UPDATE delivery_orders SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar(@{ $params{ids} })) . qq|)|; + + do_query($form, $dbh, $query, map { conv_i($_) } @{ $params{ids} }); + + $dbh->commit() unless ($params{dbh}); + + $main::lxdebug->leave_sub(); +} + sub delete { $main::lxdebug->enter_sub(); @@ -974,25 +1003,33 @@ sub get_shipped_qty { my $self = shift; my %params = @_; - Common::check_params(\%params, qw(type ordnumber)); + Common::check_params(\%params, qw(type oe_id)); my $myconfig = \%main::myconfig; my $form = $main::form; my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - my $notsales = $params{type} eq 'sales' ? '' : 'NOT'; + my @links = RecordLinks->get_links('dbh' => $dbh, + 'from_table' => 'oe', + 'from_id' => $params{oe_id}, + 'to_table' => 'delivery_orders'); + my @values = map { $_->{to_id} } @links; - my $query = + if (!scalar @values) { + $main::lxdebug->leave_sub(); + return (); + } + + my $query = qq|SELECT doi.parts_id, doi.qty, doi.unit, p.unit AS partunit FROM delivery_order_items doi LEFT JOIN delivery_orders o ON (doi.delivery_order_id = o.id) LEFT JOIN parts p ON (doi.parts_id = p.id) - WHERE ($notsales o.is_sales) - AND (o.ordnumber = ?)|; + WHERE o.id IN (| . join(', ', ('?') x scalar @values) . qq|)|; my %ship = (); - my $entries = selectall_hashref_query($form, $dbh, $query, $params{ordnumber}); + my $entries = selectall_hashref_query($form, $dbh, $query, @values); my $all_units = AM->retrieve_all_units(); foreach my $entry (@{ $entries }) { @@ -1010,4 +1047,25 @@ sub get_shipped_qty { return %ship; } +sub is_marked_as_delivered { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(id)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my ($delivered) = selectfirst_array_query($form, $dbh, qq|SELECT delivered FROM delivery_orders WHERE id = ?|, conv_i($params{id})); + + $main::lxdebug->leave_sub(); + + return $delivered ? 1 : 0; +} + + 1;