X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=inline;f=SL%2FDO.pm;h=7659ffe607737c4f52d4552b13030d1721ba7e8e;hb=38f974a2140303118c2241ba95bde1703be5a237;hp=a37e516f171b798685edc94cab9ae4d02ab91f6c;hpb=eebe8e90991eacadb6fbd20a648c152017a620c7;p=kivitendo-erp.git diff --git a/SL/DO.pm b/SL/DO.pm index a37e516f1..7659ffe60 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -240,14 +240,11 @@ sub save { my $ml = ($form->{type} eq 'sales_delivery_order') ? 1 : -1; - if ($form->{id}) { - - $query = qq|DELETE FROM delivery_order_items_stock WHERE delivery_order_item_id IN (SELECT id FROM delivery_order_items WHERE delivery_order_id = ?)|; - do_query($form, $dbh, $query, conv_i($form->{id})); + my (@processed_doi, @processed_dois); - $query = qq|DELETE FROM delivery_order_items WHERE delivery_order_id = ?|; - do_query($form, $dbh, $query, conv_i($form->{id})); + if ($form->{id}) { + # only delete shipto complete $query = qq|DELETE FROM shipto WHERE trans_id = ? AND module = 'DO'|; do_query($form, $dbh, $query, conv_i($form->{id})); @@ -275,24 +272,23 @@ sub save { $query = qq|SELECT id, unit FROM parts WHERE id IN (| . join(', ', map { '?' } @part_ids) . qq|)|; %part_unit_map = selectall_as_map($form, $dbh, $query, 'id', 'unit', @part_ids); } - - my $q_item_id = qq|SELECT nextval('delivery_order_items_id')|; - my $h_item_id = prepare_query($form, $dbh, $q_item_id); - - my $q_item = - qq|INSERT INTO delivery_order_items ( - id, delivery_order_id, parts_id, description, longdescription, qty, base_qty, - sellprice, discount, unit, reqdate, project_id, serialnumber, - ordnumber, transdate, cusordnumber, - lastcost, price_factor_id, price_factor, marge_price_factor, pricegroup_id, - active_price_source) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, - (SELECT factor FROM price_factors WHERE id = ?), ?, ?, ?)|; + my $q_item = <{type} =~ /^sales/ ? 'out' : 'in'; @@ -300,6 +296,36 @@ sub save { for my $i (1 .. $form->{rowcount}) { next if (!$form->{"id_$i"}); + my $position = $i; + + my $cvars; + if (!$form->{"delivery_order_items_id_$i"}) { + # there is no persistent id, therefore create one with all necessary constraints + my $q_item_id = qq|SELECT nextval('delivery_order_items_id')|; + my $h_item_id = prepare_query($form, $dbh, $q_item_id); + do_statement($form, $h_item_id, $q_item_id); + $form->{"delivery_order_items_id_$i"} = $h_item_id->fetchrow_array(); + $query = qq|INSERT INTO delivery_order_items (id, delivery_order_id, position, parts_id) VALUES (?, ?, ?, ?)|; + do_query($form, $dbh, $query, conv_i($form->{"delivery_order_items_id_$i"}), + conv_i($form->{"id"}), conv_i($position), conv_i($form->{"id_$i"})); + $h_item_id->finish(); + + # get values for CVars from master data for new items + $cvars = CVar->get_custom_variables(dbh => $dbh, + module => 'IC', + trans_id => $form->{"id_$i"}, + ); + } else { + # get values for CVars from custom_variables for existing items + $cvars = CVar->get_custom_variables(dbh => $dbh, + module => 'IC', + sub_module => 'delivery_order_items', + trans_id => $form->{"delivery_order_items_id_$i"}, + ); + } + # map only non-editable CVars to form (editable ones are already there) + map { $form->{"ic_cvar_$_->{name}_$i"} = $_->{value} unless $_->{flag_editable} } @{ $cvars }; + $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); my $item_unit = $part_unit_map{$form->{"id_$i"}}; @@ -320,8 +346,6 @@ sub save { $items_reqdate = ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef; - do_statement($form, $h_item_id, $q_item_id); - my ($item_id) = $h_item_id->fetchrow_array(); # Get pricegroup_id and save it. Unfortunately the interface # also uses ID "0" for signalling that none is selected, but "0" @@ -331,7 +355,7 @@ sub save { $pricegroup_id = undef if !$pricegroup_id; # save detail record in delivery_order_items table - @values = (conv_i($item_id), conv_i($form->{id}), conv_i($form->{"id_$i"}), + @values = (conv_i($form->{id}), conv_i($position), conv_i($form->{"id_$i"}), $form->{"description_$i"}, $restricter->process($form->{"longdescription_$i"}), $form->{"qty_$i"}, $baseqty, $form->{"sellprice_$i"}, $form->{"discount_$i"} / 100, @@ -343,28 +367,75 @@ sub save { conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"marge_price_factor_$i"}), $pricegroup_id, - $form->{"active_price_source_$i"}); + $form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"}, + conv_i($form->{"delivery_order_items_id_$i"})); do_statement($form, $h_item, $q_item, @values); + push @processed_doi, $form->{"delivery_order_items_id_$i"}; # transaction safe? my $stock_info = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_$i"}); foreach my $sinfo (@{ $stock_info }) { - @values = ($item_id, $sinfo->{qty}, $sinfo->{unit}, conv_i($sinfo->{warehouse_id}), - conv_i($sinfo->{bin_id}), $sinfo->{chargenumber}, conv_date($sinfo->{bestbefore})); + # if we have stock_info, we have to check for persistents entries + if (!$sinfo->{"delivery_order_items_stock_id"}) { + my $q_item_stock_id = qq|SELECT nextval('id')|; + my $h_item_stock_id = prepare_query($form, $dbh, $q_item_stock_id); + do_statement($form, $h_item_stock_id, $q_item_stock_id); + $sinfo->{"delivery_order_items_stock_id"} = $h_item_stock_id->fetchrow_array(); + $query = qq|INSERT INTO delivery_order_items_stock (id, delivery_order_item_id, qty, unit, warehouse_id, bin_id) + VALUES (?, ?, ?, ?, ?, ?)|; + 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(); + } + @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}), + conv_i($sinfo->{"delivery_order_items_stock_id"})); do_statement($form, $h_item_stock, $q_item_stock, @values); + push @processed_dois, $sinfo->{"delivery_order_items_stock_id"}; } CVar->save_custom_variables(module => 'IC', sub_module => 'delivery_order_items', - trans_id => $item_id, + trans_id => $form->{"delivery_order_items_id_$i"}, configs => $ic_cvar_configs, variables => $form, name_prefix => 'ic_', name_postfix => "_$i", dbh => $dbh); + # link order items with doi + if ($form->{"converted_from_orderitems_id_$i"}) { + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'orderitems', + 'from_ids' => $form->{"converted_from_orderitems_id_$i"}, + 'to_table' => 'delivery_order_items', + 'to_id' => $form->{"delivery_order_items_id_$i"}, + ); + delete $form->{"converted_from_orderitems_id_$i"}; + } } - $h_item_id->finish(); + # 1. search for orphaned dois; processed_dois may be empty (no transfer) TODO: be supersafe and alter same statement for doi and oi + $query = sprintf 'SELECT id FROM delivery_order_items_stock WHERE delivery_order_item_id in + (select id from delivery_order_items where delivery_order_id = ?)'; + $query .= sprintf ' AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_dois if (scalar @processed_dois); + @values = (conv_i($form->{id}), map { conv_i($_) } @processed_dois); + my @orphaned_dois_ids = map { $_->{id} } selectall_hashref_query($form, $dbh, $query, @values); + if (scalar @orphaned_dois_ids) { + # clean up delivery_order_items_stock + $query = sprintf 'DELETE FROM delivery_order_items_stock WHERE id IN (%s)', join ', ', ("?") x scalar @orphaned_dois_ids; + do_query($form, $dbh, $query, @orphaned_dois_ids); + } + # 2. search for orphaned doi + $query = sprintf 'SELECT id FROM delivery_order_items WHERE delivery_order_id = ? AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_doi; + @values = (conv_i($form->{id}), map { conv_i($_) } @processed_doi); + my @orphaned_ids = map { $_->{id} } selectall_hashref_query($form, $dbh, $query, @values); + if (scalar @orphaned_ids) { + # clean up delivery_order_items + $query = sprintf 'DELETE FROM delivery_order_items WHERE id IN (%s)', join ', ', ("?") x scalar @orphaned_ids; + do_query($form, $dbh, $query, @orphaned_ids); + } $h_item->finish(); $h_item_stock->finish(); @@ -690,7 +761,7 @@ sub retrieve { doi.reqdate, doi.project_id, doi.serialnumber, doi.lastcost, doi.ordnumber, doi.transdate, doi.cusordnumber, doi.longdescription, doi.price_factor_id, doi.price_factor, doi.marge_price_factor, doi.pricegroup_id, - doi.active_price_source, + doi.active_price_source, doi.active_discount_source, pr.projectnumber, dord.transdate AS dord_transdate, dord.donumber, pg.partsgroup FROM delivery_order_items doi @@ -699,7 +770,7 @@ sub retrieve { LEFT JOIN project pr ON (doi.project_id = pr.id) LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) WHERE doi.delivery_order_id IN ($do_ids_placeholders) - ORDER BY doi.oid|; + ORDER BY doi.delivery_order_id, doi.position|; $form->{form_details} = selectall_hashref_query($form, $dbh, $query, @do_ids); @@ -717,7 +788,8 @@ sub retrieve { my $in_out = $form->{type} =~ /^sales/ ? 'out' : 'in'; $query = - qq|SELECT qty, unit, bin_id, warehouse_id, chargenumber, bestbefore + qq|SELECT id as delivery_order_items_stock_id, qty, unit, bin_id, + warehouse_id, chargenumber, bestbefore FROM delivery_order_items_stock WHERE delivery_order_item_id = ?|; my $sth = prepare_query($form, $dbh, $query); @@ -837,10 +909,12 @@ sub order_details { next if (!$form->{"id_$i"}); if ($item->[1] ne $sameitem) { - push(@{ $form->{description} }, qq|$item->[1]|); + push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, qq|$item->[1]|); $sameitem = $item->[1]; - map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" && $_ !~ /^si_/} @arrays)); + map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, []) } grep({ $_ =~ /^si_/} @arrays)); + $si_position++; } $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); @@ -939,6 +1013,24 @@ sub order_details { } } + my $cvars; + if (! $form->{"delivery_order_items_id_$i"}) { + # get values for CVars from master data for new items + $cvars = CVar->get_custom_variables(dbh => $dbh, + module => 'IC', + trans_id => $form->{"id_$i"}, + ); + } else { + # get values for CVars from custom_variables for existing items + $cvars = CVar->get_custom_variables(dbh => $dbh, + module => 'IC', + sub_module => 'delivery_order_items', + trans_id => $form->{"delivery_order_items_id_$i"}, + ); + } + # map only non-editable CVars to form (editable ones are already there) + map { $form->{"ic_cvar_$_->{name}_$i"} = $_->{value} unless $_->{flag_editable} } @{ $cvars }; + push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_) for @{ $ic_cvar_configs };