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;
qq| o.marge_total, o.marge_percent, | .
qq| o.exchangerate, | .
qq| o.itime::DATE AS insertdate, | .
+ qq| o.intnotes, | .
qq| department.description as department, | .
qq| ex.$rate AS daily_exchangerate, | .
qq| pt.description AS payment_terms, | .
push @values, conv_date($form->{expected_billing_date_to});
}
+ if ($form->{intnotes}) {
+ $query .= qq| AND o.intnotes ILIKE ?|;
+ push(@values, like($form->{intnotes}));
+ }
+
if ($form->{parts_partnumber}) {
$query .= <<SQL;
AND EXISTS (
"taxzone" => "tz.description",
"payment_terms" => "pt.description",
"department" => "department.description",
+ "intnotes" => "o.intnotes",
);
if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) {
$sortorder = $allowed_sort_columns{$form->{sort}} . " ${sortdir}" . ", o.itime ${sortdir}";
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
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 = ?|;
$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}),
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 = <<SQL;
+ UPDATE requirement_specs
+ SET project_id = ?
+ WHERE id IN (
+ SELECT so.requirement_spec_id
+ FROM requirement_spec_orders so
+ WHERE so.order_id = ?
+ )
+SQL
+
+ do_query($::form, $::form->get_standard_dbh, $query, $params{project_id}, $params{sales_order_id});
+}
+
sub save_periodic_invoices_config {
my ($self, %params) = @_;
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;
}
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
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 };
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+)/);
$form->{non_separate_subtotal} += $linetotal;
}
- $form->{ordtotal} += $linetotal;
+ $form->{ordtotal} += $linetotal unless $form->{"optional_$i"};
$form->{nodiscount_total} += $nodiscount_linetotal;
$form->{discount_total} += $discount;
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) {