X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=2ad076a80a2ef7562aaaa840032fa81b96b51335;hb=94e596e55cef6b9ef9b80b5a4dba8204e0c29c9f;hp=7f547f0b921042c8cc411fb2d273ac9de201b516;hpb=480d9a56bed666562d3c115fa2da4c09ba66ac8d;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index 7f547f0b9..2ad076a80 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,6 +344,20 @@ sub save { # save printed, emailed, queued $form->save_status($dbh); + # 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,); + my $rc = $dbh->commit(); $form->{saved_donumber} = $form->{donumber}; @@ -353,19 +369,100 @@ sub save { return $rc; } -sub close_order { +sub mark_orders_if_delivered { $main::lxdebug->enter_sub(); - my ($self) = @_; + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(do_id type)); my $myconfig = \%main::myconfig; my $form = $main::form; - return $main::lxdebug->leave_sub() unless ($form->{id}); + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my @links = RecordLinks->get_links('dbh' => $dbh, + 'from_table' => 'oe', + 'to_table' => 'delivery_orders', + 'to_id' => $params{do_id}); - my $dbh = $form->get_standard_dbh($myconfig); - do_query($form, $dbh, qq|UPDATE do SET closed = TRUE where id = ?|, conv_i($form->{id})); - $dbh->commit(); + my ($oe_id) = $links[0]->{from_id} if (scalar @links); + + $main::lxdebug->message(0, "oe_id $oe_id"); + + return $main::lxdebug->leave_sub() if (!$oe_id); + + my $all_units = AM->retrieve_all_units(); + + $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 = (); + + do_statement($form, $sth, $query, $oe_id); + + while (my $ref = $sth->fetchrow_hashref()) { + $ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor}; + + if ($ordered{$ref->{parts_id}}) { + $ordered{$ref->{parts_id}}->{baseqty} += $ref->{baseqty}; + } else { + $ordered{$ref->{parts_id}} = $ref; + } + } + + $sth->finish(); + + map { $_->{baseqty} = $_->{qty} * $all_units->{$_->{unit}}->{factor} / $all_units->{$_->{partunit}}->{factor} } values %shipped; + + my $delivered = 1; + foreach my $part (values %ordered) { + if (!$shipped{$part->{parts_id}} || ($shipped{$part->{parts_id}}->{baseqty} < $part->{baseqty})) { + $delivered = 0; + last; + } + } + + if ($delivered) { + $query = qq|UPDATE oe + 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(); } @@ -910,25 +1007,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; + + if (!scalar @values) { + $main::lxdebug->leave_sub(); + return (); + } - my $query = + 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 }) { @@ -946,4 +1051,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;