Bei Artikelauswahl nur ID als Hidden mitschleifen, nicht alle Artikeldetails
authorMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 16 Jun 2011 10:11:15 +0000 (12:11 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 16 Jun 2011 10:16:12 +0000 (12:16 +0200)
Fix für Bug 1670.

SL/IC.pm
SL/IR.pm
SL/IS.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

index 8dc673b..bad463e 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -703,6 +703,11 @@ sub assembly_item {
     push(@values, '%' . $form->{"${column}_$i"} . '%');
   }
 
+  if ($form->{"id_${i}"}) {
+    $where .= qq| AND p.id = ?|;
+    push @values, $form->{"id_${i}"};
+  }
+
   if ($form->{id}) {
     $where .= qq| AND NOT (p.id = ?)|;
     push(@values, conv_i($form->{id}));
index 86b1323..f87cdf8 100644 (file)
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -158,7 +158,7 @@ sub post_invoice {
       $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} / $price_factor, 2);
 
       if ($form->{taxincluded}) {
-        
+
         $taxamount              = $linetotal * ($taxrate / (1 + $taxrate));
         $form->{"sellprice_$i"} = $form->{"sellprice_$i"} * (1 / (1 + $taxrate));
 
@@ -388,7 +388,7 @@ sub post_invoice {
     # income accounts, it is enough to add the total rounding error to one of
     # the income accounts, with the one assigned to the last row being used
     # (lastinventoryaccno)
-    
+
     # in the purchase invoice case rounding errors may be split between
     # inventory accounts and expense accounts. After rounding, an error of 1
     # cent is introduced if the total rounding error exceeds 0.005. The total
@@ -1067,6 +1067,11 @@ sub retrieve_item {
       push @values, $form->{"partnumber_$i"};
    }
 
+  if ($form->{"id_${i}"}) {
+    $where .= qq| AND p.id = ?|;
+    push @values, $form->{"id_${i}"};
+  }
+
   if ($form->{"description_$i"}) {
     $where .= " ORDER BY p.description";
   } else {
index 689c779..3210b12 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -1778,6 +1778,11 @@ sub retrieve_item {
     push @values, $form->{"partnumber_$i"};
   }
 
+  if ($form->{"id_${i}"}) {
+    $where .= qq| AND p.id = ?|;
+    push @values, $form->{"id_${i}"};
+  }
+
   if ($form->{"description_$i"}) {
     $where .= qq| ORDER BY p.description|;
   } else {
index e95aaf8..54c650c 100644 (file)
@@ -364,10 +364,13 @@ sub update_delivery_order {
 
   } else {
 
+    my $mode;
     if ($form->{type} eq 'purchase_delivery_order') {
       IR->retrieve_item(\%myconfig, $form);
+      $mode = 'IR';
     } else {
       IS->retrieve_item(\%myconfig, $form);
+      $mode = 'IS';
     }
 
     my $rows = scalar @{ $form->{item_list} };
@@ -377,7 +380,7 @@ sub update_delivery_order {
 
       if ($rows > 1) {
 
-        select_item();
+        select_item(mode => $mode);
         ::end_of_request();
 
       } else {
index 2976a49..28bc105 100644 (file)
@@ -1728,7 +1728,7 @@ sub update {
 
         if ($rows > 1) {
           $form->{makemodel_rows}--;
-          &select_item;
+          select_item(mode => 'IC');
           ::end_of_request();
         } else {
           map { $form->{item_list}[$i]{$_} =~ s/\"/&quot;/g }
index 866e5ec..c65d742 100644 (file)
@@ -36,6 +36,7 @@
 #
 #######################################################################
 
+use Carp;
 use CGI;
 use CGI::Ajax;
 use List::Util qw(min max first);
@@ -437,13 +438,16 @@ sub set_pricegroup {
 sub select_item {
   $main::lxdebug->enter_sub();
 
+  my %params   = @_;
+
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
   my $locale   = $main::locale;
   my $cgi      = $main::cgi;
 
-# diese variable kommt schon in der methode display_row vor, kann man die besser wiederverwenden? @mb fragen.  ich check das jetzt erstmal so ein
-  my $is_purchase        = (first { $_ eq $form->{type} } qw(request_quotation purchase_order purchase_delivery_order)) || ($form->{script} eq 'ir.pl');
+  my $mode        = $params{mode} || croak "Missing parameter 'mode'";
+  my $is_purchase = $mode eq 'IS';
+
   _check_io_auth();
 
   my @column_index = qw(ndx partnumber description rop onhand unit sellprice);
@@ -455,10 +459,10 @@ sub select_item {
     qq|<th class="listheading">| . $locale->text('Part Description') . qq|</th>|;
   $column_data{sellprice} =
     qq|<th class="listheading">| . $locale->text('Price') . qq|</th>|;
-    if ($is_purchase){
-      $column_data{rop} =
-      qq|<th class="listheading">| . $locale->text('ROP') . qq|</th>|;
-    }# ende if $is_purchase -> Überschrift Mindestlagerbestand - ähnliche Prüfung weiter unten
+  if ($is_purchase){
+    $column_data{rop} =
+    qq|<th class="listheading">| . $locale->text('ROP') . qq|</th>|;
+  }# ende if $is_purchase -> Überschrift Mindestlagerbestand - ähnliche Prüfung weiter unten
   $column_data{onhand} =
     qq|<th class="listheading">| . $locale->text('Qty') . qq|</th>|;
   $column_data{unit} =
@@ -485,13 +489,6 @@ sub select_item {
 
   print qq|</tr>|;
 
-  my @new_fields =
-    qw(bin listprice inventory_accno income_accno expense_accno unit weight
-       assembly taxaccounts partsgroup formel longdescription not_discountable
-       part_payment_id partnotes id lastcost price_factor_id price_factor);
-  push @new_fields, "lizenzen" if $::lx_office_conf{features}->{lizenzen};
-  push @new_fields, grep { m/^ic_cvar_/ } keys %{ $form->{item_list}->[0] };
-
   my $i = 0;
   my $j;
   foreach my $ref (@{ $form->{item_list} }) {
@@ -509,34 +506,24 @@ sub select_item {
       }
     }
 
-    map { $ref->{$_} =~ s/\"/&quot;/g } qw(partnumber description unit);
-
     my $display_sellprice  = $ref->{sellprice} * (1 - $form->{tradediscount});
     $display_sellprice    /= $ref->{price_factor} if ($ref->{price_factor});
     $display_sellprice     = $form->format_amount(\%myconfig, $display_sellprice, 2);
+    my $new_id             = $ref->{id};
+
+    map { $ref->{$_} = H($ref->{$_}) } qw(id partnumber description unit);
+
+    $column_data{ndx}         = qq|<td><input name="select_item_id" class="radio" type="radio" value="${new_id}" $checked></td>|;
+    $column_data{partnumber}  = qq|<td>$ref->{partnumber}</td>|;
+    $column_data{description} = qq|<td>$ref->{description}</td>|;
+    $column_data{sellprice}   = qq|<td align="right">${display_sellprice}</td>|;
+    $column_data{onhand}      = qq|<td align="right">| . $form->format_amount(\%myconfig, $ref->{onhand}, '', "&nbsp;") . qq|</td>|;
+    $column_data{unit}        = qq|<td>$ref->{unit}</td>|;
 
-    $column_data{ndx} =
-      qq|<td><input name="ndx" class="radio" type="radio" value="$i" $checked></td>|;
-    $column_data{partnumber} =
-      qq|<td><input name="new_partnumber_$i" type="hidden" value="$ref->{partnumber}">$ref->{partnumber}</td>|;
-    $column_data{description} =
-      qq|<td><input name="new_description_$i" type="hidden" value="$ref->{description}">$ref->{description}</td>|;
-    $column_data{sellprice} =
-      qq|<td align="right"><input name="new_sellprice_$i" type="hidden" value="$ref->{sellprice}">|
-      . $display_sellprice
-      . qq|</td>|;
-    $column_data{onhand} =
-      qq|<td align="right"><input name="new_onhand_$i" type="hidden" value="$ref->{onhand}">|
-      . $form->format_amount(\%myconfig, $ref->{onhand}, '', "&nbsp;")
-      . qq|</td>|;
     if ($is_purchase){
-    $column_data{rop} =
-      qq|<td align="right"><input name="new_rop$i" type="hidden" value="$ref->{rop}">|
-      . $form->format_amount(\%myconfig, $ref->{rop}, '', "&nbsp;")
-      . qq|</td>|;
+      $column_data{rop}       = qq|<td align="right">| . $form->format_amount(\%myconfig, $ref->{rop}, '', "&nbsp;") . qq|</td>|;
     }# ende if $is_purchase -> Falls der Aufruf über eine Einkaufsmaske kam, handelt es sich um einen Lieferantenauftrag und uns interessiert auch die Mindestbestandsmenge
-    $column_data{unit} =
-      qq|<td>$ref->{unit}</td>|;
+
     $j++;
     $j %= 2;
     print qq|
@@ -545,30 +532,21 @@ sub select_item {
     map { print "\n$column_data{$_}" } @column_index;
 
     print("</tr>\n");
-
-    print join "\n", map { $cgi->hidden("-name" => "new_${_}_$i", "-value" => $ref->{$_}) } @new_fields;
-    print "\n";
   }
 
   print qq|
 <tr><td colspan="8"><hr size="3" noshade></td></tr>
 </table>
-
-<input name="lastndx" type="hidden" value="$i">
-
 |;
 
   # delete action variable
   map { delete $form->{$_} } qw(action item_list header);
 
-  # save all other form variables
-  foreach my $key (keys %${form}) {
-    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
-    $form->{$key} =~ s/\"/&quot;/g;
-    print qq|<input name="$key" type="hidden" value="$form->{$key}">\n|;
-  }
+  my $previous_form = $::auth->save_form_in_session(form => $form);
 
   print qq|
+<input name="select_item_mode" type="hidden" value="$mode">
+<input name="select_item_previous_form" type="hidden" value="${previous_form}">
 <input type="hidden" name="nextsub" value="item_selected">
 
 <br>
@@ -591,16 +569,25 @@ sub item_selected {
 
   _check_io_auth();
 
-  # replace the last row with the checked row
-  my $i = $form->{rowcount};
-  $i = $form->{assembly_rows} if ($form->{item} eq 'assembly');
+  $::auth->restore_form_from_session($form->{select_item_previous_form} || croak('Missing previous form ID'), form => $form);
 
-  # index for new item
-  my $j = $form->{ndx};
+  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' };
 
-  #sk
-  #($form->{"sellprice_$i"},$form->{"$pricegroup_old_$i"}) = split /--/, $form->{"sellprice_$i"};
-  #$form->{"sellprice_$i"} = $form->{"sellprice_$i"};
+  $form->{"id_${i}"} = $id;
+
+  if ($mode eq 'IS') {
+    IS->retrieve_item(\%myconfig, \%$form);
+  } elsif ($mode eq 'IR') {
+    IR->retrieve_item(\%myconfig, \%$form);
+  } elsif ($mode eq 'IC') {
+    IC->assembly_item(\%myconfig, \%$form);
+  } else {
+    croak "Invalid item selection mode '${mode}'";
+  }
+
+  my $new_item = $form->{item_list}->[0] || croak "No item found for mode '${mode}' and ID '${id}'";
 
   # if there was a price entered, override it
   my $sellprice = $form->parse_amount(\%myconfig, $form->{"sellprice_$i"});
@@ -611,21 +598,19 @@ sub item_selected {
        partsgroup formel longdescription not_discountable partnotes lastcost
        price_factor_id price_factor);
 
+  push @new_fields, 'lizenzen' if $::lx_office_conf{features}->{lizenzen};
+
   my $ic_cvar_configs = CVar->get_configs(module => 'IC');
   push @new_fields, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs };
 
-  map { $form->{"${_}_$i"} = $form->{"new_${_}_$j"} } @new_fields;
+  map { $form->{"${_}_$i"} = $new_item->{$_} } @new_fields;
 
-  $form->{"marge_price_factor_$i"} = $form->{"new_price_factor_$j"};
+  $form->{"marge_price_factor_$i"} = $new_item->{price_factor};
 
   if ($form->{"part_payment_id_$i"} ne "") {
     $form->{payment_id} = $form->{"part_payment_id_$i"};
   }
 
-  if ($::lx_office_conf{features}->{lizenzen}) {
-    map { $form->{"${_}_$i"} = $form->{"new_${_}_$j"} } qw(lizenzen);
-  }
-
   my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
   $dec           = length $dec;
   my $decimalplaces = ($dec > 2) ? $dec : 2;
@@ -665,12 +650,7 @@ sub item_selected {
 
   $form->{"runningnumber_$i"} = $i;
 
-  # delete all the new_ variables
-  for $i (1 .. $form->{lastndx}) {
-    map { delete $form->{"new_${_}_$i"} } @new_fields;
-  }
-
-  map { delete $form->{$_} } qw(ndx lastndx nextsub);
+  delete $form->{nextsub};
 
   # format amounts
   map {
index 1f18c1f..fab18f7 100644 (file)
@@ -229,7 +229,7 @@ sub prepare_invoice {
       # übernommen aus is.pl Fix für Bug 1642. Nebenwirkungen? jb 12.5.2011
       # getestet: Lieferantenauftrag -> Rechnung i.O.
       #           Lieferantenauftrag -> Lieferschein -> Rechnung i.O.
-      # Werte: 20% (Lieferantenrabatt), 12,4% individuell und 0,4 individuell s.a. 
+      # Werte: 20% (Lieferantenrabatt), 12,4% individuell und 0,4 individuell s.a.
       # Screenshot zu Bug 1642
       $form->{"discount_$i"}   = $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100);
 
@@ -481,7 +481,7 @@ sub update {
 
       if ($rows > 1) {
 
-        &select_item;
+        select_item(mode => 'IR');
         ::end_of_request();
 
       } else {
index 2d833b6..3945d7f 100644 (file)
@@ -523,7 +523,7 @@ sub update {
 
       if ($rows > 1) {
 
-        &select_item;
+        select_item(mode => 'IS');
         ::end_of_request();
 
       } else {
index 5b1bc51..a7e95a6 100644 (file)
@@ -550,10 +550,13 @@ sub update {
     &check_form;
   } else {
 
+    my $mode;
     if ($form->{type} =~ /^sales/) {
       IS->retrieve_item(\%myconfig, \%$form);
+      $mode = 'IS';
     } else {
       IR->retrieve_item(\%myconfig, \%$form);
+      $mode = 'IR';
     }
 
     my $rows = scalar @{ $form->{item_list} };
@@ -571,7 +574,7 @@ sub update {
 
       if ($rows > 1) {
 
-        &select_item;
+        select_item(mode => $mode);
         ::end_of_request();
 
       } else {