use SL::PriceSource;
use SL::Webdav;
use SL::File;
-
+use SL::Util qw(trim);
use SL::DB::Order;
use SL::DB::Default;
use SL::DB::Unit;
__PACKAGE__->run_before('_check_auth');
__PACKAGE__->run_before('_recalc',
- only => [ qw(save save_and_delivery_order save_and_invoice print create_pdf send_email) ]);
+ only => [ qw(save save_as_new save_and_delivery_order save_and_invoice print create_pdf send_email) ]);
__PACKAGE__->run_before('_get_unalterable_data',
- only => [ qw(save save_and_delivery_order save_and_invoice print create_pdf send_email) ]);
+ only => [ qw(save save_as_new save_and_delivery_order save_and_invoice print create_pdf send_email) ]);
#
# actions
my ($self) = @_;
$self->order->transdate(DateTime->now_local());
- $self->order->reqdate(DateTime->today_local->next_workday) if !$self->order->reqdate;
+ my $extra_days = $self->type eq _sales_quotation_type() ? $::instance_conf->get_reqdate_interval : 1;
+ $self->order->reqdate(DateTime->today_local->next_workday(extra_days => $extra_days)) if !$self->order->reqdate;
$self->_pre_render();
$self->render(
$self->redirect_to(@redirect_params);
}
+# save the order as new document an open it for edit
+sub action_save_as_new {
+ my ($self) = @_;
+
+ my $order = $self->order;
+
+ if (!$order->id) {
+ $self->js->flash('error', t8('This object has not been saved yet.'));
+ return $self->js->render();
+ }
+
+ # load order from db to check if values changed
+ my $saved_order = SL::DB::Order->new(id => $order->id)->load;
+
+ my %new_attrs;
+ # Lets assign a new number if the user hasn't changed the previous one.
+ # If it has been changed manually then use it as-is.
+ $new_attrs{number} = (trim($order->number) eq $saved_order->number)
+ ? ''
+ : trim($order->number);
+
+ # Clear transdate unless changed
+ $new_attrs{transdate} = ($order->transdate == $saved_order->transdate)
+ ? DateTime->today_local
+ : $order->transdate;
+
+ # Set new reqdate unless changed
+ if ($order->reqdate == $saved_order->reqdate) {
+ my $extra_days = $self->type eq _sales_quotation_type() ? $::instance_conf->get_reqdate_interval : 1;
+ $new_attrs{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days);
+ } else {
+ $new_attrs{reqdate} = $order->reqdate;
+ }
+
+ # Update employee
+ $new_attrs{employee} = SL::DB::Manager::Employee->current;
+
+ # Create new record from current one
+ $self->order(SL::DB::Order->new_from($order, destination_type => $order->type, attributes => \%new_attrs));
+
+ # no linked records on save as new
+ delete $::form->{$_} for qw(converted_from_oe_id converted_from_orderitems_ids);
+
+ # save
+ $self->action_save();
+}
+
# print the order
#
# This is called if "print" is pressed in the print dialog.
$self->js
->replaceWith('#order_cp_id', $self->build_contact_select)
->replaceWith('#order_shipto_id', $self->build_shipto_select)
+ ->replaceWith('#business_info_row', $self->build_business_info_row)
->val( '#order_taxzone_id', $self->order->taxzone_id)
->val( '#order_taxincluded', $self->order->taxincluded)
->val( '#order_payment_id', $self->order->payment_id)
);
}
+# render the info line for business
+#
+# Needed, if customer/vendor changed.
+sub build_business_info_row
+{
+ $_[0]->p->render('order/tabs/_business_info_row', SELF => $_[0]);
+}
+
# build the rows for displaying taxes
#
# Called if amounts where recalculated and redisplayed.
combobox => [
action => [
t8('Save'),
- call => [ 'kivi.Order.save', $::instance_conf->get_order_warn_duplicate_parts ],
+ call => [ 'kivi.Order.save', 'save', $::instance_conf->get_order_warn_duplicate_parts ],
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
],
+ action => [
+ t8('Save as new'),
+ call => [ 'kivi.Order.save', 'save_as_new', $::instance_conf->get_order_warn_duplicate_parts ],
+ checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
+ disabled => !$self->order->id ? t8('This object has not been saved yet.') : undef,
+ ],
action => [
t8('Save and Delivery Order'),
- call => [ 'kivi.Order.save_and_delivery_order', $::instance_conf->get_order_warn_duplicate_parts ],
+ call => [ 'kivi.Order.save', 'save_and_delivery_order', $::instance_conf->get_order_warn_duplicate_parts ],
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
only_if => (any { $self->type eq $_ } (_sales_order_type(), _purchase_order_type()))
],
action => [
t8('Save and Invoice'),
- call => [ 'kivi.Order.save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ],
+ call => [ 'kivi.Order.save', 'save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ],
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
],
], # end of combobox "Save"
],
action => [
t8('Sales Order'),
- submit => [ '#order_form', { action => "Order/sales_order" } ],
- only_if => (any { $self->type eq $_ } (_sales_quotation_type())),
+ submit => [ '#order_form', { action => "Order/sales_order" } ],
+ only_if => (any { $self->type eq $_ } (_sales_quotation_type())),
+ disabled => !$self->order->id ? t8('This object has not been saved yet.') : undef,
],
action => [
t8('Purchase Order'),
- submit => [ '#order_form', { action => "Order/purchase_order" } ],
- only_if => (any { $self->type eq $_ } (_request_quotation_type())),
+ submit => [ '#order_form', { action => "Order/purchase_order" } ],
+ only_if => (any { $self->type eq $_ } (_request_quotation_type())),
+ disabled => !$self->order->id ? t8('This object has not been saved yet.') : undef,
],
], # end of combobox "Workflow"
=over 4
+=item * C<template/webpages/order/tabs/_business_info_row.html>
+
+For displaying information on business type
+
=item * C<template/webpages/order/tabs/_item_input.html>
The input line for items