item_selected: Multiselect bzw. Mengeneingabe beim Artikelselektor
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Thu, 23 Apr 2015 13:20:36 +0000 (15:20 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Thu, 23 Apr 2015 15:05:44 +0000 (17:05 +0200)
Dieses Feature kann in den Benutzereinstellungen aktiviert werden.

12 files changed:
SL/DB/AuthUser.pm
bin/mozilla/do.pl
bin/mozilla/ic.pl
bin/mozilla/io.pl
bin/mozilla/ir.pl
bin/mozilla/is.pl
bin/mozilla/oe.pl
doc/changelog
locale/de/all
locale/en/all
templates/webpages/am/config.html
templates/webpages/io/select_item.html

index 1eac6f9..a8d8ab5 100644 (file)
@@ -11,7 +11,7 @@ use SL::DB::Helper::Util;
 use constant CONFIG_VARS => qw(copies countrycode dateformat timeformat default_media default_printer_id
                                email favorites fax hide_cvar_search_options mandatory_departments menustyle name
                                numberformat show_form_details signature stylesheet taxincluded_checked tel
-                               template_format vclimit focus_position form_cvars_nr_cols);
+                               template_format vclimit focus_position form_cvars_nr_cols item_multiselect);
 
 __PACKAGE__->meta->add_relationship(
   groups => {
index 3f62418..6b37b6c 100644 (file)
@@ -419,7 +419,7 @@ sub update_delivery_order {
 
       if ($rows > 1) {
 
-        select_item(mode => $mode);
+        select_item(mode => $mode, pre_entered_qty => $form->{"qty_$i"});
         ::end_of_request();
 
       } else {
index 1203763..98b4037 100644 (file)
@@ -1845,7 +1845,7 @@ sub update {
 
         if ($rows > 1) {
           $form->{makemodel_rows}--;
-          select_item(mode => 'IC');
+          select_item(mode => 'IC', pre_entered_qty => $form->parse_amount(\%myconfig, $form->{"qty_$i"}));
           ::end_of_request();
         } else {
           map { $form->{item_list}[$i]{$_} =~ s/\"/&quot;/g }
index 4930d25..4a3805d 100644 (file)
@@ -497,8 +497,8 @@ sub select_item {
   $main::lxdebug->enter_sub();
 
   my %params = @_;
-  my $mode   = $params{mode} || croak "Missing parameter 'mode'";
-
+  my $mode            = $params{mode}            || croak "Missing parameter 'mode'";
+  my $pre_entered_qty = $params{pre_entered_qty} || 1;
   _check_io_auth();
 
   my $previous_form = $::auth->save_form_in_session(form => $::form);
@@ -513,11 +513,12 @@ sub select_item {
   # delete action variable
   delete @{$::form}{qw(action item_list)};
 
-  print $::form->parse_html_template('io/select_item', { PREVIOUS_FORM => $previous_form,
-                                                         MODE          => $mode,
-                                                         ITEM_LIST     => \@item_list,
-                                                         IS_ASSEMBLY   => $mode eq 'IC',
-                                                         IS_PURCHASE   => $mode eq 'IS' });
+  print $::form->parse_html_template('io/select_item', { PREVIOUS_FORM   => $previous_form,
+                                                         MODE            => $mode,
+                                                         ITEM_LIST       => \@item_list,
+                                                         IS_ASSEMBLY     => $mode eq 'IC',
+                                                         IS_PURCHASE     => $mode eq 'IS',
+                                                         PRE_ENTERED_QTY => $pre_entered_qty, });
 
   $main::lxdebug->leave_sub();
 }
@@ -536,18 +537,47 @@ sub item_selected {
 
   $::auth->restore_form_from_session($form->{select_item_previous_form} || croak('Missing previous form ID'), form => $form);
 
-  my $mode = delete($form->{select_item_mode}) || croak 'Missing item selection mode';
-  my $id   = delete($form->{select_item_id})   || croak 'Missing item selection ID';
-  my $i    = $form->{ $mode eq 'IC' ? 'assembly_rows' : 'rowcount' };
+  my $mode     = delete($form->{select_item_mode}) || croak 'Missing item selection mode';
+  my $row_key  = $mode eq 'IC' ? 'assembly_rows' : 'rowcount';
+  my $curr_row = $form->{ $row_key };
+
+  my $row = $curr_row;
+
+  if ($myconfig{item_multiselect}) {
+    foreach (grep(/^select_qty_/, keys(%{ $form }))) {
+      next unless $form->{$_};
+      $_ =~ /^select_qty_(\d+)/;
+      $form->{"id_${row}"}  = $1;
+      $form->{"qty_${row}"} = $form->{$_};
+      $row++;
+    }
+  } else {
+    $form->{"id_${row}"} = delete($form->{select_item_id}) || croak 'Missing item selection ID';
+    $row++;
+  }
+
+  map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
+    qw(sellprice listprice weight);
 
   if ( $mode eq 'IC' ) {
     # assembly mode:
-    # the qty variables of the existing assembly items are all still formatted, so we parse them here (1 .. $i-1)
-    # including the qty of the just added part ($i)
-    $form->{"qty_$_"} = $form->parse_amount(\%myconfig, $form->{"qty_$_"}) for (1 .. $i);
+    # the qty variables of the existing assembly items are all still formatted, so we parse them here
+    # including the qty of the just added part
+    $form->{"qty_$_"} = $form->parse_amount(\%myconfig, $form->{"qty_$_"}) for (1 .. $row - 1);
+  } else {
+    if ($myconfig{item_multiselect}) {
+      # other modes and multiselection:
+      # parse all newly entered qtys
+      $form->{"qty_$_"} = $form->parse_amount(\%myconfig, $form->{"qty_$_"}) for ($curr_row .. $row - 1);
+    }
   }
 
-  $form->{"id_${i}"} = $id;
+  for my $i ($curr_row .. $row - 1) {
+    $form->{ $row_key } = $i;
+
+    my $id = $form->{"id_${i}"};
+
+    delete $form->{item_list};
 
   if ($mode eq 'IS') {
     IS->retrieve_item(\%myconfig, \%$form);
@@ -617,9 +647,6 @@ sub item_selected {
     }
   }
 
-  map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
-    qw(sellprice listprice weight);
-
   # at this stage qty of newly added part needs to be have been parsed
   $form->{weight}    += ($form->{"weight_$i"} * $form->{"qty_$i"});
 
@@ -640,14 +667,16 @@ sub item_selected {
 
   $form->{"runningnumber_$i"} = $i;
 
-  delete $form->{nextsub};
-
   # format amounts
   map {
     $form->{"${_}_$i"} =
       $form->format_amount(\%myconfig, $form->{"${_}_$i"}, $decimalplaces)
   } qw(sellprice listprice lastcost qty) if $form->{item} ne 'assembly';
 
+  delete $form->{nextsub};
+
+  }
+
   &display_form;
 
   $main::lxdebug->leave_sub();
index 7176653..731f747 100644 (file)
@@ -492,7 +492,7 @@ sub update {
 
       if ($rows > 1) {
 
-        select_item(mode => 'IR');
+        select_item(mode => 'IR', pre_entered_qty => $form->{"qty_$i"});
         ::end_of_request();
 
       } else {
index cac93da..1f9dd08 100644 (file)
@@ -568,7 +568,7 @@ sub update {
 
       if ($rows > 1) {
 
-        select_item(mode => 'IS');
+        select_item(mode => 'IS', pre_entered_qty => $form->{"qty_$i"});
         ::end_of_request();
 
       } else {
index 147e9d9..7b6796b 100644 (file)
@@ -648,7 +648,7 @@ sub update {
 
       if ($rows > 1) {
 
-        select_item(mode => $mode);
+        select_item(mode => $mode, pre_entered_qty => $form->{"qty_$i"});
         ::end_of_request();
 
       } else {
index 1929012..c2bd155 100644 (file)
@@ -10,6 +10,11 @@ Kleinere neue Features und Detailverbesserungen:
 - Briefe werden auch im WebDAV archiviert. Ferner bessere Fehlerbehandlung und
   E-Mail-Funktion aktiviert.
 
+- Mehrfachauswahl und Mengeneingabe für Artikel:
+  Wenn in den Belegmasken die Artikeleingabe nicht eindeutig ist, erscheint
+  eine Maske zur Artikelauswahl. Hierzu kann jetzt in den Benutzereinstellungen
+  eingestellt werden, dass in dieser Maske mehrere Artikel mit Mengen ausgewählt
+  werden können.
 
 2015-04-10 - Release 3.2.1
 
index f30e33d..f618bd8 100755 (executable)
@@ -1402,6 +1402,7 @@ $self->{texts} = {
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
   'Item deleted!'               => 'Artikel gelöscht!',
   'Item mode'                   => 'Artikelmodus',
+  'Item multi selection with qty' => 'Artikel-Mehrfachauswahl mit Menge',
   'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Item values'                 => 'Artikelwerte',
   'Item variables'              => 'Artikelvariablen',
index 92b6863..76f3009 100644 (file)
@@ -1192,6 +1192,7 @@ $self->{texts} = {
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => '',
   'Item deleted!'               => '',
   'Item mode'                   => '',
+  'Item multi selection with qty' => '',
   'Item not on file!'           => '',
   'Item values'                 => '',
   'Item variables'              => '',
index 13b060a..ac7875b 100644 (file)
         </td>
       </tr>
 
+      <tr>
+        <th align="right">[% 'Item multi selection with qty' | $T8 %]</th>
+        <td>
+          [% L.yes_no_tag('item_multiselect', myconfig_item_multiselect) %]
+        </td>
+      </tr>
+
     </table>
    </div>
 
index 9252b45..11dfbf6 100644 (file)
@@ -5,7 +5,11 @@
 
   <table width="100%">
    <tr class="listheading">
-    <th>&nbsp;</th>
+    [%- IF myconfig_item_multiselect %]
+      <th>[% LxERP.t8('Qty') %]</th>
+    [%- ELSE %]
+      <th>&nbsp;</th>
+    [%- END %]
     <th>[% LxERP.t8('Number') %]</th>
     <th>[% LxERP.t8('Part Description') %]</th>
     <th>[% LxERP.t8('Other Matches') %]</th>
 
    [%- FOREACH item = ITEM_LIST %]
    <tr class="listrow[% loop.count % 2 %]">
-    <td><input name="select_item_id" class="radio" type="radio" value="[% HTML.escape(item.id) %]"[% IF loop.first %] checked[% END %]></td>
+    [%- IF myconfig_item_multiselect %]
+      <td>[% L.input_tag('select_qty_' _ HTML.escape(item.id), '', size => 5) %]</td>
+    [%- ELSE %]
+      <td><input name="select_item_id" class="radio" type="radio" value="[% HTML.escape(item.id) %]"[% IF loop.first %] checked[% END %]></td>
+    [%- END %]
     <td>[% HTML.escape(item.partnumber) %]</td>
     <td>[% HTML.escape(item.description) %]</td>
     <td>[% HTML.escape(item.matches).join('<br>') %]</td>
 
   [% L.submit_tag('action', LxERP.t8('Continue')) %]
  </form>
+
+[%- IF myconfig_item_multiselect %]
+ <script type='text/javascript'>
+   var first_click = 1;;
+   [%- FOREACH item = ITEM_LIST %]
+     [% SET THIS_ID = 'select_qty_' _ HTML.escape(item.id) %]
+     $('#[% THIS_ID %]').click(function(){
+       var qty = '1';
+       if (first_click) {
+         qty = '[% LxERP.format_amount(PRE_ENTERED_QTY, 5) %]';
+       }
+       first_click = 0;
+       if ($('#[% THIS_ID %]').attr('value') == '') {
+         $('#[% THIS_ID %]').attr('value', qty); $('#[% THIS_ID %]').select();
+       }
+     });
+   [%- END %]
+ </script>
+[%- END %]