X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=332d6345adf2ed5b69e1d2b24546d02ff8075d9d;hb=844a541e0d8f59644540413f675e8f07cd154cf6;hp=a517e05d2a3fb8ea24d724569789b9964f19abe8;hpb=3906bb6a765c9f7ced44d7765f6f8913f3f5e482;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index a517e05d2..332d6345a 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -44,6 +44,7 @@ use SL::DB::Order; use SL::DB::PeriodicInvoicesConfig; use SL::DB::Project; use SL::DB::ProjectType; +use SL::DB::RequirementSpecOrder; use SL::DB::Status; use SL::DB::Tax; use SL::DBUtils; @@ -479,6 +480,7 @@ sub _save { my $number_field = $form->{type} =~ m{order} ? 'ordnumber' : 'quonumber'; my $trans_number = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{$number_field}, id => $form->{id}); $form->{$number_field} ||= $trans_number->create_unique; # set $form->{ordnumber} or $form->{quonumber} + my $is_new = !$form->{id}; if ($form->{id}) { $query = qq|DELETE FROM custom_variables @@ -753,7 +755,7 @@ SQL customer_id = ?, amount = ?, netamount = ?, reqdate = ?, tax_point = ?, taxincluded = ?, shippingpoint = ?, shipvia = ?, notes = ?, intnotes = ?, currency_id = (SELECT id FROM currencies WHERE name=?), closed = ?, delivered = ?, proforma = ?, quotation = ?, department_id = ?, language_id = ?, - taxzone_id = ?, shipto_id = ?, payment_id = ?, delivery_vendor_id = ?, delivery_customer_id = ?,delivery_term_id = ?, + taxzone_id = ?, shipto_id = ?, billing_address_id = ?, payment_id = ?, delivery_vendor_id = ?, delivery_customer_id = ?,delivery_term_id = ?, globalproject_id = ?, employee_id = ?, salesman_id = ?, cp_id = ?, transaction_description = ?, marge_total = ?, marge_percent = ? , order_probability = ?, expected_billing_date = ? WHERE id = ?|; @@ -768,7 +770,7 @@ SQL $form->{delivered} ? "t" : "f", $form->{proforma} ? 't' : 'f', $quotation, conv_i($form->{department_id}), conv_i($form->{language_id}), conv_i($form->{taxzone_id}), - conv_i($form->{shipto_id}), conv_i($form->{payment_id}), + conv_i($form->{shipto_id}), conv_i($form->{billing_address_id}), conv_i($form->{payment_id}), conv_i($form->{delivery_vendor_id}), conv_i($form->{delivery_customer_id}), conv_i($form->{delivery_term_id}), @@ -832,11 +834,77 @@ SQL config_yaml => $form->{periodic_invoices_config}) if ($form->{type} eq 'sales_order'); + $self->_link_created_sales_order_to_requirement_specs_for_sales_quotations( + type => $form->{type}, + converted_from_ids => \@convert_from_oe_ids, + sales_order_id => $form->{id}, + is_new => $is_new, + ); + + $self->_set_project_in_linked_requirement_spec( + type => $form->{type}, + project_id => $form->{globalproject_id}, + sales_order_id => $form->{id}, + ); + $main::lxdebug->leave_sub(); return 1; } +sub _link_created_sales_order_to_requirement_specs_for_sales_quotations { + my ($self, %params) = @_; + + # If this is a sales order created from a sales quotation and if + # that sales quotation was created from a requirement spec document + # then link the newly created sales order to the requirement spec + # document, too. + + return if !$params{is_new}; + return if $params{type} ne 'sales_order'; + return if !@{ $params{converted_from_ids} }; + + my $oe_objects = SL::DB::Manager::Order->get_all(where => [ id => $params{converted_from_ids} ]); + my @sales_quotations = grep { $_->is_type('sales_quotation') } @{ $oe_objects }; + + return if !@sales_quotations; + + my $rs_orders = SL::DB::Manager::RequirementSpecOrder->get_all(where => [ order_id => [ map { $_->id } @sales_quotations ] ]); + + return if !@{ $rs_orders }; + + $rs_orders->[0]->db->with_transaction(sub { + foreach my $rs_order (@{ $rs_orders }) { + SL::DB::RequirementSpecOrder->new( + order_id => $params{sales_order_id}, + requirement_spec_id => $rs_order->requirement_spec_id, + version_id => $rs_order->version_id, + )->save; + } + + 1; + }); +} + +sub _set_project_in_linked_requirement_spec { + my ($self, %params) = @_; + + return if $params{type} ne 'sales_order'; + return if !$params{project_id} || !$params{sales_order_id}; + + my $query = <get_standard_dbh, $query, $params{project_id}, $params{sales_order_id}); +} + sub save_periodic_invoices_config { my ($self, %params) = @_; @@ -986,7 +1054,12 @@ sub _retrieve { if (!$form->{id}) { my $extra_days = $form->{type} eq 'sales_quotation' ? $::instance_conf->get_reqdate_interval : $form->{type} eq 'sales_order' ? $::instance_conf->get_delivery_date_interval : 1; - $form->{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo; + if ( ($form->{type} eq 'sales_order' && !$::instance_conf->get_deliverydate_on) + || ($form->{type} eq 'sales_quotation' && !$::instance_conf->get_reqdate_on)) { + $form->{reqdate} = ''; + } else { + $form->{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo; + } $form->{transdate} = DateTime->today_local->to_kivitendo; } @@ -1027,7 +1100,7 @@ sub _retrieve { o.closed, o.reqdate, o.tax_point, o.quonumber, o.department_id, o.cusordnumber, o.mtime, o.itime, d.description AS department, o.payment_id, o.language_id, o.taxzone_id, - o.delivery_customer_id, o.delivery_vendor_id, o.proforma, o.shipto_id, + o.delivery_customer_id, o.delivery_vendor_id, o.proforma, o.shipto_id, o.billing_address_id, o.globalproject_id, o.delivered, o.transaction_description, o.delivery_term_id, o.itime::DATE AS insertdate, o.order_probability, o.expected_billing_date FROM oe o @@ -1361,7 +1434,7 @@ sub order_details { partnotes serialnumber reqdate sellprice sellprice_nofmt listprice listprice_nofmt netprice netprice_nofmt discount discount_nofmt p_discount discount_sub discount_sub_nofmt nodiscount_sub nodiscount_sub_nofmt linetotal linetotal_nofmt nodiscount_linetotal nodiscount_linetotal_nofmt tax_rate projectnumber projectdescription - price_factor price_factor_name partsgroup weight weight_nofmt lineweight lineweight_nofmt); + price_factor price_factor_name partsgroup weight weight_nofmt lineweight lineweight_nofmt optional); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; @@ -1428,6 +1501,7 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{price_factor} }, $price_factor->{formatted_factor}; push @{ $form->{TEMPLATE_ARRAYS}->{price_factor_name} }, $price_factor->{description}; push @{ $form->{TEMPLATE_ARRAYS}->{partsgroup} }, $form->{"partsgroup_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{optional} }, $form->{"optional_$i"}; my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); my ($dec) = ($sellprice =~ /\.(\d+)/); @@ -1467,7 +1541,7 @@ sub order_details { $form->{non_separate_subtotal} += $linetotal; } - $form->{ordtotal} += $linetotal; + $form->{ordtotal} += $linetotal unless $form->{"optional_$i"}; $form->{nodiscount_total} += $nodiscount_linetotal; $form->{discount_total} += $discount; @@ -1515,14 +1589,16 @@ sub order_details { map { $taxrate += $form->{"${_}_rate"} } split(/ /, $form->{"taxaccounts_$i"}); - if ($form->{taxincluded}) { + unless ($form->{"optional_$i"}) { + if ($form->{taxincluded}) { - # calculate tax - $taxamount = $linetotal * $taxrate / (1 + $taxrate); - $taxbase = $linetotal / (1 + $taxrate); - } else { - $taxamount = $linetotal * $taxrate; - $taxbase = $linetotal; + # calculate tax + $taxamount = $linetotal * $taxrate / (1 + $taxrate); + $taxbase = $linetotal / (1 + $taxrate); + } else { + $taxamount = $linetotal * $taxrate; + $taxbase = $linetotal; + } } if ($taxamount != 0) {