S/D/Order: new_from/new_from_multi: Bearbeiter ist immer der aktuelle Benutzer
[kivitendo-erp.git] / bin / mozilla / do.pl
index dec786a..6adf190 100644 (file)
@@ -241,6 +241,12 @@ sub setup_do_action_bar {
   my @req_trans_desc = qw(kivi.SalesPurchase.check_transaction_description) x!!$::instance_conf->get_require_transaction_description_ps;
   my $is_customer    = $::form->{vc} eq 'customer';
 
+  my $undo_date  = DateTime->today->subtract(days => $::instance_conf->get_undo_transfer_interval);
+  my $insertdate = DateTime->from_kivitendo($::form->{insertdate});
+  my $undo_transfer  = 0;
+  if (ref $undo_date eq 'DateTime' && ref $insertdate eq 'DateTime') {
+    $undo_transfer = $insertdate > $undo_date;
+  }
   for my $bar ($::request->layout->get('actionbar')) {
     $bar->add(
       action =>
@@ -314,6 +320,13 @@ sub setup_do_action_bar {
           disabled => $::form->{delivered} ? t8('This record has already been delivered.') : undef,
           only_if  => !$is_customer && $::instance_conf->get_transfer_default,
         ],
+        action => [
+          t8('Undo Transfer'),
+          submit   => [ '#form', { action => "delete_transfers" } ],
+          checks   => [ 'kivi.validate_form' ],
+          only_if  => $::form->{delivered},
+          disabled => !$undo_transfer ? t8('Transfer date exceeds the maximum allowed interval.') : undef,
+        ],
       ], # end of combobox "Transfer out"
 
 
@@ -911,6 +924,12 @@ sub save {
   remove_emptied_rows();
   validate_items();
 
+  # check for serial number if part needs one
+  for my $i (1 .. $form->{rowcount} - 1) {
+    next unless $form->{"has_sernumber_$i"};
+    $form->isblank("serialnumber_$i",
+                   $locale->text('Serial Number missing in Row') . " $i");
+  }
   # if the name changed get new values
   my $vc = $form->{vc};
   if (($form->{"previous_${vc}_id"} || $form->{"${vc}_id"}) != $form->{"${vc}_id"}) {
@@ -924,7 +943,20 @@ sub save {
   }
 
   $form->{id} = 0 if $form->{saveasnew};
-
+  # we rely on converted_from_orderitems, if the workflow is used
+  # be sure that at least one position is linked to the original orderitem
+  if ($form->{convert_from_oe_ids}) {
+    my $has_linked_pos;
+    for my $i (1 .. $form->{rowcount}) {
+      if ($form->{"converted_from_orderitems_id_$i"}) {
+        $has_linked_pos = 1;
+        last;
+      }
+    }
+    if (!$has_linked_pos) {
+      $form->error($locale->text('Need at least one original position for the workflow Order to Delivery Order!'));
+    }
+  }
   DO->save();
   # saving the history
   if(!exists $form->{addition}) {
@@ -969,6 +1001,37 @@ sub delete {
 
   $main::lxdebug->leave_sub();
 }
+sub delete_transfers {
+  $main::lxdebug->enter_sub();
+
+  check_do_access();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+  my $ret;
+
+  die "Invalid form type" unless $form->{type} =~ m/^(sales|purchase)_delivery_order$/;
+
+  if ($ret = DO->delete_transfers()) {
+    # saving the history
+    if(!exists $form->{addition}) {
+      $form->{snumbers} = qq|donumber_| . $form->{donumber};
+      $form->{addition} = "UNDO TRANSFER";
+      $form->save_history;
+    }
+    # /saving the history
+
+    flash_later('info', $locale->text("Transfer undone."));
+
+    $form->{callback} = 'do.pl?action=edit&type=' . $form->{type} . '&id=' . $form->escape($form->{id});
+    $form->redirect;
+  }
+
+  $form->error($locale->text('Cannot undo delivery order transfer!') . $ret);
+
+  $main::lxdebug->leave_sub();
+}
 
 sub invoice {
   $main::lxdebug->enter_sub();
@@ -1579,6 +1642,7 @@ sub transfer_in {
 
   SL::DB::DeliveryOrder->new(id => $form->{id})->load->update_attributes(delivered => 1);
 
+  flash_later('info', $locale->text("Transfer successful"));
   $form->{callback} = 'do.pl?action=edit&type=purchase_delivery_order&id=' . $form->escape($form->{id});
   $form->redirect;
 
@@ -1697,6 +1761,7 @@ sub transfer_out {
 
   SL::DB::DeliveryOrder->new(id => $form->{id})->load->update_attributes(delivered => 1);
 
+  flash_later('info', $locale->text("Transfer successful"));
   $form->{callback} = 'do.pl?action=edit&type=sales_delivery_order&id=' . $form->escape($form->{id});
   $form->redirect;