X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=870673a5cf35d0822b1f2b471cdd621ca6ef647c;hb=d40a8e202ca38008031a0cb882f5c3ae1c58fce8;hp=5e2551b2d3694ff26151cd3b0298bd95f804b77d;hpb=2f9a52209e4bea503cebf447e498b4a5848eb02c;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index 5e2551b2d..870673a5c 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -509,32 +509,22 @@ sub save { $pricegroup_id *= 1; $pricegroup_id = undef if !$pricegroup_id; + CVar->get_non_editable_ic_cvars(form => $form, + dbh => $dbh, + row => $i, + sub_module => 'orderitems', + may_converted_from => ['orderitems', 'invoice']); + my $position = $i; # save detail record in orderitems table - my $cvars; if (! $form->{"orderitems_id_$i"}) { $query = qq|SELECT nextval('orderitemsid')|; ($form->{"orderitems_id_$i"}) = selectrow_query($form, $dbh, $query); $query = qq|INSERT INTO orderitems (id, position) VALUES (?, ?)|; do_query($form, $dbh, $query, $form->{"orderitems_id_$i"}, conv_i($position)); - - # 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 => 'orderitems', - trans_id => $form->{"orderitems_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 }; my $orderitems_id = $form->{"orderitems_id_$i"}; push @processed_orderitems, $orderitems_id; @@ -578,9 +568,10 @@ SQL name_prefix => 'ic_', name_postfix => "_$i", dbh => $dbh); + # link previous items with orderitems foreach (qw(orderitems invoice)) { - if ($form->{"converted_from_${_}_id_$i"}) { + if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"}) { RecordLinks->create_links('dbh' => $dbh, 'mode' => 'ids', 'from_table' => $_, @@ -588,11 +579,12 @@ SQL 'to_table' => 'orderitems', 'to_id' => $orderitems_id, ); - delete $form->{"converted_from_${_}_id_$i"}; } + delete $form->{"converted_from_${_}_id_$i"}; } } } + # search for orphaned ids $query = sprintf 'SELECT id FROM orderitems WHERE trans_id = ? AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_orderitems; @values = (conv_i($form->{id}), map { conv_i($_) } @processed_orderitems); @@ -673,23 +665,28 @@ SQL $form->save_status($dbh); # Link this record to the records it was created from. + # check every record type we may link. i am not happy with converting the string to array back + # should be a array from the start (OE.pm -> retrieve). + # and that i need the local array ref for close_quotation_rfqs. better ideas welcome $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}, - ); - + @{ $form->{convert_from_oe_ids} } = @convert_from_oe_ids; + foreach (qw(ar oe)) { + if (!$form->{useasnew} && $form->{"convert_from_${_}_ids"}) { + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => $_, + 'from_ids' => $form->{"convert_from_${_}_ids"}, + 'to_table' => 'oe', + 'to_id' => $form->{id}, + ); + delete $form->{"convert_from_${_}_ids"}; + } $self->_close_quotations_rfqs('dbh' => $dbh, 'from_id' => \@convert_from_oe_ids, - 'to_id' => $form->{id}); + 'to_id' => $form->{id}) if $_ eq 'oe'; } if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { @@ -839,20 +836,22 @@ sub retrieve { if ($form->{"rowcount"} and $#ids == 0) { $form->{"id"} = $ids[0]; undef @ids; + delete $form->{convert_from_oe_ids}; } # and remember for the rest of the function my $is_collective_order = scalar @ids; + $form->{useasnew} = !!$is_collective_order; if (!$form->{id}) { - my $wday = (localtime(time))[6]; - my $next_workday = $wday == 5 ? 3 : $wday == 6 ? 2 : 1; + my $extra_days = $form->{type} eq 'sales_quotation' ? $::instance_conf->get_reqdate_interval : 1; + my $next_workday = DateTime->today_local->add(days => $extra_days); + my $day_of_week = $next_workday->day_of_week; - # if we have a client configured interval for sales quotation, we add this - $next_workday += $::instance_conf->get_reqdate_interval if ($::instance_conf->get_reqdate_interval && - $form->{type} eq 'sales_quotation' ); + $next_workday->add(days => (8 - $day_of_week)) if $day_of_week >= 6; - $query_add = qq|, current_date AS transdate, date(current_date + interval '${next_workday} days') AS reqdate|; + $form->{transdate} = DateTime->today_local->to_kivitendo; + $form->{reqdate} = $next_workday->to_kivitendo; } # get default accounts @@ -1047,7 +1046,7 @@ sub retrieve { } # delete orderitems_id in collective orders, so that they get cloned no matter what - delete $ref->{orderitems_id} if $is_collective_order; + $ref->{converted_from_orderitems_id} = delete $ref->{orderitems_id} if $is_collective_order; # get tax rates and description my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno}; @@ -1407,23 +1406,11 @@ sub order_details { $sth->finish; } - my $cvars; - if (! $form->{"orderitems_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 => 'orderitems', - trans_id => $form->{"orderitems_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 }; + CVar->get_non_editable_ic_cvars(form => $form, + dbh => $dbh, + row => $i, + sub_module => 'orderitems', + may_converted_from => ['orderitems', 'invoice']); push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_)