Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 7942a6ac

Von Moritz Bunkus vor mehr als 15 Jahren hinzugefügt

  • ID 7942a6ac9cfc05130a69c2b632367d4983fb94a3
  • Vorgänger d1f932ad
  • Nachfolger 691ad25a

Bessere Abfragen und (Fehler-)Meldungen bei Preisupdates.

Fix für Bugs 480.

Unterschiede anzeigen:

SL/IC.pm
997 997
  $main::lxdebug->leave_sub();
998 998
}
999 999

  
1000
sub update_prices {
1000
sub _create_filter_for_priceupdate {
1001 1001
  $main::lxdebug->enter_sub();
1002 1002

  
1003
  my ($self, $myconfig, $form) = @_;
1003
  my $self     = shift;
1004
  my $myconfig = \%main::myconfig;
1005
  my $form     = $main::form;
1006

  
1004 1007
  my @where_values;
1005 1008
  my $where = '1 = 1';
1006
  my $var;
1007 1009

  
1008
  my $group;
1009
  my $limit;
1010
  foreach my $item (qw(partnumber drawing microfiche make model pg.partsgroup)) {
1011
    my $column = $item;
1012
    $column =~ s/.*\.//;
1013
    next unless ($form->{$column});
1010 1014

  
1011
  if ($item ne 'make') {
1012
    foreach my $item (qw(partnumber drawing microfiche make model pg.partsgroup)) {
1013
      my $column = $item;
1014
      $column =~ s/.*\.//;
1015
      next unless ($form->{$column});
1016
      $where .= qq| AND $item ILIKE ?|;
1017
      push(@where_values, '%' . $form->{$column} . '%');
1018
    }
1015
    $where .= qq| AND $item ILIKE ?|;
1016
    push(@where_values, '%' . $form->{$column} . '%');
1019 1017
  }
1020 1018

  
1021
  # special case for description
1022
  if ($form->{description}
1023
      && !(   $form->{bought}  || $form->{sold} || $form->{onorder}
1024
           || $form->{ordered} || $form->{rfq} || $form->{quoted})) {
1025
    $where .= qq| AND (p.description ILIKE ?)|;
1026
    push(@where_values, '%' . $form->{description} . '%');
1027
  }
1019
  foreach my $item (qw(description serialnumber)) {
1020
    next unless ($form->{$item});
1028 1021

  
1029
  # special case for serialnumber
1030
  if ($form->{l_serialnumber} && $form->{serialnumber}) {
1031
    $where .= qq| AND serialnumber ILIKE ?|;
1032
    push(@where_values, '%' . $form->{serialnumber} . '%');
1022
    $where .= qq| AND (${item} ILIKE ?)|;
1023
    push(@where_values, '%' . $form->{$item} . '%');
1033 1024
  }
1034 1025

  
1035 1026

  
1036 1027
  # items which were never bought, sold or on an order
1037 1028
  if ($form->{itemstatus} eq 'orphaned') {
1038
    $form->{onhand}  = $form->{short}   = 0;
1039
    $form->{bought}  = $form->{sold}    = 0;
1040
    $form->{onorder} = $form->{ordered} = 0;
1041
    $form->{rfq}     = $form->{quoted}  = 0;
1042

  
1043
    $form->{transdatefrom} = $form->{transdateto} = "";
1044

  
1045 1029
    $where .=
1046 1030
      qq| AND (p.onhand = 0)
1047 1031
          AND p.id NOT IN
......
1052 1036
              UNION
1053 1037
              SELECT DISTINCT parts_id FROM orderitems
1054 1038
            )|;
1055
  }
1056 1039

  
1057
  if ($form->{itemstatus} eq 'active') {
1040
  } elsif ($form->{itemstatus} eq 'active') {
1058 1041
    $where .= qq| AND p.obsolete = '0'|;
1059
  }
1060 1042

  
1061
  if ($form->{itemstatus} eq 'obsolete') {
1043
  } elsif ($form->{itemstatus} eq 'obsolete') {
1062 1044
    $where .= qq| AND p.obsolete = '1'|;
1063
    $form->{onhand} = $form->{short} = 0;
1064
  }
1065 1045

  
1066
  if ($form->{itemstatus} eq 'onhand') {
1046
  } elsif ($form->{itemstatus} eq 'onhand') {
1067 1047
    $where .= qq| AND p.onhand > 0|;
1068
  }
1069 1048

  
1070
  if ($form->{itemstatus} eq 'short') {
1049
  } elsif ($form->{itemstatus} eq 'short') {
1071 1050
    $where .= qq| AND p.onhand < p.rop|;
1051

  
1072 1052
  }
1073 1053

  
1074 1054
  foreach my $column (qw(make model)) {
......
1077 1057
    push(@where_values, '%' . $form->{$column} . '%');
1078 1058
  }
1079 1059

  
1060
  $main::lxdebug->leave_sub();
1061

  
1062
  return ($where, @where_values);
1063
}
1064

  
1065
sub get_num_matches_for_priceupdate {
1066
  $main::lxdebug->enter_sub();
1067

  
1068
  my $self     = shift;
1069

  
1070
  my $myconfig = \%main::myconfig;
1071
  my $form     = $main::form;
1072

  
1073
  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
1074

  
1075
  my ($where, @where_values) = $self->_create_filter_for_priceupdate();
1076

  
1077
  my $num_updated = 0;
1078
  my $query;
1079

  
1080
  for my $column (qw(sellprice listprice)) {
1081
    next if ($form->{$column} eq "");
1082

  
1083
    $query =
1084
      qq|SELECT COUNT(*)
1085
         FROM parts
1086
         WHERE id IN
1087
           (SELECT p.id
1088
            FROM parts p
1089
            LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
1090
            WHERE $where)|;
1091
    my ($result)  = selectfirst_array_query($from, $dbh, $query, @where_values);
1092
    $num_updated += $result if (0 <= $result);
1093
  }
1094

  
1095
  $query =
1096
    qq|SELECT COUNT(*)
1097
       FROM prices
1098
       WHERE parts_id IN
1099
         (SELECT p.id
1100
          FROM parts p
1101
          LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
1102
          WHERE $where) AND (pricegroup_id = ?)|;
1103
  my $sth = prepare_query($form, $dbh, $query);
1104

  
1105
  for my $i (1 .. $form->{price_rows}) {
1106
    next if ($form->{"price_$i"} eq "");
1107

  
1108
    my ($result)  = do_statement($form, $sth, $query, @where_values, conv_i($form->{"pricegroup_id_$i"}));
1109
    $num_updated += $result if (0 <= $result);
1110
  }
1111
  $sth->finish();
1112

  
1113
  $main::lxdebug->leave_sub();
1114

  
1115
  return $num_updated;
1116
}
1117

  
1118
sub update_prices {
1119
  $main::lxdebug->enter_sub();
1120

  
1121
  my ($self, $myconfig, $form) = @_;
1122

  
1123
  my ($where, @where_values) = $self->_create_filter_for_priceupdate();
1124
  my $num_updated = 0;
1125

  
1080 1126
  # connect to database
1081 1127
  my $dbh = $form->dbconnect_noauto($myconfig);
1082 1128

  
......
1098 1144
            FROM parts p
1099 1145
            LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
1100 1146
            WHERE $where)|;
1101
    do_query($from, $dbh, $query, $value, @where_values);
1147
    my $result    = do_query($from, $dbh, $query, $value, @where_values);
1148
    $num_updated += $result if (0 <= $result);
1102 1149
  }
1103 1150

  
1104 1151
  my $q_add =
......
1123 1170
    next if ($form->{"price_$i"} eq "");
1124 1171

  
1125 1172
    my $value = $form->parse_amount($myconfig, $form->{"price_$i"});
1173
    my $result;
1126 1174

  
1127 1175
    if ($form->{"pricegroup_type_$i"} eq "percent") {
1128
      do_statement($form, $sth_multiply, $q_multiply, ($value / 100) + 1, @where_values, conv_i($form->{"pricegroup_id_$i"}));
1176
      $result = do_statement($form, $sth_multiply, $q_multiply, ($value / 100) + 1, @where_values, conv_i($form->{"pricegroup_id_$i"}));
1129 1177
    } else {
1130
      do_statement($form, $sth_add, $q_add, $value, @where_values, conv_i($form->{"pricegroup_id_$i"}));
1178
      $result = do_statement($form, $sth_add, $q_add, $value, @where_values, conv_i($form->{"pricegroup_id_$i"}));
1131 1179
    }
1180

  
1181
    $num_updated += $result if (0 <= $result);
1132 1182
  }
1133 1183

  
1134 1184
  $sth_add->finish();
......
1139 1189

  
1140 1190
  $main::lxdebug->leave_sub();
1141 1191

  
1142
  return $rc;
1192
  return $num_updated;
1143 1193
}
1144 1194

  
1145 1195
sub create_links {
bin/mozilla/ic.pl
131 131

  
132 132
  $auth->assert('part_service_assembly_edit');
133 133

  
134
  my @errors      = ();
135
  my $value_found = false;
136

  
137
  foreach my $idx (qw(sellprice listprice), (1..$form->{price_rows})) {
138
    my $name      = $idx =~ m/\d/ ? $form->{"pricegroup_${idx}"}      : $idx eq 'sellprice' ? $locale->text('Sell Price') : $locale->text('List Price');
139
    my $type      = $idx =~ m/\d/ ? $form->{"pricegroup_type_${idx}"} : $form->{"${idx}_type"};
140
    my $value_idx = $idx =~ m/\d/ ? "price_${idx}" : $idx;
141
    my $value     = $form->parse_amount(\%myconfig, $form->{$value_idx});
142

  
143
    if ((0 > $value) && ($type eq 'percent')) {
144
      push @errors, $locale->text('You cannot adjust the price for pricegroup "#1" by a negative percentage.', $name);
145

  
146
    } elsif (!$value && ($form->{$value_idx} ne '')) {
147
      push @errors, $locale->text('No valid number entered for pricegroup "#1".', $name);
148

  
149
    } elsif (0 < $value) {
150
      $value_found = 1;
151
    }
152
  }
153

  
154
  push @errors, $locale->text('No prices will be updated because no prices have been entered.') if (!$value_found);
155

  
156
  my $num_matches = IC->get_num_matches_for_priceupdate();
157

  
158
  $form->header();
159

  
160
  if (@errors) {
161
    $form->show_generic_error(join('<br>', @errors), 'back_button' => 1);
162
  }
163

  
134 164
  $form->{nextsub} = "update_prices";
135
  $form->header;
136 165

  
137 166
  map { delete $form->{$_} } qw(action header);
138 167

  
139
  print $form->parse_html_template('ic/confirm_price_update', { HIDDENS => [ map { name => $_, value => $form->{$_} }, keys %$form ] });
168
  print $form->parse_html_template('ic/confirm_price_update', { HIDDENS     => [ map { name => $_, value => $form->{$_} }, keys %$form ],
169
                                                                num_matches => $num_matches });
140 170

  
141 171
  $lxdebug->leave_sub();
142 172
}
......
146 176

  
147 177
  $auth->assert('part_service_assembly_edit');
148 178

  
149
  if (IC->update_prices(\%myconfig, \%$form)) {
150
    $form->redirect($form->{update_count} . $locale->text('prices updated!'));
179
  my $num_updated = IC->update_prices(\%myconfig, \%$form);
180

  
181
  if (-1 != $num_updated) {
182
    $form->redirect($locale->text('#1 prices were updated.', $num_updated));
151 183
  } else {
152 184
    $form->error($locale->text('Could not update prices!'));
153 185
  }
locale/de/all
9 9
  ' Date missing!'              => ' Datum fehlt!',
10 10
  ' Part Number missing!'       => ' Artikelnummer fehlt!',
11 11
  ' missing!'                   => ' fehlt!',
12
  '#1 prices were updated.'     => '#1 Preise wurden aktualisiert.',
12 13
  '&lt;%account_number%&gt; -- Your account number' => '&lt;%account_number%&gt; -- Ihre Kontonummer',
13 14
  '&lt;%bank%&gt; -- Your bank' => '&lt;%bank%&gt; -- Der Name Ihrer Bank',
14 15
  '&lt;%bank_code%&gt; -- Your bank code' => '&lt;%bank_code%&gt; -- Die Bankleitzahl Ihrer Bank',
......
176 177
  'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
177 178
  'Application Error. Wrong Format' => 'Fehler in der Anwendung. Falsches Format: ',
178 179
  'Applying [% HTML.escape(file) %]:' => 'F&uuml;hre [% HTML.escape(file) %] aus:',
180
  'Approximately #1 prices will be updated.' => 'Ungef?hr #1 Preise werden aktualisiert.',
179 181
  'Apr'                         => 'Apr',
180 182
  'April'                       => 'April',
181 183
  'Ar aging on %s'              => 'Offene Forderungen zum %s',
......
185 187
  'Are you sure you want to delete Quotation Number' => 'Sind Sie sicher, dass Angebotnummer gel?scht werden soll?',
186 188
  'Are you sure you want to delete Transaction' => 'Buchung wirklich l?schen?',
187 189
  'Are you sure you want to remove the marked entries from the queue?' => 'Sind Sie sicher, dass die markierten Eintr?ge von der Warteschlange gel?scht werden sollen?',
188
  'Are you sure you want to update the prices' => 'Sind Sie sicher, dass Sie die Preise aktualisieren wollen?',
190
  'Are you sure you want to update the prices' => 'Sind Sie sicher, dass Sie die Preise aktualisieren wollen',
189 191
  'Article Code'                => 'Artikelk?rzel',
190 192
  'Article Code missing!'       => 'Artikelk?rzel fehlt',
191 193
  'As a result, the saved onhand values of the present goods can be stored into a warehouse designated by you, or will be reset for a proper warehouse tracking' => 'Als Konsequenz k&ouml;nnen die gespeicherten Mengen entweder in ein Lager &uuml;berf&uuml;hrt werden, oder f&uuml;r eine frische Lagerverwaltung resettet werden.',
......
996 998
  'No licenses were found that match the search criteria.' => 'Es wurden keine Lizenzen gefunden, auf die die Suchkriterien zutreffen.',
997 999
  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
998 1000
  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
1001
  'No prices will be updated because no prices have been entered.' => 'Es werden keine Preise aktualisiert, weil keine g?ltigen Preis?nderungen eingegeben wurden.',
999 1002
  'No problems were recognized.' => 'Es wurden keine Probleme gefunden.',
1000 1003
  'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.',
1001 1004
  'No user has been selected.'  => 'Es wurde kein Benutzer ausgew&auml;hlt.',
1005
  'No valid number entered for pricegroup "#1".' => 'F?r Preisgruppe "#1" wurde keine g?ltige Nummer eingegeben.',
1002 1006
  'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgew?hlt.',
1003 1007
  'No warehouse has been created yet or the quantity of the bins is not configured yet.' => 'Es wurde noch kein Lager angelegt, bzw. die dazugehörigen Lagerplätze sind noch nicht konfiguriert.',
1004 1008
  'No.'                         => 'Position',
......
1737 1741
  'You can either create a new database or chose an existing database.' => 'Sie k?nnen entweder eine neue Datenbank erstellen oder eine existierende ausw?hlen.',
1738 1742
  'You can only delete datasets that are not in use.' => 'Sie k&ouml;nnen nur Datenbanken l&ouml;schen, die momentan nicht in Benutzung sind.',
1739 1743
  'You can use the following strings in the long description and all translations. They will be replaced by their actual values by Lx-Office before they\'re output.' => 'Sie k&ouml;nnen im Langtext und allen ?bersetzungen die folgenden Variablen benutzen, die vor der Ausgabe von Lx-Office automatisch ersetzt werden:',
1744
  'You cannot adjust the price for pricegroup "#1" by a negative percentage.' => 'Sie k?nnen den Preis f?r Preisgruppe "#1" um einen negativen Prozentwert anpassen.',
1740 1745
  'You cannot continue before all required modules are installed.' => 'Sie k&ouml;nnen nicht fortfahren, bevor alle ben&ouml;tigten Pakete installiert sind.',
1741 1746
  'You cannot continue until all unknown units have been mapped to known ones.' => 'Sie k&ouml;nnen nicht fortfahren, bis alle unbekannten Einheiten in neue Einheiten umgewandelt wurden.',
1742 1747
  'You cannot create an invoice for delivery orders for different customers.' => 'Sie k?nnen keine Rechnung zu Lieferscheinen f?r verschiedene Kunden erstellen.',
......
1841 1846
  'pos_eur'                     => 'E/?R',
1842 1847
  'pos_ustva'                   => 'UStVA',
1843 1848
  'posted!'                     => 'gebucht',
1844
  'prices updated!'             => ' Preise aktualisiert!',
1845 1849
  'print'                       => 'drucken',
1846 1850
  'proforma'                    => 'Proforma',
1847 1851
  'project_list'                => 'projektliste',
locale/de/ic
3 3
$self->{texts} = {
4 4
  ' Date missing!'              => ' Datum fehlt!',
5 5
  ' Part Number missing!'       => ' Artikelnummer fehlt!',
6
  '#1 prices were updated.'     => '#1 Preise wurden aktualisiert.',
6 7
  '*/'                          => '*/',
7 8
  'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => 'Eine tempor?re Datei konnte nicht angelegt werden. Bitte stellen Sie sicher, dass das Verzeichnis "#1" vom Webserver beschrieben werden darf.',
8 9
  'ADDED'                       => 'Hinzugef?gt',
......
172 173
  'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgew?hlt.',
173 174
  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
174 175
  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
176
  'No prices will be updated because no prices have been entered.' => 'Es werden keine Preise aktualisiert, weil keine g?ltigen Preis?nderungen eingegeben wurden.',
177
  'No valid number entered for pricegroup "#1".' => 'F?r Preisgruppe "#1" wurde keine g?ltige Nummer eingegeben.',
175 178
  'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgew?hlt.',
176 179
  'No.'                         => 'Position',
177 180
  'Nov'                         => 'Nov',
......
303 306
  'Warehouse management'        => 'Lagerverwaltung/Bestandsver?nderung',
304 307
  'Weight'                      => 'Gewicht',
305 308
  'Yes'                         => 'Ja',
309
  'You cannot adjust the price for pricegroup "#1" by a negative percentage.' => 'Sie k?nnen den Preis f?r Preisgruppe "#1" um einen negativen Prozentwert anpassen.',
306 310
  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
307 311
  'Your PostgreSQL installationen uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => 'Ihre PostgreSQL-Installation benutzt UTF-8 als Zeichensatz. Sie m?ssen deshalb Lx-Office so konfigurieren, dass es ebenfalls UTF-8 als Zeichensatz benutzt.',
308 312
  'Zipcode'                     => 'PLZ',
......
326 330
  'packing_list'                => 'Versandliste',
327 331
  'part_list'                   => 'warenliste',
328 332
  'pick_list'                   => 'Entnahmeliste',
329
  'prices updated!'             => ' Preise aktualisiert!',
330 333
  'proforma'                    => 'Proforma',
331 334
  'purchase_order'              => 'Auftrag',
332 335
  'report_generator_dispatch_to is not defined.' => 'report_generator_dispatch_to ist nicht definiert.',
templates/webpages/ic/confirm_price_update_de.html
10 10

  
11 11
  <h2 class="confirm">Best?tigen Sie!</h2>
12 12

  
13
  <h4>Sind Sie sicher, dass Sie die Preise aktualisieren wollen?</h4>
13
  <p>
14
   [% LxERP.format_string('Ungef?hr #1 Preise werden aktualisiert.', num_matches) %]
15
  </p>
16

  
17
  <p>Sind Sie sicher, dass Sie die Preise aktualisieren wollen?</p>
14 18

  
15 19
  <p>
16 20
   <input name="action" class="submit" type="submit" value="Weiter">
templates/webpages/ic/confirm_price_update_master.html
10 10

  
11 11
  <h2 class="confirm"><translate>Confirm!</translate></h2>
12 12

  
13
  <h4><translate>Are you sure you want to update the prices</translate></h4>
13
  <p>
14
   [% LxERP.format_string('<translate>Approximately #1 prices will be updated.</translate>', num_matches) %]
15
  </p>
16

  
17
  <p><translate>Are you sure you want to update the prices</translate>?</p>
14 18

  
15 19
  <p>
16 20
   <input name="action" class="submit" type="submit" value="<translate>Continue</translate>">

Auch abrufbar als: Unified diff