]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/Order.pm
Update .htaccess for Apache 2.4 to avoid mod_access_compat dependency
[mfinanz.git] / SL / Controller / Order.pm
index f3063f9f7610dd939c1142a9bc2bcf773565cd24..b3477b2e3d2652d1575f6173c29205c9b2ebfd9f 100644 (file)
@@ -10,7 +10,7 @@ use SL::SessionFile::Random;
 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;
@@ -42,10 +42,10 @@ use Rose::Object::MakeMethods::Generic
 __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
@@ -133,6 +133,41 @@ sub action_save {
   $self->redirect_to(@redirect_params);
 }
 
+# save the order as new document an open it for edit
+sub action_save_as_new {
+  my ($self) = @_;
+
+  if (!$self->order->id) {
+    $self->js->flash('error', t8('This object has not been saved yet.'));
+    return $self->js->render();
+  }
+
+  delete $::form->{$_} for qw(closed delivered converted_from_oe_id converted_from_orderitems_ids);
+
+  my $src_order = SL::DB::Order->new(id => $self->order->id)->load;
+
+  # 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.
+  if (trim($self->order->number) eq $src_order->number) {
+    $self->order->number('');
+  }
+
+  # Clear reqdate and transdate unless changed
+  if ($self->order->transdate == $src_order->transdate) {
+    $self->order->transdate(DateTime->today_local)
+  }
+  if ($self->order->reqdate == $src_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));
+  }
+
+  # Update employee
+  $self->order->employee(SL::DB::Manager::Employee->current);
+
+  # save
+  $self->action_save();
+}
+
 # print the order
 #
 # This is called if "print" is pressed in the print dialog.
@@ -559,6 +594,7 @@ sub action_customer_vendor_changed {
   $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)
@@ -981,6 +1017,14 @@ sub build_shipto_select {
   );
 }
 
+# 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.
@@ -1360,18 +1404,24 @@ sub _setup_edit_action_bar {
       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"
@@ -1382,13 +1432,15 @@ sub _setup_edit_action_bar {
         ],
         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"
 
@@ -1652,6 +1704,10 @@ reused from generic code.
 
 =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