Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 4f63ea87

Von Jan Büren vor mehr als 15 Jahren hinzugefügt

  • ID 4f63ea874f629459e1a73643595ab5e23e38e7f0
  • Vorgänger bc40c989
  • Nachfolger dc6e7f0d

Erzeugnisse fertigen, erste Version fertiggestellt. Bugzilla noch oeffnen fuer rueckverfolgbarkeit - Ferner offen, Lagerplaetze und verschiedene Lager

Unterschiede anzeigen:

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) : '&nbsp;';
293
      $column_data{stock_in_out} =  $form->{"inventory_accno_$i"} ? calculate_stock_in_out($i) : '&nbsp;';
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&ouml;nnen die gespeicherten Mengen entweder in ein Lager &uuml;berf&uuml;hrt werden, oder f&uuml;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 &uuml;berpr&uuml;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 &quot;config/authentication.pl&quot; does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei f&uuml;r die Authentifizierung &quot;config/authentication.pl&quot; wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollst&auml;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&uuml;gbaren Optionen h&auml;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