Revision 4f63ea87
Von Jan Büren vor fast 16 Jahren hinzugefügt
SL/WH.pm | ||
---|---|---|
37 | 37 |
use SL::AM; |
38 | 38 |
use SL::DBUtils; |
39 | 39 |
use SL::Form; |
40 |
|
|
40 |
use warnings; |
|
41 |
#use strict; |
|
41 | 42 |
sub transfer { |
42 | 43 |
$main::lxdebug->enter_sub(); |
43 | 44 |
|
... | ... | |
122 | 123 |
|
123 | 124 |
$main::lxdebug->leave_sub(); |
124 | 125 |
} |
126 |
# |
|
127 |
# Testfall: |
|
128 |
# |
|
129 |
|
|
130 |
sub transfer_assembly { |
|
131 |
$main::lxdebug->enter_sub(); |
|
132 |
|
|
133 |
my $self = shift; |
|
134 |
my %params = @_; |
|
135 |
Common::check_params(\%params, qw(assembly_id dst_warehouse_id login qty unit dst_bin_id chargenumber comment)); |
|
136 |
|
|
137 |
# my $maxcreate=WH->check_assembly_max_create(assembly_id =>$params{'assembly_id'}, dbh => $my_dbh); |
|
138 |
|
|
139 |
my $myconfig = \%main::myconfig; |
|
140 |
my $form = $main::form; |
|
141 |
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); |
|
142 |
|
|
143 |
|
|
144 |
# Ablauferklärung |
|
145 |
# |
|
146 |
# ... Standard-Check oben Ende. Hier die eigentliche SQL-Abfrage |
|
147 |
# select parts_id,qty from assembly where id=1064; |
|
148 |
# |
|
149 |
|
|
150 |
my $query = qq|select parts_id,qty from assembly where id = ?|; |
|
151 |
my $sth_part_qty_assembly = prepare_execute_query($form, $dbh, $query, $params{assembly_id}); |
|
152 |
|
|
153 |
# Hier wird das prepared Statement für die Schleife über alle Lagerplätze vorbereitet |
|
154 |
my $transferPartSQL = qq|INSERT INTO inventory (parts_id, warehouse_id, bin_id, chargenumber, comment, employee_id, qty, trans_id, trans_type_id) |
|
155 |
VALUES (?, ?, ?, ?, ?,(SELECT id FROM employee WHERE login = ?), ?, nextval('id'), |
|
156 |
(SELECT id FROM transfer_type WHERE direction = 'out' AND description = 'used'))|; |
|
157 |
my $sthTransferPartSQL = prepare_query($form, $dbh, $transferPartSQL); |
|
158 |
|
|
159 |
my $kannNichtFertigen =""; # der return-string für die fehlermeldung inkl. welche waren zum fertigen noch fehlen |
|
160 |
|
|
161 |
while (my $hash_ref = $sth_part_qty_assembly->fetchrow_hashref()) { # Schleife für $query=select parts_id,qty from assembly |
|
162 |
|
|
163 |
my $partsQTY = $hash_ref->{qty} * $params{qty}; # benötigte teile * anzahl erzeugnisse |
|
164 |
my $currentPart_ID = $hash_ref->{parts_id}; |
|
165 |
|
|
166 |
# Überprüfen, ob diese Anzahl gefertigt werden kann |
|
167 |
my $max_parts = get_max_qty_parts($self, parts_id => $currentPart_ID, warehouse_id => $params{dst_warehouse_id}); #$self angeben, damit die Standardkonvention (Name, Parameter) eingehalten wird |
|
168 |
|
|
169 |
if ($partsQTY > $max_parts){ |
|
170 |
|
|
171 |
# Gibt es hier ein Problem mit nicht "escapten" Zeichen? |
|
172 |
$kannNichtFertigen .= "Zum Fertigen fehlen:" . abs($partsQTY) . " Stueck der Ware:" . get_part_description($self, parts_id => $currentPart_ID) . ", um das Erzeugnis herzustellen. <br>"; # Konnte die Menge nicht mit der aktuellen Anzahl der Waren fertigen |
|
173 |
} |
|
174 |
|
|
175 |
# Eine kurze Vorabfrage, um den Lagerplatz und die Chargennummber zu bestimmen |
|
176 |
# Offen: Die Summe über alle Lagerplätze wird noch nicht gebildet |
|
177 |
# Gelöst: Wir haben vorher schon die Abfrage durchgeführt, ob wir fertigen können. |
|
178 |
# Noch besser gelöst: Wir laufen durch alle benötigten Waren zum Fertigen und geben eine Rückmeldung an den Benutzer was noch fehlt |
|
179 |
# und lösen den Rest dann so wie bei xplace im Barcode-Programm |
|
180 |
# S.a. Kommentar im bin/mozilla-Code mb übernimmt und macht das in ordentlich |
|
181 |
|
|
182 |
my $tempquery = qq|SELECT SUM(qty), bin_id, chargenumber FROM inventory WHERE warehouse_id = ? AND parts_id = ? GROUP BY bin_id, chargenumber having SUM(qty)>0|; |
|
183 |
my $tempsth = prepare_execute_query($form, $dbh, $tempquery, $params{dst_warehouse_id}, $currentPart_ID); |
|
184 |
|
|
185 |
# Alle Werte zu dem einzelnen Artikel, die wir später auslagern |
|
186 |
my $tmpPartsQTY = $partsQTY; |
|
187 |
|
|
188 |
while (my $temphash_ref = $tempsth->fetchrow_hashref()) { |
|
189 |
my $temppart_bin_id = $temphash_ref->{bin_id}; # kann man hier den quelllagerplatz beim verbauen angeben? |
|
190 |
my $temppart_chargenumber = $temphash_ref->{chargenumber}; |
|
191 |
my $temppart_qty = $temphash_ref->{sum}; |
|
192 |
if ($tmpPartsQTY > $temppart_qty) { # wir haben noch mehr waren zum wegbuchen. Wir buchen den kompletten Lagerplatzbestand und zählen die Hilfsvariable runter |
|
193 |
$tmpPartsQTY = $tmpPartsQTY - $temppart_qty; |
|
194 |
$temppart_qty = $temppart_qty * -1; # beim analyiseren des sql-trace, war dieser wert positiv, wenn * -1 als berechnung in der parameter-übergabe angegeben wird. Dieser Wert IST und BLEIBT positiv!! Hilfe. Liegt das daran, dass dieser Wert aus einem SQL-Statement stammt? |
|
195 |
do_statement($form, $sthTransferPartSQL, $transferPartSQL, $currentPart_ID, $params{dst_warehouse_id}, $temppart_bin_id, $temppart_chargenumber, 'Verbraucht für ' . get_part_description($self, parts_id => $params{assembly_id}), $params{login}, $temppart_qty); |
|
196 |
|
|
197 |
# hier ist noch ein fehler am besten mit definierten erzeugnissen debuggen 02/2009 jb |
|
198 |
# idee: ausbuch algorithmus mit rekursion lösen und an- und abschaltbar machen |
|
199 |
# das problem könnte sein, dass strict nicht an war und sth global eine andere zuweisung bekam |
|
200 |
# auf jeden fall war der internal-server-error nach aktivierung von strict und warnings plus ein paar my-definitionen weg |
|
201 |
} else { # okay, wir haben weniger oder gleich Waren die wir wegbuchen müssen, wir können also aufhören |
|
202 |
$tmpPartsQTY *=-1; |
|
203 |
do_statement($form, $sthTransferPartSQL, $transferPartSQL, $currentPart_ID, $params{dst_warehouse_id}, $temppart_bin_id, $temppart_chargenumber, 'Verbraucht für ' . get_part_description($self, parts_id => $params{assembly_id}), $params{login}, $tmpPartsQTY); |
|
204 |
last; # beendet die schleife (springt zum letzten element) |
|
205 |
} |
|
206 |
} # ende while SELECT SUM(qty), bin_id, chargenumber FROM inventory WHERE warehouse_id |
|
207 |
} #ende while select parts_id,qty from assembly where id = ? |
|
208 |
if ($kannNichtFertigen) { |
|
209 |
return $kannNichtFertigen; |
|
210 |
} |
|
211 |
|
|
212 |
# soweit alles gut. Jetzt noch die wirkliche Lagerbewegung für das Erzeugnis ausführen ... |
|
213 |
my $transferAssemblySQL = qq|INSERT INTO inventory (parts_id, warehouse_id, bin_id, chargenumber, comment, employee_id, qty, trans_id, trans_type_id) |
|
214 |
VALUES (?, ?, ?, ?, ?, (SELECT id FROM employee WHERE login = ?), ?, nextval('id'), |
|
215 |
(SELECT id FROM transfer_type WHERE direction = 'in' AND description = 'stock'))|; |
|
216 |
my $sthTransferAssemblySQL = prepare_query($form, $dbh, $transferAssemblySQL); |
|
217 |
do_statement($form, $sthTransferAssemblySQL, $transferAssemblySQL, $params{assembly_id}, $params{dst_warehouse_id}, $params{dst_bin_id}, $params{chargenumber}, $params{comment}, $params{login}, $params{qty}); |
|
218 |
$dbh->commit(); |
|
219 |
|
|
220 |
$main::lxdebug->leave_sub(); |
|
221 |
return 1; # Alles erfolgreich |
|
222 |
} |
|
125 | 223 |
|
126 | 224 |
sub get_warehouse_journal { |
127 | 225 |
$main::lxdebug->enter_sub(); |
... | ... | |
515 | 613 |
|
516 | 614 |
$sth = prepare_execute_query($form, $dbh, $query, @filter_vars); |
517 | 615 |
|
518 |
while ($ref = $sth->fetchrow_hashref()) { |
|
616 |
while (my $ref = $sth->fetchrow_hashref()) {
|
|
519 | 617 |
map { $ref->{$_} ||= "" } @all_fields; |
520 | 618 |
push @contents, $ref; |
521 | 619 |
} |
... | ... | |
607 | 705 |
|
608 | 706 |
return map { $_->{bin_id} => $_ } @{ $result }; |
609 | 707 |
} |
708 |
# |
|
709 |
# Eingabe: Teilenummer, Lagernummer (warehouse) |
|
710 |
# Ausgabe: Die maximale Anzahl der Teile in diesem Lager |
|
711 |
# |
|
712 |
sub get_max_qty_parts { |
|
713 |
$main::lxdebug->enter_sub(); |
|
714 |
|
|
715 |
my $self = shift; |
|
716 |
my %params = @_; |
|
717 |
|
|
718 |
Common::check_params(\%params, qw(parts_id warehouse_id)); #die brauchen wir |
|
719 |
|
|
720 |
my $myconfig = \%main::myconfig; |
|
721 |
my $form = $main::form; |
|
722 |
|
|
723 |
my $dbh = $params{dbh} || $form->get_standard_dbh(); |
|
724 |
|
|
725 |
my $query = qq| SELECT SUM(qty), bin_id, chargenumber FROM inventory where parts_id = ? AND warehouse_id = ? GROUP BY bin_id, chargenumber|; |
|
726 |
|
|
727 |
my $sth_QTY = prepare_execute_query($form, $dbh, $query, ,$params{parts_id}, $params{warehouse_id}); #info: aufruf an DBUtils.pm |
|
728 |
|
|
729 |
my $max_qty_parts = 0; #Initialisierung mit 0 |
|
730 |
while (my $ref = $sth_QTY->fetchrow_hashref()) { # wir laufen über alle chargen und Lagerorte (s.a. SQL-Query oben) |
|
731 |
$max_qty_parts += $ref->{sum}; |
|
732 |
} |
|
733 |
|
|
734 |
$main::lxdebug->leave_sub(); |
|
735 |
|
|
736 |
return $max_qty_parts; |
|
737 |
} |
|
738 |
|
|
739 |
# |
|
740 |
# Eingabe: Teilenummer, Lagernummer (warehouse) |
|
741 |
# Ausgabe: Die Beschreibung der Ware bzw. Erzeugnis |
|
742 |
# |
|
743 |
sub get_part_description { |
|
744 |
$main::lxdebug->enter_sub(); |
|
745 |
|
|
746 |
my $self = shift; |
|
747 |
my %params = @_; |
|
748 |
|
|
749 |
Common::check_params(\%params, qw(parts_id )); #die brauchen wir |
|
750 |
|
|
751 |
my $myconfig = \%main::myconfig; |
|
752 |
my $form = $main::form; |
|
753 |
|
|
754 |
my $dbh = $params{dbh} || $form->get_standard_dbh(); |
|
755 |
|
|
756 |
my $query = qq| SELECT partnumber, description FROM parts where id = ? |; |
|
757 |
|
|
758 |
my $sth = prepare_execute_query($form, $dbh, $query, ,$params{parts_id}); #info: aufruf zu DBUtils.pm |
|
759 |
|
|
760 |
my $ref = $sth->fetchrow_hashref(); |
|
761 |
my $part_description = $ref->{partnumber} . " " . $ref->{description}; |
|
762 |
|
|
763 |
$main::lxdebug->leave_sub(); |
|
764 |
|
|
765 |
return $part_description; |
|
766 |
} |
|
610 | 767 |
|
611 | 768 |
|
612 | 769 |
1; |
bin/mozilla/io.pl | ||
---|---|---|
290 | 290 |
$column_data{bin} = $form->{"bin_$i"}; |
291 | 291 |
|
292 | 292 |
if ($is_delivery_order) { |
293 |
$column_data{stock_in_out} = (!$form->{"assembly_$i"} && $form->{"inventory_accno_$i"}) ? calculate_stock_in_out($i) : ' ';
|
|
293 |
$column_data{stock_in_out} = $form->{"inventory_accno_$i"} ? calculate_stock_in_out($i) : ' ';
|
|
294 | 294 |
} |
295 | 295 |
|
296 | 296 |
my @ROW1 = map { value => $column_data{$_}, align => $align{$_}, nowrap => $nowrap{$_} }, @column_index; |
bin/mozilla/wh.pl | ||
---|---|---|
104 | 104 |
$form->{title} = $locale->text('Transfer'); |
105 | 105 |
$content = $form->parse_html_template('wh/warehouse_selection'); |
106 | 106 |
|
107 |
} elsif ($form->{trans_type} eq 'assembly') { |
|
108 |
$form->{title} = $locale->text('Assembly'); |
|
109 |
$content = $form->parse_html_template('wh/warehouse_selection_assembly'); |
|
107 | 110 |
} |
108 | 111 |
|
109 | 112 |
$form->header(); |
... | ... | |
305 | 308 |
$lxdebug->leave_sub(); |
306 | 309 |
} |
307 | 310 |
|
311 |
# -------------------------------------------------------------------- |
|
312 |
# Transfer: assemblies |
|
313 |
# Dies ist die Auswahlmaske für ein assembly. |
|
314 |
# Die ist einfach von transfer_assembly_update_part kopiert und nur um den trans_type (assembly) korrigiert worden |
|
315 |
# Es wäre schön, hier nochmal check_assembly_max_create auf, um die max. Fertigungszahl herauszufinden. |
|
316 |
# Ich lass das mal als auskommentierte Idee bestehen jb 18.3.09 |
|
317 |
# -------------------------------------------------------------------- |
|
318 |
|
|
319 |
sub transfer_assembly_update_part { |
|
320 |
$lxdebug->enter_sub(); |
|
321 |
|
|
322 |
$form->{trans_type} = 'assembly'; |
|
323 |
$form->{qty} = $form->parse_amount(\%myconfig, $form->{qty}); |
|
324 |
|
|
325 |
if (!$form->{partnumber} && !$form->{description}) { |
|
326 |
delete @{$form}{qw(parts_id partunit)}; |
|
327 |
transfer_warehouse_selection(); |
|
328 |
|
|
329 |
} elsif (($form->{partnumber} && ($form->{partnumber} ne $form->{old_partnumber})) || $form->{description}) { |
|
330 |
$form->{assemblies} = 1; |
|
331 |
$form->{no_assemblies} = 0; |
|
332 |
my $parts = Common->retrieve_parts(\%myconfig, $form, 'description', 1); |
|
333 |
if (scalar @{ $parts } == 1) { |
|
334 |
@{$form}{qw(parts_id partnumber description)} = @{$parts->[0]}{qw(id partnumber description)}; |
|
335 |
transfer_stock_get_partunit(); |
|
336 |
transfer_warehouse_selection(); |
|
337 |
} else { |
|
338 |
select_part('transfer_stock_part_selected', @{ $parts }); |
|
339 |
} |
|
340 |
|
|
341 |
} else { |
|
342 |
transfer_stock_get_partunit(); |
|
343 |
transfer_warehouse_selection(); |
|
344 |
} |
|
345 |
|
|
346 |
# hier die oben benannte idee |
|
347 |
# my $maxcreate = Common->check_assembly_max_create(assembly_id => $form->{parts_id}, dbh => $my_dbh); |
|
348 |
$lxdebug->leave_sub(); |
|
349 |
} |
|
308 | 350 |
sub transfer_stock_part_selected { |
309 | 351 |
$lxdebug->enter_sub(); |
310 | 352 |
|
... | ... | |
329 | 371 |
$lxdebug->leave_sub(); |
330 | 372 |
} |
331 | 373 |
|
374 |
# vorüberlegung jb 22.2.2009 |
|
375 |
# wir benötigen für diese funktion, die anzahl die vom erzeugnis hergestellt werden soll. vielleicht direkt per js fehleingaben verhindern? |
|
376 |
# ferner dann nochmal mit check_asssembly_max_create gegenprüfen und dann transaktionssicher wegbuchen. |
|
377 |
# wir brauchen eine hilfsfunktion, die nee. brauchen wir nicht. der algorithmus läuft genau wie bei check max_create, nur dass hier auch eine lagerbewegung (verbraucht) stattfindet |
|
378 |
# Manko ist derzeit noch, dass unterschiedliche Lagerplätze, bzw. das Quelllager an sich nicht ausgewählt werden können. |
|
379 |
# Laut Absprache in KW11 09 übernimmt mb hier den rest im April ... jb 18.3.09 |
|
380 |
sub create_assembly { |
|
381 |
# my $maxcreate=shift; # oben begonnene auskommentierte idee, hier als motiv weiterverfolgen (umkehrungen und sequenzierungen als stilmittel nicht vergessen) |
|
382 |
$lxdebug->enter_sub(); |
|
383 |
|
|
384 |
$form->{qty} = $form->parse_amount(\%myconfig, $form->{qty}); |
|
385 |
# my $maxcreate = WH->check_assembly_max_create(assembly_id => $form->{parts_id}); |
|
386 |
if ($form->{qty} <= 0) { |
|
387 |
$form->show_generic_error($locale->text('Invalid quantity.'), 'back_button' => 1); |
|
388 |
} #else { if ($form->{qty} > $maxcreate) { #s.o. |
|
389 |
# $form->show_generic_error($locale->text('Can not create that quantity with current stock'), 'back_button' => 1); |
|
390 |
# $form->show_generic_error('Maximale Stückzahl' . $maxcreate , 'back_button' => 1); |
|
391 |
# } |
|
392 |
# } |
|
393 |
|
|
394 |
if (!$form->{warehouse_id} || !$form->{bin_id}) { |
|
395 |
$form->error($locale->text('The warehouse or the bin is missing.')); |
|
396 |
} |
|
397 |
# WIESO war das nicht vorher schon ein %HASH?? ein hash ist ein hash! das hat mich mehr als eine Stunde gekostet herauszufinden. grr. jb 3.3.2009 |
|
398 |
# Anm. jb 18.3. vielleicht auch nur meine unwissenheit in perl-datenstrukturen |
|
399 |
my %TRANSFER = ( |
|
400 |
'transfer_type' => 'assembly', |
|
401 |
'login' => $form->{login}, |
|
402 |
'dst_warehouse_id' => $form->{warehouse_id}, |
|
403 |
'dst_bin_id' => $form->{bin_id}, |
|
404 |
'chargenumber' => $form->{chargenumber}, |
|
405 |
'assembly_id' => $form->{parts_id}, |
|
406 |
'qty' => $form->{qty}, |
|
407 |
'unit' => $form->{unit}, |
|
408 |
'comment' => $form->{comment}, |
|
409 |
); |
|
410 |
|
|
411 |
my $ret = WH->transfer_assembly (%TRANSFER); |
|
412 |
# Frage: Ich pack in den return-wert auch gleich die Fehlermeldung. Irgendwelche Nummern als Fehlerkonstanten definieren find ich auch nicht besonders schick... |
|
413 |
# Ideen? jb 18.3.09 |
|
414 |
if ($ret ne "1"){ |
|
415 |
$form->show_generic_error($locale->text($ret), 'back_button' => 1); |
|
416 |
} |
|
417 |
|
|
418 |
delete @{$form}{qw(parts_id partnumber description qty unit chargenumber comment)}; |
|
419 |
|
|
420 |
$form->{saved_message} = $locale->text('The assembly has been created.'); |
|
421 |
$form->{trans_type} = 'assembly'; |
|
422 |
|
|
423 |
transfer_warehouse_selection(); |
|
424 |
|
|
425 |
$lxdebug->leave_sub(); |
|
426 |
} |
|
427 |
|
|
332 | 428 |
sub transfer_stock { |
333 | 429 |
$lxdebug->enter_sub(); |
334 | 430 |
|
locale/de/all | ||
---|---|---|
186 | 186 |
'Article Code missing!' => 'Artikelk?rzel fehlt', |
187 | 187 |
'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önnen die gespeicherten Mengen entweder in ein Lager überführt werden, oder für eine frische Lagerverwaltung resettet werden.', |
188 | 188 |
'Assemblies' => 'Erzeugnisse', |
189 |
'Assembly' => 'Erzeugnis', |
|
190 |
'Assembly Description' => 'Erzeugnis-Beschreibung', |
|
191 |
'Assembly Number' => 'Erzeugnis-Nummer', |
|
189 | 192 |
'Assembly Number missing!' => 'Erzeugnisnummer fehlt!', |
190 | 193 |
'Asset' => 'Aktiva/Mittelverwendung', |
191 | 194 |
'Assets' => 'Aktiva', |
... | ... | |
278 | 281 |
'CRM user' => 'Admin Benutzer', |
279 | 282 |
'CSV export -- options' => 'CSV-Export -- Optionen', |
280 | 283 |
'Calculate' => 'Berechnen', |
284 |
'Can not create that quantity with current stock' => 'Ich kann diese Anzahl mit dem gegenwärtigen Lagerbestand nicht herstellen.', |
|
281 | 285 |
'Cancel' => 'Abbrechen', |
282 | 286 |
'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren', |
283 | 287 |
'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren', |
... | ... | |
362 | 366 |
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.', |
363 | 367 |
'Could not update prices!' => 'Preise konnten nicht aktualisiert werden!', |
364 | 368 |
'Country' => 'Land', |
369 |
'Create Assembly' => 'Erzeugnis fertigen', |
|
365 | 370 |
'Create Buchungsgruppen' => 'Buchungsgruppe erfassen', |
366 | 371 |
'Create Chart of Accounts' => 'Kontenplan anlegen', |
367 | 372 |
'Create Dataset' => 'Datenbank anlegen', |
... | ... | |
1383 | 1388 |
'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.', |
1384 | 1389 |
'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte überprüfen Sie die Angaben in config/authentication.pl.', |
1385 | 1390 |
'The access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.', |
1391 |
'The assembly has been created.' => 'Das Erzeugnis wurde hergestellt.', |
|
1386 | 1392 |
'The authentication configuration file "config/authentication.pl" does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei für die Authentifizierung "config/authentication.pl" wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollständig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.', |
1387 | 1393 |
'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => 'Die Authentifizierungsdatenbank kann momentan nicht erreicht werden. Entweder wurde sie noch nicht eingerichtet, oder der Datenbankserver antwortet nicht. Bitte wenden Sie sich an Ihren Administrator.', |
1388 | 1394 |
'The available options depend on the varibale type:' => 'Die verfügbaren Optionen hängen vom Variablentypen ab:', |
templates/webpages/wh/warehouse_selection_assembly_de.html | ||
---|---|---|
1 |
[% USE HTML %][% USE JavaScript %][% USE LxERP %]<body onload="on_load(); [% onload %]"> |
|
2 |
|
|
3 |
<script type="text/javascript" src="js/common.js"></script> |
|
4 |
<script type="text/javascript" src="js/part_selection.js"></script> |
|
5 |
<script type="text/javascript"> |
|
6 |
<!-- |
|
7 |
warehouses = new Array(); |
|
8 |
[%- USE WAREHOUSES_it = Iterator(WAREHOUSES) %][%- FOREACH warehouse = WAREHOUSES_it %] |
|
9 |
warehouses[[% WAREHOUSES_it.count - 1 %]] = new Array(); |
|
10 |
warehouses[[% WAREHOUSES_it.count - 1 %]]['id'] = [% warehouse.id %]; |
|
11 |
warehouses[[% WAREHOUSES_it.count - 1 %]]['bins'] = new Array(); |
|
12 |
[% USE BINS_it = Iterator(warehouse.BINS) %][% FOREACH bin = BINS_it %] |
|
13 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]] = new Array(); |
|
14 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]]['description'] = "[% JavaScript.escape(bin.description) %]"; |
|
15 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]]['id'] = [% bin.id %]; |
|
16 |
[% END %] |
|
17 |
[% END %] |
|
18 |
|
|
19 |
function warehouse_selected(warehouse_id, bin_id) { |
|
20 |
var control = document.getElementById("bin_id"); |
|
21 |
|
|
22 |
for (var i = control.options.length - 1; i >= 0; i--) { |
|
23 |
control.options[i] = null; |
|
24 |
} |
|
25 |
|
|
26 |
var warehouse_index = 0; |
|
27 |
|
|
28 |
for (i = 0; i < warehouses.length; i++) |
|
29 |
if (warehouses[i]['id'] == warehouse_id) { |
|
30 |
warehouse_index = i; |
|
31 |
break; |
|
32 |
} |
|
33 |
|
|
34 |
var warehouse = warehouses[warehouse_index]; |
|
35 |
var bin_index = 0; |
|
36 |
|
|
37 |
for (i = 0; i < warehouse['bins'].length; i++) |
|
38 |
if (warehouse['bins'][i]['id'] == bin_id) { |
|
39 |
bin_index = i; |
|
40 |
break; |
|
41 |
} |
|
42 |
|
|
43 |
for (i = 0; i < warehouse['bins'].length; i++) { |
|
44 |
control.options[i] = new Option(warehouse['bins'][i]['description'], warehouse['bins'][i]['id']); |
|
45 |
} |
|
46 |
|
|
47 |
|
|
48 |
control.options[bin_index].selected = true; |
|
49 |
} |
|
50 |
|
|
51 |
function on_load() { |
|
52 |
warehouse_selected([% warehouse_id %], [% bin_id %]); |
|
53 |
} |
|
54 |
--> |
|
55 |
</script> |
|
56 |
|
|
57 |
<form name="Form" method="post" action="wh.pl"> |
|
58 |
|
|
59 |
<input type="hidden" name="nextsub" value="transfer_assembly"> |
|
60 |
<input type="hidden" name="update_nextsub" value="transfer_assembly_update_part"> |
|
61 |
|
|
62 |
[% IF saved_message %] |
|
63 |
<p>[% saved_message %]</p> |
|
64 |
[% END %] |
|
65 |
|
|
66 |
<div class="listtop">[% title %]</div> |
|
67 |
|
|
68 |
<p> |
|
69 |
<table> |
|
70 |
<tr> |
|
71 |
<th align="right" nowrap>Ziellager</th> |
|
72 |
<td> |
|
73 |
<select name="warehouse_id" onchange="warehouse_selected(warehouses[this.selectedIndex]['id'], 0)"> |
|
74 |
[%- FOREACH warehouse = WAREHOUSES %] |
|
75 |
<option value="[% HTML.escape(warehouse.id) %]"[% IF warehouse_id == warehouse.id %] selected[% END %]>[% warehouse.description %]</option> |
|
76 |
[%- END %] |
|
77 |
</select> |
|
78 |
</td> |
|
79 |
</tr> |
|
80 |
|
|
81 |
<tr> |
|
82 |
<th align="right" nowrap>Ziellagerplatz:</th> |
|
83 |
<td><select id="bin_id" name="bin_id"></select></td> |
|
84 |
</tr> |
|
85 |
|
|
86 |
<tr> |
|
87 |
<th align="right" nowrap>Erzeugnis-Nummer</th> |
|
88 |
<td> |
|
89 |
<input type="hidden" name="parts_id" id="parts_id" value="[% HTML.escape(parts_id) %]"> |
|
90 |
<input type="hidden" name="old_partnumber" id="old_partnumber" value="[% HTML.escape(partnumber) %]"> |
|
91 |
<input name="partnumber" size="30" value="[% HTML.escape(partnumber) %]"> |
|
92 |
</td> |
|
93 |
</tr> |
|
94 |
|
|
95 |
<tr> |
|
96 |
<th align="right" nowrap>Erzeugnis-Beschreibung</th> |
|
97 |
<td> |
|
98 |
<input name="description" size="30" value="[% HTML.escape(description) %]"> |
|
99 |
<input type="button" onclick="part_selection_window('partnumber', 'description', 'parts_id', 0, 'Form', 'assemblies:click_button=update_button')" value="?"> |
|
100 |
</td> |
|
101 |
</tr> |
|
102 |
|
|
103 |
<tr> |
|
104 |
<th align="right" nowrap>Chargennummer</th> |
|
105 |
<td><input name="chargenumber" size="30" value="[% HTML.escape(chargenumber) %]"></td> |
|
106 |
</tr> |
|
107 |
|
|
108 |
<tr> |
|
109 |
<th align="right" nowrap>Menge</th> |
|
110 |
<td> |
|
111 |
<input name="qty" size="10" value="[% HTML.escape(LxERP.format_amount(qty)) %]"> |
|
112 |
<select name="unit"> |
|
113 |
[%- FOREACH unit = UNITS %]<option[% IF unit.selected %] selected[% END %]>[% HTML.escape(unit.name) %]</option>[% END %] |
|
114 |
</select> |
|
115 |
</td> |
|
116 |
</tr> |
|
117 |
|
|
118 |
<tr> |
|
119 |
<th align="right" nowrap>Optionaler Kommentar</th> |
|
120 |
<td><input name="comment" size="30" value="[% HTML.escape(comment) %]"></td> |
|
121 |
</tr> |
|
122 |
|
|
123 |
</table> |
|
124 |
</p> |
|
125 |
|
|
126 |
<p> |
|
127 |
<input type="submit" class="submit" name="action" id="update_button" value="Erneuern"> |
|
128 |
[%- IF parts_id %] |
|
129 |
<input type="submit" class="submit" name="action" value="Erzeugnis fertigen"> |
|
130 |
[%- END %] |
|
131 |
</p> |
|
132 |
</form> |
|
133 |
|
|
134 |
</body> |
|
135 |
</html> |
templates/webpages/wh/warehouse_selection_assembly_master.html | ||
---|---|---|
1 |
[% USE HTML %][% USE JavaScript %][% USE LxERP %]<body onload="on_load(); [% onload %]"> |
|
2 |
|
|
3 |
<script type="text/javascript" src="js/common.js"></script> |
|
4 |
<script type="text/javascript" src="js/part_selection.js"></script> |
|
5 |
<script type="text/javascript"> |
|
6 |
<!-- |
|
7 |
warehouses = new Array(); |
|
8 |
[%- USE WAREHOUSES_it = Iterator(WAREHOUSES) %][%- FOREACH warehouse = WAREHOUSES_it %] |
|
9 |
warehouses[[% WAREHOUSES_it.count - 1 %]] = new Array(); |
|
10 |
warehouses[[% WAREHOUSES_it.count - 1 %]]['id'] = [% warehouse.id %]; |
|
11 |
warehouses[[% WAREHOUSES_it.count - 1 %]]['bins'] = new Array(); |
|
12 |
[% USE BINS_it = Iterator(warehouse.BINS) %][% FOREACH bin = BINS_it %] |
|
13 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]] = new Array(); |
|
14 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]]['description'] = "[% JavaScript.escape(bin.description) %]"; |
|
15 |
warehouses[[% WAREHOUSES_it.count - 1%]]['bins'][[% BINS_it.count - 1 %]]['id'] = [% bin.id %]; |
|
16 |
[% END %] |
|
17 |
[% END %] |
|
18 |
|
|
19 |
function warehouse_selected(warehouse_id, bin_id) { |
|
20 |
var control = document.getElementById("bin_id"); |
|
21 |
|
|
22 |
for (var i = control.options.length - 1; i >= 0; i--) { |
|
23 |
control.options[i] = null; |
|
24 |
} |
|
25 |
|
|
26 |
var warehouse_index = 0; |
|
27 |
|
|
28 |
for (i = 0; i < warehouses.length; i++) |
|
29 |
if (warehouses[i]['id'] == warehouse_id) { |
|
30 |
warehouse_index = i; |
|
31 |
break; |
|
32 |
} |
|
33 |
|
|
34 |
var warehouse = warehouses[warehouse_index]; |
|
35 |
var bin_index = 0; |
|
36 |
|
|
37 |
for (i = 0; i < warehouse['bins'].length; i++) |
|
38 |
if (warehouse['bins'][i]['id'] == bin_id) { |
|
39 |
bin_index = i; |
|
40 |
break; |
|
41 |
} |
|
42 |
|
|
43 |
for (i = 0; i < warehouse['bins'].length; i++) { |
|
44 |
control.options[i] = new Option(warehouse['bins'][i]['description'], warehouse['bins'][i]['id']); |
|
45 |
} |
|
46 |
|
|
47 |
|
|
48 |
control.options[bin_index].selected = true; |
|
49 |
} |
|
50 |
|
|
51 |
function on_load() { |
|
52 |
warehouse_selected([% warehouse_id %], [% bin_id %]); |
|
53 |
} |
|
54 |
--> |
|
55 |
</script> |
|
56 |
|
|
57 |
<form name="Form" method="post" action="wh.pl"> |
|
58 |
|
|
59 |
<input type="hidden" name="nextsub" value="transfer_assembly"> |
|
60 |
<input type="hidden" name="update_nextsub" value="transfer_assembly_update_part"> |
|
61 |
|
|
62 |
[% IF saved_message %] |
|
63 |
<p>[% saved_message %]</p> |
|
64 |
[% END %] |
|
65 |
|
|
66 |
<div class="listtop">[% title %]</div> |
|
67 |
|
|
68 |
<p> |
|
69 |
<table> |
|
70 |
<tr> |
|
71 |
<th align="right" nowrap><translate>Destination warehouse</translate></th> |
|
72 |
<td> |
|
73 |
<select name="warehouse_id" onchange="warehouse_selected(warehouses[this.selectedIndex]['id'], 0)"> |
|
74 |
[%- FOREACH warehouse = WAREHOUSES %] |
|
75 |
<option value="[% HTML.escape(warehouse.id) %]"[% IF warehouse_id == warehouse.id %] selected[% END %]>[% warehouse.description %]</option> |
|
76 |
[%- END %] |
|
77 |
</select> |
|
78 |
</td> |
|
79 |
</tr> |
|
80 |
|
|
81 |
<tr> |
|
82 |
<th align="right" nowrap><translate>Destination bin</translate>:</th> |
|
83 |
<td><select id="bin_id" name="bin_id"></select></td> |
|
84 |
</tr> |
|
85 |
|
|
86 |
<tr> |
|
87 |
<th align="right" nowrap><translate>Assembly Number</translate></th> |
|
88 |
<td> |
|
89 |
<input type="hidden" name="parts_id" id="parts_id" value="[% HTML.escape(parts_id) %]"> |
|
90 |
<input type="hidden" name="old_partnumber" id="old_partnumber" value="[% HTML.escape(partnumber) %]"> |
|
91 |
<input name="partnumber" size="30" value="[% HTML.escape(partnumber) %]"> |
|
92 |
</td> |
|
93 |
</tr> |
|
94 |
|
|
95 |
<tr> |
|
96 |
<th align="right" nowrap><translate>Assembly Description</translate></th> |
|
97 |
<td> |
|
98 |
<input name="description" size="30" value="[% HTML.escape(description) %]"> |
|
99 |
<input type="button" onclick="part_selection_window('partnumber', 'description', 'parts_id', 0, 'Form', 'assemblies:click_button=update_button')" value="?"> |
|
100 |
</td> |
|
101 |
</tr> |
|
102 |
|
|
103 |
<tr> |
|
104 |
<th align="right" nowrap><translate>Charge number</translate></th> |
|
105 |
<td><input name="chargenumber" size="30" value="[% HTML.escape(chargenumber) %]"></td> |
|
106 |
</tr> |
|
107 |
|
|
108 |
<tr> |
|
109 |
<th align="right" nowrap><translate>Quantity</translate></th> |
|
110 |
<td> |
|
111 |
<input name="qty" size="10" value="[% HTML.escape(LxERP.format_amount(qty)) %]"> |
|
112 |
<select name="unit"> |
|
113 |
[%- FOREACH unit = UNITS %]<option[% IF unit.selected %] selected[% END %]>[% HTML.escape(unit.name) %]</option>[% END %] |
|
114 |
</select> |
|
115 |
</td> |
|
116 |
</tr> |
|
117 |
|
|
118 |
<tr> |
|
119 |
<th align="right" nowrap><translate>Optional comment</translate></th> |
|
120 |
<td><input name="comment" size="30" value="[% HTML.escape(comment) %]"></td> |
|
121 |
</tr> |
|
122 |
|
|
123 |
</table> |
|
124 |
</p> |
|
125 |
|
|
126 |
<p> |
|
127 |
<input type="submit" class="submit" name="action" id="update_button" value="<translate>Update</translate>"> |
|
128 |
[%- IF parts_id %] |
|
129 |
<input type="submit" class="submit" name="action" value="<translate>Create Assembly</translate>"> |
|
130 |
[%- END %] |
|
131 |
</p> |
|
132 |
</form> |
|
133 |
|
|
134 |
</body> |
|
135 |
</html> |
Auch abrufbar als: Unified diff
Erzeugnisse fertigen, erste Version fertiggestellt. Bugzilla noch oeffnen fuer rueckverfolgbarkeit - Ferner offen, Lagerplaetze und verschiedene Lager