X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDO.pm;h=3dde867c24d51f53d418f137d9153215c0a66e24;hb=826d79929635c726f7459296fafa7e630c00e72d;hp=91d896d7b0eec04657c126eb73a01652dfdf28e0;hpb=6b64a63ecb462a610515fd1609d490e33b28825d;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index 91d896d7b..3dde867c2 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -25,7 +25,8 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1335, USA. #====================================================================== # # Delivery Order entry module @@ -33,6 +34,7 @@ package DO; +use Carp; use List::Util qw(max); use YAML; @@ -42,10 +44,13 @@ use SL::CVar; use SL::DB::DeliveryOrder; use SL::DB::Status; use SL::DBUtils; +use SL::Helper::ShippedQty; use SL::HTML::Restrict; use SL::RecordLinks; use SL::IC; use SL::TransNumber; +use SL::DB; +use SL::Util qw(trim); use strict; @@ -110,12 +115,12 @@ sub transactions { } elsif ($form->{$vc}) { push @where, qq|ct.name ILIKE ?|; - push @values, '%' . $form->{$vc} . '%'; + push @values, like($form->{$vc}); } if ($form->{"cp_name"}) { push @where, "(cp.cp_name ILIKE ? OR cp.cp_givenname ILIKE ?)"; - push @values, ('%' . $form->{"cp_name"} . '%')x2; + push @values, (like($form->{"cp_name"}))x2; } foreach my $item (qw(employee_id salesman_id)) { @@ -131,7 +136,7 @@ sub transactions { foreach my $item (qw(donumber ordnumber cusordnumber transaction_description)) { next unless ($form->{$item}); push @where, qq|dord.$item ILIKE ?|; - push @values, '%' . $form->{$item} . '%'; + push @values, like($form->{$item}); } if (($form->{open} || $form->{closed}) && @@ -146,7 +151,7 @@ sub transactions { if ($form->{serialnumber}) { push @where, 'dord.id IN (SELECT doi.delivery_order_id FROM delivery_order_items doi WHERE doi.serialnumber LIKE ?)'; - push @values, '%' . $form->{serialnumber} . '%'; + push @values, like($form->{serialnumber}); } if($form->{transdatefrom}) { @@ -179,6 +184,33 @@ sub transactions { push @values, conv_date($form->{insertdateto}); } + if ($form->{parts_partnumber}) { + push @where, <{parts_partnumber}); + } + + if ($form->{parts_description}) { + push @where, <{parts_description}); + } + if (@where) { $query .= " WHERE " . join(" AND ", map { "($_)" } @where); } @@ -231,6 +263,16 @@ sub transactions { } sub save { + my ($self) = @_; + $main::lxdebug->enter_sub(); + + my $rc = SL::DB->client->with_transaction(\&_save, $self); + + $main::lxdebug->leave_sub(); + return $rc; +} + +sub _save { $main::lxdebug->enter_sub(); my ($self) = @_; @@ -238,8 +280,7 @@ sub save { my $myconfig = \%main::myconfig; my $form = $main::form; - # connect to database, turn off autocommit - my $dbh = $form->get_standard_dbh($myconfig); + my $dbh = SL::DB->client->dbh; my $restricter = SL::HTML::Restrict->create; my ($query, @values, $sth, $null); @@ -262,6 +303,11 @@ sub save { if ($form->{id}) { # only delete shipto complete + $query = qq|DELETE FROM custom_variables + WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE (module = 'ShipTo'))) + AND (trans_id IN (SELECT shipto_id FROM shipto WHERE (module = 'DO') AND (trans_id = ?)))|; + do_query($form, $dbh, $query, $form->{id}); + $query = qq|DELETE FROM shipto WHERE trans_id = ? AND module = 'DO'|; do_query($form, $dbh, $query, conv_i($form->{id})); @@ -278,7 +324,7 @@ sub save { my $items_reqdate; $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS'); - my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} }; + my %price_factors = map { $_->{id} => $_->{factor} *1 } @{ $form->{ALL_PRICE_FACTORS} }; my $price_factor; my %part_id_map = map { $_ => 1 } grep { $_ } map { $form->{"id_$_"} } (1 .. $form->{rowcount}); @@ -390,9 +436,9 @@ SQL do_query($form, $dbh, $query, conv_i($sinfo->{"delivery_order_items_stock_id"}), conv_i($form->{"delivery_order_items_id_$i"}), $sinfo->{qty}, $sinfo->{unit}, conv_i($sinfo->{warehouse_id}), conv_i($sinfo->{bin_id})); - $h_item_stock_id->finish(); - # write back the id to the form (important if only transfer was clicked (id fk for invoice) - $form->{"stock_${in_out}_$i"} = YAML::Dump($stock_info); + $h_item_stock_id->finish(); + # write back the id to the form (important if only transfer was clicked (id fk for invoice) + $form->{"stock_${in_out}_$i"} = YAML::Dump($stock_info); } @values = ($form->{"delivery_order_items_id_$i"}, $sinfo->{qty}, $sinfo->{unit}, conv_i($sinfo->{warehouse_id}), conv_i($sinfo->{bin_id}), $sinfo->{chargenumber}, conv_date($sinfo->{bestbefore}), @@ -477,6 +523,8 @@ SQL conv_i($form->{id})); do_query($form, $dbh, $query, @values); + $form->new_lastmtime('delivery_orders'); + $form->{name} = $form->{ $form->{vc} }; $form->{name} =~ s/--$form->{"$form->{vc}_id"}//; @@ -502,8 +550,6 @@ SQL 'type' => $form->{type} eq 'sales_delivery_order' ? 'sales' : 'purchase', 'dbh' => $dbh,); - my $rc = $dbh->commit(); - $form->{saved_donumber} = $form->{donumber}; $form->{saved_ordnumber} = $form->{ordnumber}; $form->{saved_cusordnumber} = $form->{cusordnumber}; @@ -512,74 +558,28 @@ SQL $main::lxdebug->leave_sub(); - return $rc; + return 1; } sub mark_orders_if_delivered { - $main::lxdebug->enter_sub(); - - my $self = shift; - my %params = @_; + my ($self, %params) = @_; 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 @links = RecordLinks->get_links('dbh' => $dbh, - 'from_table' => 'oe', - 'to_table' => 'delivery_orders', - 'to_id' => $params{do_id}); - - my $oe_id = @links ? $links[0]->{from_id} : undef; - - return $main::lxdebug->leave_sub() if (!$oe_id); - - my $all_units = AM->retrieve_all_units(); + my $do = SL::DB::Manager::DeliveryOrder->find_by(id => $params{do_id}); + my $orders = $do->linked_records(from => 'Order'); - 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); + SL::Helper::ShippedQty->new->calculate($orders)->write_to_objects; - my %shipped = $self->get_shipped_qty('type' => $params{type}, - 'oe_id' => $oe_id,); - my %ordered = (); + SL::DB->client->with_transaction(sub { + for my $oe (@$orders) { + next if $params{type} eq 'sales' && !$oe->customer_id; + next if $params{type} eq 'purchase' && !$oe->vendor_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; + $oe->update_attributes(delivered => $oe->{delivered}); } - } - - $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(); + 1; + }) or do { die SL::DB->client->error }; } sub close_orders { @@ -598,13 +598,16 @@ sub close_orders { my $myconfig = \%main::myconfig; my $form = $main::form; - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + SL::DB->client->with_transaction(sub { + my $dbh = $params{dbh} || SL::DB->client->dbh; - my $query = qq|UPDATE delivery_orders SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar(@{ $params{ids} })) . qq|)|; + 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} }); + do_query($form, $dbh, $query, map { conv_i($_) } @{ $params{ids} }); + 1; + }) or die { SL::DB->client->error }; - $dbh->commit() unless ($params{dbh}); + $form->new_lastmtime('delivery_orders'); $main::lxdebug->leave_sub(); } @@ -740,10 +743,18 @@ sub retrieve { $sth = prepare_execute_query($form, $dbh, $query, $form->{id}); $ref = $sth->fetchrow_hashref("NAME_lc"); - delete $ref->{id}; - map { $form->{$_} = $ref->{$_} } keys %$ref; + $form->{$_} = $ref->{$_} for grep { m{^shipto(?!_id$)} } keys %$ref; $sth->finish(); + if ($ref->{shipto_id}) { + my $cvars = CVar->get_custom_variables( + dbh => $dbh, + module => 'ShipTo', + trans_id => $ref->{shipto_id}, + ); + $form->{"shiptocvar_$_->{name}"} = $_->{value} for @{ $cvars }; + } + # get printed, emailed and queued $query = qq|SELECT s.printed, s.emailed, s.spoolfile, s.formname FROM status s WHERE s.trans_id = ?|; $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id})); @@ -765,7 +776,7 @@ sub retrieve { # stuff different from the whole will not be overwritten, but saved with a suffix. $query = qq|SELECT doi.id AS delivery_order_items_id, - p.partnumber, p.assembly, p.listprice, doi.description, doi.qty, + p.partnumber, p.part_type, p.listprice, doi.description, doi.qty, doi.sellprice, doi.parts_id AS id, doi.unit, doi.discount, p.notes AS partnotes, doi.reqdate, doi.project_id, doi.serialnumber, doi.lastcost, doi.ordnumber, doi.transdate, doi.cusordnumber, doi.longdescription, @@ -912,7 +923,7 @@ sub order_details { push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS'); - my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} }; + my %price_factors = map { $_->{id} => $_->{factor} *1 } @{ $form->{ALL_PRICE_FACTORS} }; my $totalweight = 0; my $sameitem = ""; @@ -1053,9 +1064,9 @@ sub order_details { $h_pg->finish(); $h_bin_wh->finish(); + $form->{department} = SL::DB::Manager::Department->find_by(id => $form->{department_id})->description if $form->{department_id}; $form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef); $form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id}; - $form->{department} = SL::DB::Manager::Department->find_by(id => $form->{department_id})->description if $form->{department_id}; $form->{username} = $myconfig->{name}; @@ -1226,56 +1237,6 @@ sub transfer_in_out { $main::lxdebug->leave_sub(); } -sub get_shipped_qty { - $main::lxdebug->enter_sub(); - - my $self = shift; - my %params = @_; - - 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 @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 = - 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 o.id IN (| . join(', ', ('?') x scalar @values) . qq|)|; - - my %ship = (); - my $entries = selectall_hashref_query($form, $dbh, $query, @values); - my $all_units = AM->retrieve_all_units(); - - foreach my $entry (@{ $entries }) { - $entry->{qty} *= AM->convert_unit($entry->{unit}, $entry->{partunit}, $all_units); - - if (!$ship{$entry->{parts_id}}) { - $ship{$entry->{parts_id}} = $entry; - } else { - $ship{$entry->{parts_id}}->{qty} += $entry->{qty}; - } - } - - $main::lxdebug->leave_sub(); - - return %ship; -} - sub is_marked_as_delivered { $main::lxdebug->enter_sub();