Implementiert FB0017 Position nach Art.Nummer in Lieferschein sortieren
authorJan Büren <jan@kivitendo-premium.de>
Tue, 22 Sep 2015 08:22:36 +0000 (10:22 +0200)
committerJan Büren <jan@kivitendo-premium.de>
Mon, 5 Oct 2015 15:40:33 +0000 (17:40 +0200)
Ab dem Status Verkaufs-Lieferschein können die Positionen nach Artikelnummern sortiert werden,
 sodass diese Sortierreihenfolge in die Rechnung übernommen wird.
Implementierung mit Natural Sort, d.h. Buchstaben und Zahlen können gemischt sein.

Aktion kann entweder über einen Knopf ausgelöst werden oder wird standardmässig bei jedem Speichern ausgeführt.
Aktuell heißt der Knopf: Sortieren und Speichern und erscheint sobald, der Lieferschein persisitente
Positionen in der DB hat.

bin/mozilla/do.pl
locale/de/all
templates/webpages/do/form_footer.html

index 1f9419b..4b8ead6 100644 (file)
@@ -42,6 +42,7 @@ use SL::IS;
 use SL::MoreCommon qw(ary_diff);
 use SL::ReportGenerator;
 use SL::WH;
+use Sort::Naturally;
 require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/invoice_io.pl";
@@ -1542,7 +1543,7 @@ sub dispatcher {
   my $form     = $main::form;
   my $locale   = $main::locale;
 
-  foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_out_default
+  foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_out_default sort
                          transfer_in transfer_in_default mark_closed save_as_new invoice delete)) {
     if ($form->{"action_${action}"}) {
       call_sub($action);
@@ -1724,3 +1725,36 @@ sub transfer_in_out_default {
   $form->redirect;
 
 }
+sub sort {
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %temp_hash;
+
+  croak ("Delivery Order needs to be saved") unless $form->{id};
+
+  # hashify partnumbers, positions. key is delivery_order_items_id
+  for my $i (1 .. ($form->{rowcount}) ) {
+    $temp_hash{$form->{"delivery_order_items_id_$i"}} = { runningnumber => $form->{"runningnumber_$i"}, partnumber => $form->{"partnumber_$i"} };
+  }
+  # naturally sort partnumbers and get a sorted array of doi_ids
+  my @sorted_doi_ids =  sort { ncmp($temp_hash{$a}->{"partnumber"}, $temp_hash{$b}->{"partnumber"}) }  keys %temp_hash;
+
+  #$main::lxdebug->message(0, 'sortiert, vorher :' . Dumper(%temp_hash));
+  #$main::lxdebug->message(0, 'sortiert, nachher:' . Dumper(@sorted_doi_ids));
+
+  my $new_number = 1;
+  for (@sorted_doi_ids) {
+    # reposition old runningnumber with the new order 1 .. n
+    $form->{"runningnumber_$temp_hash{$_}->{runningnumber}"} = $new_number;
+
+    #$main::lxdebug->message(0, 'hier jetzt:' . 'ferner' . $temp_hash{$_}->{runningnumber} .
+    # 'mit' . $form->{"runningnumber_{$temp_hash{$_}->{runningnumber}}"}); #" = $new_number;
+
+    $new_number++;
+  }
+    # update or save directly
+    # update_delivery_order;
+    $main::lxdebug->leave_sub();
+    save();
+}
index 59c92b9..f07e209 100755 (executable)
@@ -2471,6 +2471,7 @@ $self->{texts} = {
   'Soldtotal does not make sense without any bsooqr options' => 'Option "Menge in gewählten Belegen" ohne gewählte Belege wird ignoriert.',
   'Solution'                    => 'Lösung',
   'Sort By'                     => 'Sortiert nach',
+  'Sort and Save'               => 'Sortieren und Speichern',
   'Source'                      => 'Beleg',
   'Source BIC'                  => 'Quell-BIC',
   'Source IBAN'                 => 'Quell-IBAN',
index 6c8e0c6..67f631e 100644 (file)
@@ -92,6 +92,7 @@
    [%- END %]
    [%- END %]
    [%- IF id %]
+    <input class="submit" type="submit" name="action_sort" id="sort_button" value="[% 'Sort and Save' | $T8 %]">
      <input type="button" class="submit" onclick="follow_up_window()" value="[% 'Follow-Up' | $T8 %]">
    [%- UNLESS closed %]
    <input class="submit" type="submit" name="action_mark_closed" value="[% 'Mark closed' | $T8 %]" data-require-transaction-description="[% INSTANCE_CONF.get_require_transaction_description_ps %]">