Beim Verschicken von Emails aus oe.pl heraus immer vorher speichern, weil nach dem...
[kivitendo-erp.git] / bin / mozilla / oe.pl
1 # #=====================================================================
2 # LX-Office ERP
3 # Copyright (C) 2004
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
6 #
7 #=====================================================================
8 # SQL-Ledger, Accounting
9 # Copyright (c) 1998-2003
10 #
11 #  Author: Dieter Simader
12 #   Email: dsimader@sql-ledger.org
13 #     Web: http://www.sql-ledger.org
14 #
15 #
16 # This program is free software; you can redistribute it and/or modify
17 # it under the terms of the GNU General Public License as published by
18 # the Free Software Foundation; either version 2 of the License, or
19 # (at your option) any later version.
20 #
21 # This program is distributed in the hope that it will be useful,
22 # but WITHOUT ANY WARRANTY; without even the implied warranty of
23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 # GNU General Public License for more details.
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #======================================================================
29 #
30 # Order entry module
31 # Quotation module
32 #======================================================================
33
34 use POSIX qw(strftime);
35
36 use SL::OE;
37 use SL::IR;
38 use SL::IS;
39 use SL::PE;
40 use SL::ReportGenerator;
41
42 require "bin/mozilla/io.pl";
43 require "bin/mozilla/arap.pl";
44 require "bin/mozilla/reportgenerator.pl";
45
46 1;
47
48 # end of main
49
50 # For locales.pl:
51 # $locale->text('Edit the purchase_order');
52 # $locale->text('Edit the sales_order');
53 # $locale->text('Edit the request_quotation');
54 # $locale->text('Edit the sales_quotation');
55
56 # $locale->text('Workflow purchase_order');
57 # $locale->text('Workflow sales_order');
58 # $locale->text('Workflow request_quotation');
59 # $locale->text('Workflow sales_quotation');
60
61 sub set_headings {
62   $lxdebug->enter_sub();
63
64   my ($action) = @_;
65
66   if ($form->{type} eq 'purchase_order') {
67     $form->{title}   = $action eq "edit" ?
68       $locale->text('Edit Purchase Order') :
69       $locale->text('Add Purchase Order');
70     $form->{heading} = $locale->text('Purchase Order');
71     $form->{vc}      = 'vendor';
72   }
73   if ($form->{type} eq 'sales_order') {
74     $form->{title}   = $action eq "edit" ?
75       $locale->text('Edit Sales Order') :
76       $locale->text('Add Sales Order');
77     $form->{heading} = $locale->text('Sales Order');
78     $form->{vc}      = 'customer';
79   }
80   if ($form->{type} eq 'request_quotation') {
81     $form->{title}   = $action eq "edit" ?
82       $locale->text('Edit Request for Quotation') :
83       $locale->text('Add Request for Quotation');
84     $form->{heading} = $locale->text('Request for Quotation');
85     $form->{vc}      = 'vendor';
86   }
87   if ($form->{type} eq 'sales_quotation') {
88     $form->{title}   = $action eq "edit" ?
89       $locale->text('Edit Quotation') :
90       $locale->text('Add Quotation');
91     $form->{heading} = $locale->text('Quotation');
92     $form->{vc}      = 'customer';
93   }
94
95   $lxdebug->leave_sub();
96 }
97
98 sub add {
99   $lxdebug->enter_sub();
100
101   set_headings("add");
102
103   $form->{callback} =
104     "$form->{script}?action=add&type=$form->{type}&vc=$form->{vc}&login=$form->{login}&password=$form->{password}"
105     unless $form->{callback};
106
107   &order_links;
108   &prepare_order;
109   &display_form;
110
111   $lxdebug->leave_sub();
112 }
113
114 sub edit {
115   $lxdebug->enter_sub();
116   # show history button
117   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
118   #/show hhistory button
119
120   $form->{simple_save} = 0;
121
122   set_headings("edit");
123
124   # editing without stuff to edit? try adding it first
125   if ($form->{rowcount} && !$form->{print_and_save}) {
126     map { $id++ if $form->{"multi_id_$_"} } (1 .. $form->{rowcount});
127     if (!$id) {
128
129       # reset rowcount
130       undef $form->{rowcount};
131       &add;
132       $lxdebug->leave_sub();
133       return;
134     }
135   } elsif (!$form->{id}) {
136     &add;
137     $lxdebug->leave_sub();
138     return;
139   }
140
141   if ($form->{print_and_save}) {
142     $form->{action}   = "print";
143     $form->{resubmit} = 1;
144     $language_id = $form->{language_id};
145     $printer_id = $form->{printer_id};
146   }
147
148   set_headings("edit");
149
150   &order_links;
151   &prepare_order;
152   if ($form->{print_and_save}) {
153     $form->{language_id} = $language_id;
154     $form->{printer_id} = $printer_id;
155   }
156   &display_form;
157
158   $lxdebug->leave_sub();
159 }
160
161 sub order_links {
162   $lxdebug->enter_sub();
163   # get customer/vendor
164   $form->all_vc(\%myconfig, $form->{vc},
165                 ($form->{vc} eq 'customer') ? "AR" : "AP");
166
167   # retrieve order/quotation
168   $form->{webdav}   = $webdav;
169   $form->{jsscript} = 1;
170
171   my $editing = $form->{id};
172
173   OE->retrieve(\%myconfig, \%$form);
174
175   if ($form->{payment_id}) {
176     $payment_id = $form->{payment_id};
177   }
178   if ($form->{language_id}) {
179     $language_id = $form->{language_id};
180   }
181   if ($form->{taxzone_id}) {
182     $taxzone_id = $form->{taxzone_id};
183   }
184
185   $salesman_id = $form->{salesman_id} if ($editing);
186
187
188   # if multiple rowcounts (== collective order) then check if the
189   # there were more than one customer (in that case OE::retrieve removes
190   # the content from the field)
191   if (   $form->{rowcount}
192       && $form->{type} eq 'sales_order'
193       && defined $form->{customer}
194       && $form->{customer} eq '') {
195
196     #    $main::lxdebug->message(0, "Detected Edit order with concurrent customers");
197     $form->error(
198                  $locale->text(
199                    'Collective Orders only work for orders from one customer!')
200     );
201   }
202
203   $taxincluded = $form->{taxincluded};
204   $form->{shipto} = 1 if $form->{id};
205
206   if ($form->{"all_$form->{vc}"}) {
207     unless ($form->{"$form->{vc}_id"}) {
208       $form->{"$form->{vc}_id"} = $form->{"all_$form->{vc}"}->[0]->{id};
209     }
210   }
211
212   $cp_id    = $form->{cp_id};
213   $intnotes = $form->{intnotes};
214
215   # get customer / vendor
216   if ($form->{type} =~ /(purchase_order|request_quotation)/) {
217     IR->get_vendor(\%myconfig, \%$form);
218
219     #quote all_vendor Bug 133
220     foreach $ref (@{ $form->{all_vendor} }) {
221       $ref->{name} = $form->quote($ref->{name});
222     }
223
224   }
225   if ($form->{type} =~ /sales_(order|quotation)/) {
226     IS->get_customer(\%myconfig, \%$form);
227
228     #quote all_vendor Bug 133
229     foreach $ref (@{ $form->{all_customer} }) {
230       $ref->{name} = $form->quote($ref->{name});
231     }
232
233   }
234   $form->{cp_id} = $cp_id;
235
236   if ($payment_id) {
237     $form->{payment_id} = $payment_id;
238   }
239   if ($language_id) {
240     $form->{language_id} = $language_id;
241   }
242   if ($taxzone_id) {
243     $form->{taxzone_id} = $taxzone_id;
244   }
245   $form->{intnotes} = $intnotes if $intnotes;
246   ($form->{ $form->{vc} }) = split /--/, $form->{ $form->{vc} };
247   $form->{"old$form->{vc}"} =
248     qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
249
250   # build the popup menus
251   if (@{ $form->{"all_$form->{vc}"} }) {
252     $form->{ $form->{vc} } =
253       qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
254     map { $form->{"select$form->{vc}"} .=
255 "<option>$_->{name}--$_->{id}</option>\n" }
256       (@{ $form->{"all_$form->{vc}"} });
257   }
258
259   $form->{taxincluded} = $taxincluded if ($form->{id});
260
261   # departments
262   if (@{ $form->{all_departments} }) {
263     $form->{selectdepartment} = "<option>\n";
264     $form->{department}       = "$form->{department}--$form->{department_id}";
265
266     map {
267       $form->{selectdepartment} .=
268         "<option>$_->{description}--$_->{id}</option>\n"
269     } (@{ $form->{all_departments} });
270   }
271
272   $form->{employee} = "$form->{employee}--$form->{employee_id}";
273
274   # forex
275   $form->{forex} = $form->{exchangerate};
276
277   $form->{salesman_id} = $salesman_id if ($editing);
278
279   $lxdebug->leave_sub();
280 }
281
282 sub prepare_order {
283   $lxdebug->enter_sub();
284   $form->{formname} = $form->{type} unless $form->{formname};
285
286   my $i = 0;
287   foreach $ref (@{ $form->{form_details} }) {
288     $form->{rowcount} = ++$i;
289
290     map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref};
291   }
292   for my $i (1 .. $form->{rowcount}) {
293     if ($form->{id}) {
294       $form->{"discount_$i"} =
295         $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100);
296     } else {
297       $form->{"discount_$i"} =
298         $form->format_amount(\%myconfig, $form->{"discount_$i"});
299     }
300     ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
301     $dec           = length $dec;
302     $decimalplaces = ($dec > 2) ? $dec : 2;
303
304     # copy reqdate from deliverydate for invoice -> order conversion
305     $form->{"reqdate_$i"} = $form->{"deliverydate_$i"}
306       unless $form->{"reqdate_$i"};
307
308     $form->{"sellprice_$i"} =
309       $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
310                            $decimalplaces);
311
312     (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/);
313     $dec_qty = length $dec_qty;
314     $form->{"qty_$i"} =
315       $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
316
317     map { $form->{"${_}_$i"} =~ s/\"/&quot;/g }
318       qw(partnumber description unit);
319   }
320
321   $lxdebug->leave_sub();
322 }
323
324 sub form_header {
325   $lxdebug->enter_sub();
326
327   my $checkedclosed = $form->{"closed"} ? "checked" : "";
328   my $checkeddelivered = $form->{"delivered"} ? "checked" : "";
329
330   if ($form->{old_employee_id}) {
331     $form->{employee_id} = $form->{old_employee_id};
332   }
333   if ($form->{old_salesman_id}) {
334     $form->{salesman_id} = $form->{old_salesman_id};
335   }
336
337   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
338
339
340   if ($form->{old_employee_id}) {
341     $form->{employee_id} = $form->{old_employee_id};
342   }
343   if ($form->{old_salesman_id}) {
344     $form->{salesman_id} = $form->{old_salesman_id};
345   }
346
347   map { $form->{$_} =~ s/\"/&quot;/g }
348     qw(ordnumber quonumber shippingpoint shipvia notes intnotes shiptoname
349        shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact
350        shiptophone shiptofax shiptodepartment_1 shiptodepartment_2);
351
352   # use JavaScript Calendar or not
353   $form->{jsscript} = 1;
354   $jsscript = "";
355
356   $button1 = qq|
357      <td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\">
358       <input type=button name=transdate id="trigger1" value=|
359     . $locale->text('button') . qq|></td>
360     |;
361   $button2 = qq|
362      <td width="13"><input name=reqdate id=reqdate size=11 title="$myconfig{dateformat}" value="$form->{reqdate}" onBlur=\"check_right_date_format(this)\">
363       <input type=button name=reqdate name=reqdate id="trigger2" value=|
364     . $locale->text('button') . qq|></td>
365    |;
366
367   #write Trigger
368   $jsscript =
369     Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1",
370                         "reqdate", "BL", "trigger2");
371
372   my @tmp;
373
374   if (($form->{"type"} eq "sales_order") ||
375       ($form->{"type"} eq "purchase_order")) {
376     push(@tmp, qq|
377           <input name="delivered" id="delivered" type="checkbox" class="checkbox" value="1" $checkeddelivered>
378           <label for="delivered">| . $locale->text('Delivered') . qq|</label>|);
379   }
380
381   if ($form->{id}) {
382     push(@tmp, qq|
383           <input name="closed" id="closed" type="checkbox" class="checkbox" value="1" $checkedclosed>
384           <label for="closed">| . $locale->text('Closed') . qq|</label>|);
385   }
386
387   if (@tmp) {
388     $openclosed .= qq|
389       <tr>
390         <td colspan=| . (2 * scalar(@tmp)) . qq| align=center>| . join("\n", @tmp) . qq|
391         </td>
392       </tr>
393 |;
394   }
395
396   # set option selected
397   foreach $item ($form->{vc}, currency, department, ($form->{vc} eq "customer" ? customer : vendor)) {
398     $form->{"select$item"} =~ s/ selected//;
399     $form->{"select$item"} =~
400       s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
401   }
402
403   #quote select[customer|vendor] Bug 133
404   $form->{"select$form->{vc}"} = $form->quote($form->{"select$form->{vc}"});
405
406   #substitute \n and \r to \s (bug 543)
407   $form->{"select$form->{vc}"} =~ s/[\n\r]/&nbsp;/g;
408   
409   my @old_project_ids = ($form->{"globalproject_id"});
410   map({ push(@old_project_ids, $form->{"project_id_$_"})
411           if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"}));
412
413   my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
414   $form->get_lists("contacts" => "ALL_CONTACTS",
415                    "shipto" => "ALL_SHIPTO",
416                    "projects" => { "key" => "ALL_PROJECTS",
417                                    "all" => 0,
418                                    "old_id" => \@old_project_ids },
419                    "employees" => "ALL_EMPLOYEES",
420                    "salesmen" => "ALL_SALESMEN",
421                    "taxzones" => "ALL_TAXZONES",
422                    "payments" => "ALL_PAYMENTS",
423                    "currencies" => "ALL_CURRENCIES",
424                    $vc => "ALL_" . uc($vc));
425
426   my %labels;
427   my @values = (undef);
428   foreach my $item (@{ $form->{"ALL_CONTACTS"} }) {
429     push(@values, $item->{"cp_id"});
430     $labels{$item->{"cp_id"}} = $item->{"cp_name"} .
431       ($item->{"cp_abteilung"} ? " ($item->{cp_abteilung})" : "");
432   }
433
434   my $contact;
435   if (scalar @values > 1) {
436     $contact = qq|
437     <tr>
438       <th align="right">| . $locale->text('Contact Person') . qq|</th>
439       <td>| .
440       NTI($cgi->popup_menu('-name' => 'cp_id', '-values' => \@values, '-style' => 'width: 250px',
441                            '-labels' => \%labels, '-default' => $form->{"cp_id"}))
442       . qq|
443       </td>
444     </tr>|;
445   }
446
447   %labels = ();
448   @values = ();
449
450   foreach my $item (@{ $form->{($form->{vc} eq "customer" ? "ALL_CUSTOMERS" : "ALL_VENDORS")}}) {
451     push(@values, $item->{"name"}.qq|--|.$item->{"id"});
452     $labels{$item->{"name"}.qq|--|.$item->{"id"}} = $item->{name};
453   }
454
455   $vc = qq|
456       <input type="hidden" name="$form->{vc}_id" value="| . H($form->{"$form->{vc}_id"}) . qq|">
457       <input type="hidden" name="old$form->{vc}" value="| . H($form->{"old$form->{vc}"}) . qq|">
458       <th align="right">| . $locale->text(ucfirst($form->{vc})) . qq|</th>
459       <td>| . 
460         (($myconfig{vclimit} <=  scalar(@values)) 
461               ? qq|<input type="text" value="| . H(($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/)) . qq|" name="$form->{vc}">| 
462               : (NTI($cgi->popup_menu('-name' => "$form->{vc}", '-default' => $form->{"old$form->{vc}"}, 
463                              '-onChange' => 'document.getElementById(\'update_button\').click();',
464                              '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')))) . qq|
465         <input type="button" value="?" onclick="show_vc_details('$form->{vc}')">
466       </td><input type=hidden name="select$form->{vc}" value="| .
467     Q($form->{"select$form->{vc}"}) . qq|">|;
468
469   %labels = ();
470   @values = ("");
471   foreach my $item (@{ $form->{"ALL_PAYMENTS"} }) {
472     push(@values, $item->{"id"});
473     $labels{$item->{"id"}} = $item->{"description"};
474   }
475   
476   $payments = qq|
477     <th align="right">| . $locale->text('Payment Terms') . qq|</th>
478     <td>| .
479     NTI($cgi->popup_menu('-name' => 'payment_id', '-values' => \@values, '-style' => 'width: 250px',
480                          '-labels' => \%labels, '-default' => $form->{payment_id}))
481     . qq|</td>|;
482
483   %labels = ();
484   @values = ("");
485   foreach my $item (@{ $form->{"ALL_SHIPTO"} }) {
486     push(@values, $item->{"shipto_id"});
487     $labels{$item->{"shipto_id"}} = join "; ", grep { $_ } map { $item->{"shipto${_}" } } qw(name department_1 street city);
488   }
489
490   my $shipto;
491   if (scalar @values > 1) {
492     $shipto = qq|
493     <tr>
494       <th align="right">| . $locale->text('Shipping Address') . qq|</th>
495       <td>| .
496       NTI($cgi->popup_menu('-name' => 'shipto_id', '-values' => \@values, '-style' => 'width: 250px',
497                            '-labels' => \%labels, '-default' => $form->{"shipto_id"}))
498     . qq|</td>|;
499   }
500
501   %labels = ();
502   @values = ("");
503   foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
504     push(@values, $item->{"id"});
505     $labels{$item->{"id"}} = $item->{"projectnumber"};
506   }
507   my $globalprojectnumber =
508     NTI($cgi->popup_menu('-name' => 'globalproject_id', '-values' => \@values,
509                          '-labels' => \%labels,
510                          '-default' => $form->{"globalproject_id"}));
511   
512   my $salesmen = "";
513   %labels = ();
514   @values = ();
515   if ($form->{type} =~ /^sales_/) {
516     foreach my $item (@{ $form->{"ALL_SALESMEN"} }) {
517       push(@values, $item->{"id"});
518       $labels{$item->{"id"}} = ($item->{"name"} ne "" ? $item->{"name"} : $item->{"login"});
519     }
520     $salesmen =
521       qq|<tr>
522           <th align="right">| . $locale->text('Salesman') . qq|</th>
523           <td>| .
524       NTI($cgi->popup_menu('-name' => 'salesman_id', '-default' => $form->{"salesman_id"} ? $form->{"salesman_id"} : $form->{"employee_id"},
525                            '-values' => \@values, '-labels' => \%labels))
526       . qq|</td>
527          </tr>|;
528   }
529
530   %labels = ();
531   @values = ();
532   foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
533     push(@values, $item->{"id"});
534     $labels{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
535   }
536
537   my $employee = qq|
538     <tr>
539       <th align="right">| . $locale->text('Employee') . qq|</th>
540       <td>| .
541         NTI($cgi->popup_menu('-name' => 'employee_id', '-default' => $form->{"employee_id"},
542                              '-values' => \@values, '-labels' => \%labels)) . qq|
543       </td>
544     </tr>|;
545
546   %labels = ();
547   @values = ();
548   foreach my $item (@{ $form->{"ALL_TAXZONES"} }) {
549     push(@values, $item->{"id"});
550     $labels{$item->{"id"}} = $item->{"description"};
551   }
552
553   $taxzone = qq|
554     <tr>
555       <th align="right">| . $locale->text('Steuersatz') . qq|</th>
556       <td>| .
557         NTI($cgi->popup_menu('-name' => 'taxzone_id', '-default' => $form->{"taxzone_id"},
558                              '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')) . qq|
559       </td>
560     </tr>|;
561
562   %labels = ();
563   @values = ();
564   my $i = 0;
565   foreach my $item (@{ $form->{"ALL_CURRENCIES"} }) {
566     push(@values, $item);
567     $labels{$item} = $item;
568   }
569
570   $form->{currency} = $form->{defaultcurrency} unless $form->{currency};
571   my $currencies;
572   if (scalar @values) {
573     $currencies = qq|
574     <tr>
575       <th align="right">| . $locale->text('Currency') . qq|</th>
576       <td>| .
577         NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"},
578                              '-values' => \@values, '-labels' => \%labels)) . qq|
579       </td>
580     </tr>|;
581   }
582
583   $form->{exchangerate} =
584     $form->format_amount(\%myconfig, $form->{exchangerate});
585
586   if (!$form->{exchangerate}) {
587     $form->{exchangerate} = "";
588   }
589
590   if (($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}) {
591     $creditwarning = 1;
592   } else {
593     $creditwarning = 0;
594   }
595
596   $form->{creditlimit} =
597     $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0");
598   $form->{creditremaining} =
599     $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0");
600
601   $exchangerate = qq|
602 <input type=hidden name=forex value=$form->{forex}>
603 |;
604
605   if ($form->{currency} ne $form->{defaultcurrency}) {
606     if ($form->{forex}) {
607       $exchangerate .=
608           qq|<th align=right>|
609         . $locale->text('Exchangerate')
610         . qq|</th><td>$form->{exchangerate}</td>
611       <input type=hidden name=exchangerate value=$form->{exchangerate}>
612 |;
613     } else {
614       $exchangerate .=
615           qq|<th align=right>|
616         . $locale->text('Exchangerate')
617         . qq|</th><td><input name=exchangerate size=10 value=$form->{exchangerate}></td>|;
618     }
619   }
620
621   if ($form->{business}) {
622     $business = qq|
623               <tr>
624           <th align="right">| . ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type')) . qq|</th>
625           <td>$form->{business}; | . $locale->text('Trade Discount') . qq| |
626       . $form->format_amount(\%myconfig, $form->{tradediscount} * 100)
627       . qq| %</td>
628         </tr>
629 |;
630   }
631
632   if ($form->{max_dunning_level}) {
633     $dunning = qq|
634       <tr>
635         <th align="right">| . $locale->text('Max. Dunning Level') . qq|:</th>
636         <td>
637           <b>$form->{max_dunning_level}</b>;
638           | . $locale->text('Dunning Amount') . qq|: <b>|
639         . $form->format_amount(\%myconfig, $form->{dunning_amount},2)
640         . qq|</b>
641         </td>
642       </tr>
643 |;
644   }
645
646   if ($form->{type} !~ /_quotation$/) {
647     $ordnumber = qq|
648               <tr>
649                 <th width=70% align=right nowrap>| . $locale->text('Order Number') . qq|</th>
650                 <td><input name=ordnumber size=11 value="$form->{ordnumber}"></td>
651               </tr>
652               <tr>
653                 <th width=70% align=right nowrap>|
654       . $locale->text('Quotation Number') . qq|</th>
655                 <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
656               </tr>
657               <tr>
658                 <th width=70% align=right nowrap>|
659       . $locale->text('Customer Order Number') . qq|</th>
660                 <td><input name=cusordnumber size=11 value="$form->{cusordnumber}"></td>
661               </tr>
662               <tr>
663                 <th align=right nowrap>| . $locale->text('Order Date') . qq|</th>
664                 $button1
665
666               </tr>
667               <tr>
668                 <th align=right nowrap=true>| . $locale->text('Required by') . qq|</th>
669                 $button2
670               </tr>
671 |;
672
673     $n = ($form->{creditremaining} =~ /-/) ? "0" : "1";
674
675     $creditremaining = qq|
676         $shipto
677         <tr>
678           <td align="right">| . $locale->text('Credit Limit') . qq|</td>
679           <td>$form->{creditlimit}; | . $locale->text('Remaining') . qq| <span class="plus$n">$form->{creditremaining}</span></td>
680         </tr>
681               </tr>
682 |;
683   } else {
684     $reqlabel =
685       ($form->{type} eq 'sales_quotation')
686       ? $locale->text('Valid until')
687       : $locale->text('Required by');
688     if ($form->{type} eq 'sales_quotation') {
689       $ordnumber = qq|
690               <tr>
691                 <th width=70% align=right nowrap>|
692         . $locale->text('Quotation Number') . qq|</th>
693                 <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
694                 <input type=hidden name=ordnumber value="$form->{ordnumber}">
695               </tr>
696 |;
697     } else {
698       $ordnumber = qq|
699               <tr>
700                 <th width=70% align=right nowrap>| . $locale->text('RFQ Number') . qq|</th>
701                 <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
702                 <input type=hidden name=ordnumber value="$form->{ordnumber}">
703               </tr>
704 |;
705
706     }
707
708     $ordnumber .= qq|
709               <tr>
710                 <th align=right nowrap>| . $locale->text('Quotation Date') . qq|</th>
711                 $button1
712               </tr>
713               <tr>
714                 <th align=right nowrap=true>$reqlabel</th>
715                 $button2
716               </tr>
717 |;
718     $creditremaining = qq| <tr>
719                             <td colspan=4></td>
720                             $shipto
721                           </tr>|;
722   }
723
724   $department = qq|
725               <tr>
726                 <th align="right" nowrap>| . $locale->text('Department') . qq|</th>
727                 <td colspan=3><select name=department style="width: 250px">$form->{selectdepartment}</select>
728                 <input type=hidden name=selectdepartment value="$form->{selectdepartment}">
729                 </td>
730               </tr> | if $form->{selectdepartment};
731
732   if ($form->{type} eq 'sales_order') {
733     if ($form->{selectemployee}) {
734       $employee .= qq|
735         <input type="hidden" name="customer_klass" value="$form->{customer_klass}">|;
736     }
737   } else {
738     $employee .= qq|
739       <input type="hidden" name="customer_klass" value="$form->{customer_klass}">|;
740   }
741   if ($form->{resubmit} && ($form->{format} eq "html")) {
742     $onload =
743       qq|window.open('about:blank','Beleg'); document.oe.target = 'Beleg';document.oe.submit()|;
744   } elsif ($form->{resubmit}) {
745     $onload = qq|document.oe.submit()|;
746   } else {
747     $onload = "focus()";
748   }
749
750   $credittext = $locale->text('Credit Limit exceeded!!!');
751   if ($creditwarning) {
752     $onload = qq|alert('$credittext')|;
753   }
754   
755   $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
756   $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
757   
758   $form->{"javascript"} .= qq|<script type="text/javascript" src="js/show_form_details.js"></script>|;
759   # show history button js
760   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
761   #/show history button js
762   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
763
764   $form->header;
765
766   print qq|
767 <body onLoad="$onload">
768
769 <form method=post name=oe action=$form->{script}>
770
771  <script type="text/javascript" src="js/common.js"></script>
772  <script type="text/javascript" src="js/delivery_customer_selection.js"></script>
773  <script type="text/javascript" src="js/vendor_selection.js"></script>
774  <script type="text/javascript" src="js/calculate_qty.js"></script>
775 |;
776
777   $form->hide_form(qw(id action type vc formname media format proforma queued printed emailed
778                       title discount creditlimit creditremaining tradediscount business
779                       max_dunning_level dunning_amount));
780
781   print qq|
782
783 <table width=100%>
784   <tr class=listtop>
785     <th class=listtop>$form->{title}</th>
786   </tr>
787   <tr height="5"></tr>
788   <tr>
789     <td>
790       <table width="100%">
791         <tr valign=top>
792           <td>
793             <table width=100%>
794               <tr>
795         $vc
796         $contact
797               $creditremaining
798               $business
799               $dunning
800               $taxzone
801               $department
802               <tr>
803                 $currencies
804                 $exchangerate
805               </tr>
806               <tr>
807                 <th align=right>| . $locale->text('Shipping Point') . qq|</th>
808                 <td colspan=3><input name=shippingpoint size=35 value="$form->{shippingpoint}"></td>
809               </tr>
810               <tr>
811                 <th align=right>| . $locale->text('Ship via') . qq|</th>
812                 <td colspan=3><input name=shipvia size=35 value="$form->{shipvia}"></td>
813               </tr>
814               <tr>
815                 <th align="right">| . $locale->text('Transaction description') . qq|</th>
816                 <td colspan="3"><input name="transaction_description" size="35" value="| . H($form->{transaction_description}) . qq|"></td>
817               </tr>|;
818 #              <tr>
819 #                 <td colspan=4>
820 #                   <table>
821 #                     <tr>
822 #                       <td colspan=2>
823 #                         <button type="button" onclick="delivery_customer_selection_window('delivery_customer_string','delivery_customer_id')">| . $locale->text('Choose Customer') . qq|</button>
824 #                       </td>
825 #                       <td colspan=2><input type=hidden name=delivery_customer_id value="$form->{delivery_customer_id}">
826 #                       <input size=45 id=delivery_customer_string name=delivery_customer_string value="$form->{delivery_customer_string}"></td>
827 #                     </tr>
828 #                     <tr>
829 #                       <td colspan=2>
830 #                         <button type="button" onclick="vendor_selection_window('delivery_vendor_string','delivery_vendor_id')">| . $locale->text('Choose Vendor') . qq|</button>
831 #                       </td>
832 #                       <td colspan=2><input type=hidden name=delivery_vendor_id value="$form->{delivery_vendor_id}">
833 #                       <input size=45 id=vendor_string name=delivery_vendor_string value="$form->{delivery_vendor_string}"></td>
834 #                     </tr>
835 #                   </table>
836 #                 </td>
837 #               </tr>
838 print qq|           </table>
839           </td>
840           <td align=right>
841             <table>
842               $openclosed
843               $employee
844         $salesmen
845               $ordnumber
846               <tr>
847           <th width="70%" align="right" nowrap>| . $locale->text('Project Number') . qq|</th>
848           <td>$globalprojectnumber</td>
849               </tr>
850             </table>
851           </td>
852         </tr>
853       </table>
854     </td>
855   </tr>
856
857 $jsscript
858
859 <!-- shipto are in hidden variables -->
860
861 <input type=hidden name=shiptoname value="$form->{shiptoname}">
862 <input type=hidden name=shiptostreet value="$form->{shiptostreet}">
863 <input type=hidden name=shiptozipcode value="$form->{shiptozipcode}">
864 <input type=hidden name=shiptocity value="$form->{shiptocity}">
865 <input type=hidden name=shiptocountry value="$form->{shiptocountry}">
866 <input type=hidden name=shiptocontact value="$form->{shiptocontact}">
867 <input type=hidden name=shiptophone value="$form->{shiptophone}">
868 <input type=hidden name=shiptofax value="$form->{shiptofax}">
869 <input type=hidden name=shiptodepartment_1 value="$form->{shiptodepartment_1}">
870 <input type=hidden name=shiptodepartment_2 value="$form->{shiptodepartment_2}">
871 <input type=hidden name=shiptoemail value="$form->{shiptoemail}">
872
873 <!-- email variables -->
874 <input type=hidden name=message value="$form->{message}">
875 <input type=hidden name=email value="$form->{email}">
876 <input type=hidden name=subject value="$form->{subject}">
877 <input type=hidden name=cc value="$form->{cc}">
878 <input type=hidden name=bcc value="$form->{bcc}">
879
880 <input type=hidden name=taxpart value="$form->{taxpart}">
881 <input type=hidden name=taxservice value="$form->{taxservice}">
882
883 <input type=hidden name=taxaccounts value="$form->{taxaccounts}">
884 |;
885
886   foreach $item (split / /, $form->{taxaccounts}) {
887     print qq|
888 <input type=hidden name="${item}_rate" value=$form->{"${item}_rate"}>
889 <input type=hidden name="${item}_description" value="$form->{"${item}_description"}">
890 |;
891   }
892   $lxdebug->leave_sub();
893 }
894
895 sub form_footer {
896   $lxdebug->enter_sub();
897
898   $form->{invtotal} = $form->{invsubtotal};
899
900   if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) {
901     $rows = 2;
902   }
903   if (($introws = $form->numtextrows($form->{intnotes}, 35, 8)) < 2) {
904     $introws = 2;
905   }
906   $rows = ($rows > $introws) ? $rows : $introws;
907   $notes =
908     qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
909   $intnotes =
910     qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
911
912   $form->{taxincluded} = ($form->{taxincluded}) ? "checked" : "";
913
914   $taxincluded = "";
915   if ($form->{taxaccounts}) {
916     $taxincluded = qq|
917               <input name=taxincluded class=checkbox type=checkbox value=1 $form->{taxincluded}> <b>|
918       . $locale->text('Tax Included') . qq|</b><br><br>
919 |;
920   }
921
922   if (!$form->{taxincluded}) {
923
924     foreach $item (split / /, $form->{taxaccounts}) {
925       if ($form->{"${item}_base"}) {
926         $form->{invtotal} += $form->{"${item}_total"} =
927           $form->round_amount(
928                              $form->{"${item}_base"} * $form->{"${item}_rate"},
929                              2);
930         $form->{"${item}_total"} =
931           $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
932
933         $tax .= qq|
934               <tr>
935                 <th align=right>$form->{"${item}_description"}&nbsp;|
936                                     . $form->{"${item}_rate"} * 100 .qq|%</th>
937                 <td align=right>$form->{"${item}_total"}</td>
938               </tr>
939 |;
940       }
941     }
942
943     $form->{invsubtotal} =
944       $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
945
946     $subtotal = qq|
947               <tr>
948                 <th align=right>| . $locale->text('Subtotal') . qq|</th>
949                 <td align=right>$form->{invsubtotal}</td>
950               </tr>
951 |;
952
953   }
954
955   if ($form->{taxincluded}) {
956     foreach $item (split / /, $form->{taxaccounts}) {
957       if ($form->{"${item}_base"}) {
958         $form->{"${item}_total"} =
959           $form->round_amount(
960                            ($form->{"${item}_base"} * $form->{"${item}_rate"} /
961                               (1 + $form->{"${item}_rate"})
962                            ),
963                            2);
964         $form->{"${item}_netto"} =
965           $form->round_amount(
966                           ($form->{"${item}_base"} - $form->{"${item}_total"}),
967                           2);
968         $form->{"${item}_total"} =
969           $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
970         $form->{"${item}_netto"} =
971           $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2);
972
973         $tax .= qq|
974               <tr>
975                 <th align=right>Enthaltene $form->{"${item}_description"}&nbsp;|
976                                     . $form->{"${item}_rate"} * 100 .qq|%</th>
977                 <td align=right>$form->{"${item}_total"}</td>
978               </tr>
979               <tr>
980                 <th align=right>Nettobetrag</th>
981                 <td align=right>$form->{"${item}_netto"}</td>
982               </tr>
983 |;
984       }
985     }
986
987   }
988
989   $form->{oldinvtotal} = $form->{invtotal};
990   $form->{invtotal}    =
991     $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0);
992
993   print qq|
994   <tr>
995     <td>
996       <table width=100%>
997         <tr valign=bottom>
998           <td>
999             <table>
1000               <tr>
1001                 <th align=left>| . $locale->text('Notes') . qq|</th>
1002                 <th align=left>| . $locale->text('Internal Notes') . qq|</th>
1003               </tr>
1004               <tr valign=top>
1005                 <td>$notes</td>
1006                 <td>$intnotes</td>
1007               </tr>
1008           <tr>
1009     $payments
1010             </tr>
1011       </table>
1012           </td>
1013           <td>
1014             <table>
1015 |;
1016
1017   if ($form->{type} =~ /^sales_/) {
1018     print qq|
1019             <tr>
1020               <th  align=left>| . $locale->text('Ertrag') . qq|</th>
1021               <td>| .  $form->format_amount(\%myconfig, $form->{marge_total}, 2, 0) . qq|</td>
1022             </tr>
1023             <tr>
1024               <th  align=left>| . $locale->text('Ertrag prozentual') . qq|</th>
1025               <td>| .  $form->format_amount(\%myconfig, $form->{marge_percent}, 2, 0) . qq| %</td>
1026             </tr>
1027 |;
1028   }
1029
1030   print qq|
1031             <input type=hidden name="marge_total" value="$form->{"marge_total"}">
1032             <input type=hidden name="marge_percent" value="$form->{"marge_percent"}">
1033             </table>
1034           </td>
1035           <td align=right>
1036             $taxincluded
1037             <table>
1038               $subtotal
1039               $tax
1040               <tr>
1041                 <th align=right>| . $locale->text('Total') . qq|</th>
1042                 <td align=right>$form->{invtotal}</td>
1043               </tr>
1044             </table>
1045           </td>
1046         </tr>
1047       </table>
1048     </td>
1049   </tr>
1050 <input type=hidden name=oldinvtotal value=$form->{oldinvtotal}>
1051 <input type=hidden name=oldtotalpaid value=$totalpaid>
1052   <tr>
1053     <td><hr size=3 noshade></td>
1054   </tr>
1055 |;
1056
1057   if ($webdav) {
1058     $webdav_list = qq|
1059
1060   <tr>
1061     <th class=listtop align=left>Dokumente im Webdav-Repository</th>
1062   </tr>
1063     <table width=100%>
1064       <td align=left width=30%><b>Dateiname</b></td>
1065       <td align=left width=70%><b>Webdavlink</b></td>
1066 |;
1067     foreach $file (@{ $form->{WEBDAV} }) {
1068       $webdav_list .= qq|
1069       <tr>
1070         <td align="left">$file->{name}</td>
1071         <td align="left"><a href="$file->{link}">$file->{type}</a></td>
1072       </tr>
1073 |;
1074     }
1075     $webdav_list .= qq|
1076     </table>
1077   </tr>
1078   <tr>
1079     <td><hr size=3 noshade></td>
1080   </tr>
1081 |;
1082
1083     print $webdav_list;
1084   }
1085
1086   print qq|
1087   <tr>
1088     <td>
1089 |;
1090   print_options();
1091
1092   print qq|
1093     </td>
1094   </tr>
1095 </table>
1096
1097 | . $locale->text("Edit the $form->{type}") . qq|<br>
1098 <input class=submit type=submit name=action id=update_button value="|
1099     . $locale->text('Update') . qq|">
1100 <input class=submit type=submit name=action value="|
1101     . $locale->text('Ship to') . qq|">
1102 <input class=submit type=submit name=action value="|
1103     . $locale->text('Print') . qq|">
1104 <input class=submit type=submit name=action value="|
1105     . $locale->text('E-mail') . qq|">
1106 <input class=submit type=submit name=action value="|
1107     . $locale->text('Save') . qq|">
1108 <input class=submit type=submit name=action value="|
1109     . $locale->text('Save and Close') . qq|">
1110 |;
1111
1112   if (($form->{id})) {
1113     print qq|
1114         <input type="button" class="submit" onclick="set_history_window(|
1115         . Q($form->{id})
1116         . qq|);" name="history" id="history" value="|
1117         . $locale->text('history')
1118         . qq|">
1119
1120 <br>| . $locale->text("Workflow $form->{type}") . qq|<br>
1121 <input class=submit type=submit name=action value="|
1122       . $locale->text('Save as new') . qq|">
1123 <input class=submit type=submit name=action value="|
1124       . $locale->text('Delete') . qq|">|;
1125     if (($form->{type} =~ /sales_quotation$/)) {
1126       print qq|
1127 <input class=submit type=submit name=action value="|
1128         . $locale->text('Sales Order') . qq|">|;
1129     }
1130     if ($form->{type} =~ /request_quotation$/) {
1131       print qq|
1132 <input class=submit type=submit name=action value="|
1133         . $locale->text('Purchase Order') . qq|">|;
1134     }
1135     print qq|
1136 <input class=submit type=submit name=action value="|
1137       . $locale->text('Invoice') . qq|">
1138 |;
1139
1140     if ($form->{type} =~ /sales_order$/) {
1141       print qq|
1142 <br>$form->{heading} als neue Vorlage verwenden f&uuml;r<br>
1143 <input class=submit type=submit name=action value="|
1144         . $locale->text('Purchase Order') . qq|">
1145 <input class=submit type=submit name=action value="|
1146         . $locale->text('Quotation') . qq|">
1147 |;
1148
1149     } elsif ($form->{type} =~ /purchase_order$/) {
1150       print qq|
1151 <br>$form->{heading} als neue Vorlage verwenden f&uuml;r<br>
1152 <input class=submit type=submit name=action value="|
1153         . $locale->text('Sales Order') . qq|">
1154 <input class=submit type=submit name=action value="|
1155         . $locale->text('Request for Quotation') . qq|">
1156 |;
1157
1158     } else {
1159       print qq|
1160 <br>$form->{heading} als neue Vorlage verwenden f&uuml;r<br>
1161 <input class=submit type=submit name=action value="|
1162         . $locale->text('Order') . qq|">
1163 |;
1164     }
1165   }
1166
1167   $form->hide_form("saved_xyznumber");
1168
1169   print qq|
1170
1171 <input type=hidden name=rowcount value=$form->{rowcount}>
1172
1173 <input name=callback type=hidden value="$form->{callback}">
1174
1175 <input type=hidden name=login value=$form->{login}>
1176 <input type=hidden name=password value=$form->{password}>
1177
1178 </form>
1179
1180 </body>
1181 </html>
1182 |;
1183   $lxdebug->leave_sub();
1184 }
1185
1186 sub update {
1187   $lxdebug->enter_sub();
1188
1189   set_headings($form->{"id"} ? "edit" : "add");
1190
1191   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
1192     qw(exchangerate creditlimit creditremaining);
1193   $form->{update} = 1;
1194       
1195   if($form->{payment_id}) { 
1196     $payment_id = $form->{payment_id};
1197   }
1198   
1199   &check_name($form->{vc});
1200   
1201   if($form->{payment_id} eq "") { 
1202     $form->{payment_id} = $payment_id;
1203   }
1204   
1205   $buysell              = 'buy';
1206   $buysell              = 'sell' if ($form->{vc} eq 'vendor');
1207   $form->{exchangerate} = $exchangerate
1208     if (
1209         $form->{forex} = (
1210                   $exchangerate =
1211                     $form->check_exchangerate(
1212                     \%myconfig, $form->{currency}, $form->{transdate}, $buysell
1213                     )));
1214
1215   # for pricegroups
1216   $i = $form->{rowcount};
1217
1218   $exchangerate = ($form->{exchangerate}) ? $form->{exchangerate} : 1;
1219
1220   if (   ($form->{"partnumber_$i"} eq "")
1221       && ($form->{"description_$i"} eq "")
1222       && ($form->{"partsgroup_$i"}  eq "")) {
1223
1224     $form->{creditremaining} += ($form->{oldinvtotal} - $form->{oldtotalpaid});
1225     &check_form;
1226
1227   } else {
1228
1229     if (   $form->{type} eq 'purchase_order'
1230         || $form->{type} eq 'request_quotation') {
1231       IR->retrieve_item(\%myconfig, \%$form);
1232     }
1233     if ($form->{type} eq 'sales_order' || $form->{type} eq 'sales_quotation') {
1234       IS->retrieve_item(\%myconfig, \%$form);
1235     }
1236
1237     my $rows = scalar @{ $form->{item_list} };
1238
1239     $form->{"discount_$i"} =
1240       $form->format_amount(\%myconfig, $form->{discount} * 100);
1241
1242     if ($rows) {
1243       $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
1244
1245       if ($rows > 1) {
1246
1247         &select_item;
1248         exit;
1249
1250       } else {
1251
1252         $sellprice = $form->parse_amount(\%myconfig, $form->{"sellprice_$i"});
1253         if ($form->{"not_discountable_$i"}) {
1254           $form->{"discount_$i"} = 0;
1255         }
1256         map { $form->{item_list}[$i]{$_} =~ s/\"/&quot;/g }
1257           qw(partnumber description unit);
1258         map { $form->{"${_}_$i"} = $form->{item_list}[0]{$_} }
1259           keys %{ $form->{item_list}[0] };
1260         if ($form->{"part_payment_id_$i"} ne "") {
1261           $form->{payment_id} = $form->{"part_payment_id_$i"};
1262         }
1263
1264         $s = ($sellprice) ? $sellprice : $form->{"sellprice_$i"};
1265
1266         ($dec) = ($s =~ /\.(\d+)/);
1267         $dec           = length $dec;
1268         $decimalplaces = ($dec > 2) ? $dec : 2;
1269
1270         if ($sellprice) {
1271           $form->{"sellprice_$i"} = $sellprice;
1272         } else {
1273
1274           $form->{"sellprice_$i"} *= (1 - $form->{tradediscount});
1275
1276           # if there is an exchange rate adjust sellprice
1277           $form->{"sellprice_$i"} /= $exchangerate;
1278         }
1279
1280         $amount =
1281           $form->{"sellprice_$i"} * $form->{"qty_$i"} *
1282           (1 - $form->{"discount_$i"} / 100);
1283         map { $form->{"${_}_base"} = 0 } (split / /, $form->{taxaccounts});
1284         map { $form->{"${_}_base"} += $amount }
1285           (split / /, $form->{"taxaccounts_$i"});
1286         map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) }
1287           split / /, $form->{taxaccounts}
1288           if !$form->{taxincluded};
1289
1290         $form->{creditremaining} -= $amount;
1291
1292         $form->{"sellprice_$i"} =
1293           $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
1294                                $decimalplaces);
1295         $form->{"qty_$i"} =
1296           $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
1297
1298         # get pricegroups for parts
1299         IS->get_pricegroups_for_parts(\%myconfig, \%$form);
1300
1301         # build up html code for prices_$i
1302         &set_pricegroup($i);
1303       }
1304
1305       &display_form;
1306
1307     } else {
1308
1309       # ok, so this is a new part
1310       # ask if it is a part or service item
1311
1312       if (   $form->{"partsgroup_$i"}
1313           && ($form->{"partsnumber_$i"} eq "")
1314           && ($form->{"description_$i"} eq "")) {
1315         $form->{rowcount}--;
1316         $form->{"discount_$i"} = "";
1317         &display_form;
1318       } else {
1319
1320         $form->{"id_$i"}   = 0;
1321         $form->{"unit_$i"} = $locale->text('ea');
1322
1323         &new_item;
1324
1325       }
1326     }
1327   }
1328
1329   $lxdebug->leave_sub();
1330 }
1331
1332 sub search {
1333   $lxdebug->enter_sub();
1334
1335   if ($form->{type} eq 'purchase_order') {
1336     $form->{title} = $locale->text('Purchase Orders');
1337     $form->{vc}    = 'vendor';
1338     $ordlabel      = $locale->text('Order Number');
1339     $ordnumber     = 'ordnumber';
1340     $employee      = $locale->text('Employee');
1341   }
1342
1343   if ($form->{type} eq 'request_quotation') {
1344     $form->{title} = $locale->text('Request for Quotations');
1345     $form->{vc}    = 'vendor';
1346     $ordlabel      = $locale->text('RFQ Number');
1347     $ordnumber     = 'quonumber';
1348     $employee      = $locale->text('Employee');
1349   }
1350
1351   if ($form->{type} eq 'sales_order') {
1352     $form->{title} = $locale->text('Sales Orders');
1353     $form->{vc}    = 'customer';
1354     $ordlabel      = $locale->text('Order Number');
1355     $ordnumber     = 'ordnumber';
1356     $employee      = $locale->text('Employee');
1357   }
1358
1359   if ($form->{type} eq 'sales_quotation') {
1360     $form->{title} = $locale->text('Quotations');
1361     $form->{vc}    = 'customer';
1362     $ordlabel      = $locale->text('Quotation Number');
1363     $ordnumber     = 'quonumber';
1364     $employee      = $locale->text('Employee');
1365   }
1366
1367   # setup vendor / customer selection
1368   $form->all_vc(\%myconfig, $form->{vc},
1369                 ($form->{vc} eq 'customer') ? "AR" : "AP");
1370
1371   # departments
1372   if (@{ $form->{all_departments} }) {
1373     $form->{selectdepartment} = "<option>\n";
1374
1375     map {
1376       $form->{selectdepartment} .=
1377         "<option>$_->{description}--$_->{id}</option>\n"
1378     } (@{ $form->{all_departments} });
1379   }
1380
1381   $department = qq|
1382         <tr>
1383           <th align=right nowrap>| . $locale->text('Department') . qq|</th>
1384           <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
1385         </tr>
1386 | if $form->{selectdepartment};
1387
1388   my $delivered;
1389   if (($form->{"type"} eq "sales_order") ||
1390       ($form->{"type"} eq "purchase_order")) {
1391     $delivered = qq|
1392         <tr>
1393           <td><input name="notdelivered" id="notdelivered" class="checkbox" type="checkbox" value="1" checked>
1394             <label for="notdelivered">|. $locale->text('Not delivered') . qq|</label></td>
1395           <td><input name="delivered" id="delivered" class="checkbox" type="checkbox" value="1" checked>
1396             <label for="delivered">| . $locale->text('Delivered') . qq|</label></td>
1397         </tr>
1398 |;
1399   }
1400
1401   # use JavaScript Calendar or not
1402   $form->{jsscript} = 1;
1403   $jsscript = "";
1404
1405   $button1 = qq|
1406      <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
1407      <input type=button name=transdatefrom id="trigger3" value=|
1408     . $locale->text('button') . qq|></td>
1409     |;
1410   $button2 = qq|
1411      <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
1412      <input type=button name=transdateto name=transdateto id="trigger4" value=|
1413     . $locale->text('button') . qq|></td>
1414    |;
1415
1416   #write Trigger
1417   $jsscript =
1418     Form->write_trigger(\%myconfig, "2", "transdatefrom", "BR", "trigger3",
1419                         "transdateto", "BL", "trigger4");
1420
1421   my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
1422
1423   $form->get_lists("projects" => { "key" => "ALL_PROJECTS",
1424                                    "all" => 1 },
1425                    "employees" => "ALL_EMPLOYEES",
1426                    $vc => "ALL_" . uc($vc));
1427
1428   my %labels = ();
1429   my @values = ("");
1430   foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
1431     push(@values, $item->{"id"});
1432     $labels{$item->{"id"}} = $item->{"projectnumber"};
1433   }
1434   my $projectnumber =
1435     NTI($cgi->popup_menu('-name' => 'project_id', '-values' => \@values,
1436                          '-labels' => \%labels));
1437
1438   #employees
1439   %labels = ();
1440   @values = ("");
1441   foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
1442     push(@values, $item->{"id"});
1443     $labels{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
1444   }
1445
1446   my $employee_block = qq|
1447     <tr>
1448       <th align="right">| . $locale->text('Employee') . qq|</th>
1449       <td>| .
1450         NTI($cgi->popup_menu('-name'   => 'employee_id',
1451                              '-values' => \@values,
1452                              '-labels' => \%labels)) . qq|
1453       </td>
1454     </tr>|;
1455
1456   %labels = ();
1457   @values = ("");
1458
1459   foreach my $item (@{ $form->{($form->{vc} eq "customer" ? "ALL_CUSTOMERS" : "ALL_VENDORS")}}) {
1460     push(@values, $item->{name}.qq|--|.$item->{"id"});
1461     $labels{$item->{name}.qq|--|.$item->{"id"}} = $item->{"name"};
1462   }
1463
1464   my $vc_label = $form->{vc} eq "customer" ? $locale->text('Customer') : $locale->text('Vendor');
1465   $vc =
1466     $myconfig{vclimit} <=  scalar(@values)
1467     ? qq|<input type="text" value="| . H(($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/)) . qq|" name="$form->{vc}">| 
1468     : NTI($cgi->popup_menu('-name' => "$form->{vc}",
1469                            '-default' => $form->{"old$form->{vc}"},
1470                            '-onChange' => 'document.getElementById(\'update_button\').click();',
1471                            '-values' => \@values,
1472                            '-labels' => \%labels));
1473   $form->header;
1474
1475   print qq|
1476 <body>
1477
1478 <form method=post action=$form->{script}>
1479
1480 <table width=100%>
1481   <tr>
1482     <th class=listtop>$form->{title}</th>
1483   </tr>
1484   <tr height="5"></tr>
1485   <tr>
1486     <td>
1487       <table>
1488         <tr>
1489           <th align=right>$vc_label</th>
1490           <td colspan=3>$vc</td>
1491         </tr>
1492         $department
1493         <tr>
1494           <th align=right>$ordlabel</th>
1495           <td colspan=3><input name="$ordnumber" size=20></td>
1496         </tr>
1497   $employee_block
1498         <tr>
1499           <th align="right">| . $locale->text('Transaction description') . qq|</th>
1500           <td colspan="3"><input name="transaction_description" size=20></td>
1501         </tr>
1502         <tr>
1503           <th align="right">| . $locale->text("Project Number") . qq|</th>
1504           <td colspan="3">$projectnumber</td>
1505         </tr>
1506         <tr>
1507           <th align=right>| . $locale->text('From') . qq|</th>
1508           $button1
1509           <th align=right>| . $locale->text('Bis') . qq|</th>
1510           $button2
1511         </tr>
1512         <input type=hidden name=sort value=transdate>
1513         <tr>
1514           <th align=right>| . $locale->text('Include in Report') . qq|</th>
1515           <td colspan=5>
1516             <table>
1517         <tr>
1518           <td><input type="checkbox" name="open" value="1" id="open" checked>
1519             <label for="open">| . $locale->text("Open") . qq|</td>
1520           <td><input type="checkbox" name="closed" value="1" id="closed">
1521             <label for="closed">| . $locale->text("Closed") . qq|</td>
1522         </tr>
1523         $delivered
1524               <tr>
1525                 <td><input name="l_id" class=checkbox type=checkbox value=Y>
1526                 | . $locale->text('ID') . qq|</td>
1527                 <td><input name="l_$ordnumber" class=checkbox type=checkbox value=Y checked> $ordlabel</td>
1528                 <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> |
1529     . $locale->text('Date') . qq|</td>
1530                 <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> |
1531     . $locale->text('Required by') . qq|</td>
1532               </tr>
1533               <tr>
1534                 <td><input name="l_name" class=checkbox type=checkbox value=Y checked> $vc_label</td>
1535                 <td><input name="l_employee" class=checkbox type=checkbox value=Y checked> $employee</td>
1536                 <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> |
1537     . $locale->text('Ship via') . qq|</td>
1538               </tr>
1539               <tr>
1540                 <td><input name="l_netamount" class=checkbox type=checkbox value=Y> |
1541     . $locale->text('Amount') . qq|</td>
1542                 <td><input name="l_tax" class=checkbox type=checkbox value=Y> |
1543     . $locale->text('Tax') . qq|</td>
1544                 <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> |
1545     . $locale->text('Total') . qq|</td>
1546               </tr>
1547               <tr>
1548                 <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> |
1549     .             $locale->text('Ertrag') . qq|</td>
1550                 <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> |
1551     .             $locale->text('Ertrag prozentual') . qq|</td>
1552               </tr>
1553               <tr>
1554           <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> |
1555           . $locale->text('Project Number') . qq|</td>
1556           <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> |
1557           . $locale->text('Transaction description') . qq|</td>
1558               </tr>
1559               <tr>
1560                 <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> |
1561     . $locale->text('Subtotal') . qq|</td>
1562               </tr>
1563             </table>
1564           </td>
1565         </tr>
1566       </table>
1567     </td>
1568   </tr>
1569   <tr><td colspan=4><hr size=3 noshade></td></tr>
1570 </table>
1571
1572 $jsscript
1573
1574 <br>
1575 <input type=hidden name=nextsub value=orders>
1576 <input type=hidden name=login value=$form->{login}>
1577 <input type=hidden name=password value=$form->{password}>
1578 <input type=hidden name=vc value=$form->{vc}>
1579 <input type=hidden name=type value=$form->{type}>
1580
1581 <input class=submit type=submit name=action value="|
1582     . $locale->text('Continue') . qq|">
1583 </form>
1584
1585 </body>
1586 </html>
1587 |;
1588
1589   $lxdebug->leave_sub();
1590 }
1591
1592 sub create_subtotal_row {
1593   $lxdebug->enter_sub();
1594
1595   my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_;
1596
1597   my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } };
1598
1599   map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } @{ $subtotal_columns };
1600
1601   $row->{tax}->{data} = $form->format_amount(\%myconfig, $totals->{amount} - $totals->{netamount}, 2);
1602
1603   map { $totals->{$_} = 0 } @{ $subtotal_columns };
1604
1605   $lxdebug->leave_sub();
1606
1607   return $row;
1608 }
1609
1610 sub orders {
1611   $lxdebug->enter_sub();
1612
1613   $ordnumber = ($form->{type} =~ /_order$/) ? "ordnumber" : "quonumber";
1614
1615   ($form->{ $form->{vc} }, $form->{"${form->{vc}}_id"}) = split(/--/, $form->{ $form->{vc} });
1616
1617   $form->{sort} ||= 'transdate';
1618
1619   OE->transactions(\%myconfig, \%$form);
1620
1621   $form->{rowcount} = scalar @{ $form->{OE} };
1622
1623   my @columns = (
1624     "transdate",               "reqdate",
1625     "id",                      $ordnumber,
1626     "name",                    "netamount",
1627     "tax",                     "amount",
1628     "curr",                    "employee",
1629     "shipvia",                 "globalprojectnumber",
1630     "transaction_description", "open",
1631     "delivered", "marge_total", "marge_percent"
1632   );
1633
1634   # only show checkboxes if gotten here via sales_order form.
1635   my $allow_multiple_orders = $form->{type} eq 'sales_order';
1636   if ($allow_multiple_orders) {
1637     unshift @columns, "ids";
1638   }
1639
1640   $form->{l_open}      = $form->{l_closed} = "Y" if ($form->{open}      && $form->{closed});
1641   $form->{l_delivered} = "Y"                     if ($form->{delivered} && $form->{notdelivered});
1642
1643   my $attachment_basename;
1644   if ($form->{vc} eq 'vendor') {
1645     if ($form->{type} eq 'purchase_order') {
1646       $form->{title}       = $locale->text('Purchase Orders');
1647       $attachment_basename = $locale->text('purchase_order_list');
1648     } else {
1649       $form->{title}       = $locale->text('Request for Quotations');
1650       $attachment_basename = $locale->text('rfq_list');
1651     }
1652
1653   } else {
1654     if ($form->{type} eq 'sales_order') {
1655       $form->{title}       = $locale->text('Sales Orders');
1656       $attachment_basename = $locale->text('sales_order_list');
1657     } else {
1658       $form->{title}       = $locale->text('Quotations');
1659       $attachment_basename = $locale->text('quotation_list');
1660     }
1661   }
1662
1663   my $report = SL::ReportGenerator->new(\%myconfig, $form);
1664
1665   my @hidden_variables = map { "l_${_}" } @columns;
1666   push @hidden_variables, "l_subtotal", $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered ordnumber quonumber
1667                                                         transaction_description transdatefrom transdateto type vc employee_id);
1668
1669   my $href = build_std_url('action=orders', grep { $form->{$_} } @hidden_variables);
1670
1671   my %column_defs = (
1672     'ids'                     => { 'text' => '', },
1673     'transdate'               => { 'text' => $locale->text('Date'), },
1674     'reqdate'                 => { 'text' => $locale->text('Required by'), },
1675     'id'                      => { 'text' => $locale->text('ID'), },
1676     'ordnumber'               => { 'text' => $locale->text('Order'), },
1677     'quonumber'               => { 'text' => $form->{type} eq "request_quotation" ? $locale->text('RFQ') : $locale->text('Quotation'), },
1678     'name'                    => { 'text' => $form->{vc} eq 'customer' ? $locale->text('Customer') : $locale->text('Vendor'), },
1679     'netamount'               => { 'text' => $locale->text('Amount'), },
1680     'tax'                     => { 'text' => $locale->text('Tax'), },
1681     'amount'                  => { 'text' => $locale->text('Total'), },
1682     'curr'                    => { 'text' => $locale->text('Curr'), },
1683     'employee'                => { 'text' => $locale->text('Salesperson'), },
1684     'shipvia'                 => { 'text' => $locale->text('Ship via'), },
1685     'globalprojectnumber'     => { 'text' => $locale->text('Project Number'), },
1686     'transaction_description' => { 'text' => $locale->text('Transaction description'), },
1687     'open'                    => { 'text' => $locale->text('Open'), },
1688     'delivered'               => { 'text' => $locale->text('Delivered'), },
1689     'marge_total'                   => { 'text' => $locale->text('Ertrag'), },
1690     'marge_percent'           => { 'text' => $locale->text('Ertrag prozentual'), }
1691   );
1692
1693   foreach my $name (qw(id transdate reqdate quonumber ordnumber name employee shipvia)) {
1694     $column_defs{$name}->{link} = $href . "&sort=$name";
1695   }
1696
1697   my %column_alignment = map { $_ => 'right' } qw(netamount tax amount curr);
1698
1699   $form->{"l_type"} = "Y";
1700   map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
1701   $column_defs{ids}->{visible} = $allow_multiple_orders ? 'HTML' : 0;
1702
1703   $report->set_columns(%column_defs);
1704   $report->set_column_order(@columns);
1705
1706   $report->set_export_options('orders', @hidden_variables);
1707
1708   $report->set_sort_indicator($form->{sort}, 1);
1709
1710   my @options;
1711   if ($form->{customer}) {
1712     push @options, $locale->text('Customer') . " : $form->{customer}";
1713   }
1714   if ($form->{vendor}) {
1715     push @options, $locale->text('Vendor') . " : $form->{vendor}";
1716   }
1717   if ($form->{department}) {
1718     ($department) = split /--/, $form->{department};
1719     push @options, $locale->text('Department') . " : $department";
1720   }
1721   if ($form->{ordnumber}) {
1722     push @options, $locale->text('Order Number') . " : $form->{ordnumber}";
1723   }
1724   if ($form->{notes}) {
1725     push @options, $locale->text('Notes') . " : $form->{notes}";
1726   }
1727   if ($form->{transaction_description}) {
1728     push @options, $locale->text('Transaction description') . " : $form->{transaction_description}";
1729   }
1730   if ($form->{transdatefrom}) {
1731     push @options, $locale->text('From') . "&nbsp;" . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
1732   }
1733   if ($form->{transdateto}) {
1734     push @options, $locale->text('Bis') . "&nbsp;" . $locale->date(\%myconfig, $form->{transdateto}, 1);
1735   }
1736   if ($form->{open}) {
1737     push @options, $locale->text('Open');
1738   }
1739   if ($form->{closed}) {
1740     push @options, $locale->text('Closed');
1741   }
1742   if ($form->{delivered}) {
1743     push @options, $locale->text('Delivered');
1744   }
1745   if ($form->{notdelivered}) {
1746     push @options, $locale->text('Not delivered');
1747   }
1748
1749   $report->set_options('top_info_text'        => join("\n", @options),
1750                        'raw_top_info_text'    => $form->parse_html_template('oe/orders_top'),
1751                        'raw_bottom_info_text' => $form->parse_html_template('oe/orders_bottom', { 'SHOW_CONTINUE_BUTTON' => $allow_multiple_orders }),
1752                        'output_format'        => 'HTML',
1753                        'title'                => $form->{title},
1754                        'attachment_basename'  => $attachment_basename . strftime('_%Y%m%d', localtime time),
1755     );
1756   $report->set_options_from_form();
1757
1758   # add sort and escape callback, this one we use for the add sub
1759   $form->{callback} = $href .= "&sort=$form->{sort}";
1760
1761   # escape callback for href
1762   $callback = $form->escape($href);
1763
1764   my @subtotal_columns = qw(netamount amount marge_total);
1765
1766   my %totals    = map { $_ => 0 } @subtotal_columns;
1767   my %subtotals = map { $_ => 0 } @subtotal_columns;
1768
1769   my $idx = 0;
1770
1771   my $edit_url = build_std_url('action=edit', 'type', 'vc');
1772
1773   foreach $oe (@{ $form->{OE} }) {
1774     map { $oe->{$_} *= $oe->{exchangerate} } @subtotal_columns;
1775
1776     $oe->{tax}       = $oe->{amount} - $oe->{netamount};
1777     $oe->{open}      = $oe->{closed}    ? $locale->text('No')  : $locale->text('Yes');
1778     $oe->{delivered} = $oe->{delivered} ? $locale->text('Yes') : $locale->text('No');
1779
1780     map { $subtotals{$_} += $oe->{$_};
1781           $totals{$_}    += $oe->{$_} } @subtotal_columns;
1782
1783     map { $oe->{$_} = $form->format_amount(\%myconfig, $oe->{$_}, 2) } qw(netamount tax amount marge_total marge_percent);
1784
1785     my $row = { };
1786
1787     foreach my $column (@columns) {
1788       next if ($column eq 'ids');
1789       $row->{$column} = {
1790         'data'  => $oe->{$column},
1791         'align' => $column_alignment{$column},
1792       };
1793     }
1794
1795     $row->{ids} = {
1796       'raw_data' =>   $cgi->hidden('-name' => "trans_id_${idx}", '-value' => $oe->{id})
1797                     . $cgi->checkbox('-name' => "multi_id_${idx}", '-value' => 1, '-label' => ''),
1798       'valign'   => 'center',
1799       'align'    => 'center',
1800     };
1801
1802     $row->{$ordnumber}->{link} = $edit_url . "&id=" . E($oe->{id}) . "&callback=${callback}";
1803
1804     my $row_set = [ $row ];
1805
1806     if (($form->{l_subtotal} eq 'Y')
1807         && (($idx == (scalar @{ $form->{OE} } - 1))
1808             || ($oe->{ $form->{sort} } ne $form->{OE}->[$idx + 1]->{ $form->{sort} }))) {
1809       push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, \@subtotal_columns, 'listsubtotal');
1810     }
1811
1812     $report->add_data($row_set);
1813
1814     $idx++;
1815   }
1816
1817   $report->add_separator();
1818   $report->add_data(create_subtotal_row(\%totals, \@columns, \%column_alignment, \@subtotal_columns, 'listtotal'));
1819
1820   $report->generate_with_headers();
1821
1822   $lxdebug->leave_sub();
1823 }
1824
1825 sub check_delivered_flag {
1826   $lxdebug->enter_sub();
1827
1828   if (($form->{type} ne 'sales_order') && ($form->{type} ne 'purchase_order')) {
1829     return $lxdebug->leave_sub();
1830   }
1831
1832   my $all_delivered = 0;
1833
1834   foreach my $i (1 .. $form->{rowcount}) {
1835     next if (!$form->{"id_$i"});
1836
1837     if ($form->parse_amount(\%myconfig, $form->{"qty_$i"}) == $form->parse_amount(\%myconfig, $form->{"ship_$i"})) {
1838       $all_delivered = 1;
1839       next;
1840     }
1841
1842     $all_delivered = 0;
1843     last;
1844   }
1845
1846   $form->{delivered} = 1 if $all_delivered;
1847
1848   $lxdebug->leave_sub();
1849 }
1850
1851 sub save_and_close {
1852   $lxdebug->enter_sub();
1853
1854   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
1855
1856   if ($form->{type} =~ /_order$/) {
1857     $form->isblank("transdate", $locale->text('Order Date missing!'));
1858   } else {
1859     $form->isblank("transdate", $locale->text('Quotation Date missing!'));
1860   }
1861
1862   my $idx = $form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber";
1863   $form->{$idx} =~ s/^\s*//g;
1864   $form->{$idx} =~ s/\s*$//g;
1865
1866   $msg = ucfirst $form->{vc};
1867   $form->isblank($form->{vc}, $locale->text($msg . " missing!"));
1868
1869   # $locale->text('Customer missing!');
1870   # $locale->text('Vendor missing!');
1871
1872   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'))
1873     if ($form->{currency} ne $form->{defaultcurrency});
1874
1875   &validate_items;
1876   
1877   if($form->{payment_id}) { 
1878     $payment_id = $form->{payment_id};
1879   }
1880   
1881   # if the name changed get new values
1882   if (&check_name($form->{vc})) {
1883     if($form->{payment_id} eq "") { 
1884       $form->{payment_id} = $payment_id;
1885     }
1886     &update;
1887     exit;
1888   }
1889
1890   $form->{id} = 0 if $form->{saveasnew};
1891
1892   # this is for the internal notes section for the [email] Subject
1893   if ($form->{type} =~ /_order$/) {
1894     if ($form->{type} eq 'sales_order') {
1895       $form->{label} = $locale->text('Sales Order');
1896
1897       $numberfld = "sonumber";
1898       $ordnumber = "ordnumber";
1899     } else {
1900       $form->{label} = $locale->text('Purchase Order');
1901
1902       $numberfld = "ponumber";
1903       $ordnumber = "ordnumber";
1904     }
1905
1906     $err = $locale->text('Cannot save order!');
1907
1908     check_delivered_flag();
1909
1910   } else {
1911     if ($form->{type} eq 'sales_quotation') {
1912       $form->{label} = $locale->text('Quotation');
1913
1914       $numberfld = "sqnumber";
1915       $ordnumber = "quonumber";
1916     } else {
1917       $form->{label} = $locale->text('Request for Quotation');
1918
1919       $numberfld = "rfqnumber";
1920       $ordnumber = "quonumber";
1921     }
1922
1923     $err = $locale->text('Cannot save quotation!');
1924
1925   }
1926
1927   # get new number in sequence if no number is given or if saveasnew was requested
1928   if (!$form->{$ordnumber} || $form->{saveasnew}) {
1929     $form->{$ordnumber} = $form->update_defaults(\%myconfig, $numberfld);
1930   }
1931
1932   relink_accounts();
1933
1934   $form->error($err) if (!OE->save(\%myconfig, \%$form));
1935
1936   # saving the history
1937   if(!exists $form->{addition}) {
1938     $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
1939         $form->{addition} = "SAVED";
1940         $form->save_history($form->dbconnect(\%myconfig));
1941   }
1942   # /saving the history
1943
1944   $form->redirect($form->{label} . " $form->{$ordnumber} " .
1945                   $locale->text('saved!'));
1946
1947   $lxdebug->leave_sub();
1948 }
1949
1950 sub save {
1951   $lxdebug->enter_sub();
1952
1953   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
1954
1955
1956   if ($form->{type} =~ /_order$/) {
1957     $form->isblank("transdate", $locale->text('Order Date missing!'));
1958   } else {
1959     $form->isblank("transdate", $locale->text('Quotation Date missing!'));
1960   }
1961
1962   my $idx = $form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber";
1963   $form->{$idx} =~ s/^\s*//g;
1964   $form->{$idx} =~ s/\s*$//g;
1965
1966   $msg = ucfirst $form->{vc};
1967   $form->isblank($form->{vc}, $locale->text($msg . " missing!"));
1968
1969   # $locale->text('Customer missing!');
1970   # $locale->text('Vendor missing!');
1971
1972   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'))
1973     if ($form->{currency} ne $form->{defaultcurrency});
1974
1975   &validate_items;
1976   
1977   if($form->{payment_id}) { 
1978     $payment_id = $form->{payment_id};
1979   }
1980   
1981   # if the name changed get new values
1982   if (&check_name($form->{vc})) {
1983     if($form->{payment_id} eq "") { 
1984       $form->{payment_id} = $payment_id;
1985     }
1986     &update;
1987     exit;
1988   }
1989
1990   $form->{id} = 0 if $form->{saveasnew};
1991
1992   # this is for the internal notes section for the [email] Subject
1993   if ($form->{type} =~ /_order$/) {
1994     if ($form->{type} eq 'sales_order') {
1995       $form->{label} = $locale->text('Sales Order');
1996
1997       $numberfld = "sonumber";
1998       $ordnumber = "ordnumber";
1999     } else {
2000       $form->{label} = $locale->text('Purchase Order');
2001
2002       $numberfld = "ponumber";
2003       $ordnumber = "ordnumber";
2004     }
2005
2006     $err = $locale->text('Cannot save order!');
2007
2008     check_delivered_flag();
2009
2010   } else {
2011     if ($form->{type} eq 'sales_quotation') {
2012       $form->{label} = $locale->text('Quotation');
2013
2014       $numberfld = "sqnumber";
2015       $ordnumber = "quonumber";
2016     } else {
2017       $form->{label} = $locale->text('Request for Quotation');
2018
2019       $numberfld = "rfqnumber";
2020       $ordnumber = "quonumber";
2021     }
2022
2023     $err = $locale->text('Cannot save quotation!');
2024
2025   }
2026
2027   $form->{$ordnumber} = $form->update_defaults(\%myconfig, $numberfld)
2028     unless $form->{$ordnumber};
2029
2030   relink_accounts();
2031
2032   OE->save(\%myconfig, \%$form);
2033
2034   # saving the history
2035   if(!exists $form->{addition}) {
2036     $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
2037         $form->{addition} = "SAVED";
2038         $form->save_history($form->dbconnect(\%myconfig));
2039   }
2040   # /saving the history 
2041
2042   $form->{simple_save} = 1;
2043   if(!$form->{print_and_save}) {
2044     set_headings("edit");
2045     &update;
2046     exit;
2047   }
2048   $lxdebug->leave_sub();
2049 }
2050
2051 sub delete {
2052   $lxdebug->enter_sub();
2053
2054   $form->header;
2055
2056   if ($form->{type} =~ /_order$/) {
2057     $msg       = $locale->text('Are you sure you want to delete Order Number');
2058     $ordnumber = 'ordnumber';
2059   } else {
2060     $msg = $locale->text('Are you sure you want to delete Quotation Number');
2061     $ordnumber = 'quonumber';
2062   }
2063
2064   print qq|
2065 <body>
2066
2067 <form method=post action=$form->{script}>
2068 |;
2069
2070   # delete action variable
2071   map { delete $form->{$_} } qw(action header);
2072
2073   foreach $key (keys %$form) {
2074     $form->{$key} =~ s/\"/&quot;/g;
2075     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
2076   }
2077
2078   print qq|
2079 <h2 class=confirm>| . $locale->text('Confirm!') . qq|</h2>
2080
2081 <h4>$msg $form->{$ordnumber}</h4>
2082 <p>
2083 <input type="hidden" name="yes_nextsub" value="delete_order_quotation">
2084 <input name=action class=submit type=submit value="|
2085     . $locale->text('Yes') . qq|">
2086 <button class=submit type=button onclick="history.back()">|
2087     . $locale->text('No') . qq|</button>
2088 </form>
2089
2090 </body>
2091 </html>
2092 |;
2093
2094   $lxdebug->leave_sub();
2095 }
2096
2097 sub delete_order_quotation {
2098   $lxdebug->enter_sub();
2099
2100   if ($form->{type} =~ /_order$/) {
2101     $msg = $locale->text('Order deleted!');
2102     $err = $locale->text('Cannot delete order!');
2103   } else {
2104     $msg = $locale->text('Quotation deleted!');
2105     $err = $locale->text('Cannot delete quotation!');
2106   }
2107   if (OE->delete(\%myconfig, \%$form, $spool)){
2108     # saving the history
2109     if(!exists $form->{addition}) {
2110       $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
2111           $form->{addition} = "DELETED";
2112           $form->save_history($form->dbconnect(\%myconfig));
2113     }
2114     # /saving the history 
2115     $form->info($msg);
2116     exit();
2117   }
2118   $form->error($err);
2119
2120   $lxdebug->leave_sub();
2121 }
2122
2123 sub invoice {
2124   $lxdebug->enter_sub();
2125
2126   $form->{old_employee_id} = $form->{employee_id};
2127   $form->{old_salesman_id} = $form->{salesman_id};
2128
2129   if ($form->{type} =~ /_order$/) {
2130
2131     # these checks only apply if the items don't bring their own ordnumbers/transdates.
2132     # The if clause ensures that by searching for empty ordnumber_#/transdate_# fields.
2133     $form->isblank("ordnumber", $locale->text('Order Number missing!'))
2134       if (+{ map { $form->{"ordnumber_$_"}, 1 } (1 .. $form->{rowcount} - 1) }->{''});
2135     $form->isblank("transdate", $locale->text('Order Date missing!'))
2136       if (+{ map { $form->{"transdate_$_"}, 1 } (1 .. $form->{rowcount} - 1) }->{''});
2137
2138     # also copy deliverydate from the order
2139     $form->{deliverydate} = $form->{reqdate} if $form->{reqdate};
2140     $form->{orddate} = $form->{transdate};
2141   } else {
2142     $form->isblank("quonumber", $locale->text('Quotation Number missing!'));
2143     $form->isblank("transdate", $locale->text('Quotation Date missing!'));
2144     $form->{ordnumber} = "";
2145     $form->{quodate} = $form->{transdate};
2146   }
2147   
2148   if($form->{payment_id}) { 
2149     $payment_id = $form->{payment_id};
2150   }
2151   
2152   # if the name changed get new values
2153   if (&check_name($form->{vc})) {
2154     if($form->{payment_id} eq "") { 
2155       $form->{payment_id} = $payment_id;
2156     }
2157     &update;
2158     exit;
2159   }
2160
2161   $form->{cp_id} *= 1;
2162
2163   for $i (1 .. $form->{rowcount}) {
2164     map({ $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig,
2165                                                      $form->{"${_}_${i}"})
2166             if ($form->{"${_}_${i}"}) }
2167         qw(ship qty sellprice listprice basefactor));
2168   }
2169
2170   if (   $form->{type} =~ /_order/
2171       && $form->{currency} ne $form->{defaultcurrency}) {
2172
2173     # check if we need a new exchangerate
2174     $buysell = ($form->{type} eq 'sales_order') ? "buy" : "sell";
2175
2176     $orddate      = $form->current_date(\%myconfig);
2177     $exchangerate =
2178       $form->check_exchangerate(\%myconfig, $form->{currency}, $orddate,
2179                                 $buysell);
2180
2181     if (!$exchangerate) {
2182       &backorder_exchangerate($orddate, $buysell);
2183       exit;
2184     }
2185   }
2186
2187   # close orders/quotations
2188   $form->{closed} = 1;
2189
2190   # save order if one ordnumber has been given
2191   # if not it's most likely a collective order, which can't be saved back
2192   # so they just have to be closed
2193   if (($form->{ordnumber} ne '') || ($form->{quonumber} ne '')) {
2194     OE->close_order(\%myconfig, \%$form) if ($form->{id});
2195   } else {
2196     OE->close_orders(\%myconfig, \%$form);
2197   }
2198
2199   $form->{transdate} = $form->{invdate} = $form->current_date(\%myconfig);
2200   $form->{duedate} =
2201     $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
2202
2203   $form->{id}     = '';
2204   $form->{closed} = 0;
2205   $form->{rowcount}--;
2206   $form->{shipto} = 1;
2207
2208   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
2209
2210   if ($form->{type} =~ /_order$/) {
2211     $form->{exchangerate} = $exchangerate;
2212     &create_backorder;
2213   }
2214
2215   if (   $form->{type} eq 'purchase_order'
2216       || $form->{type} eq 'request_quotation') {
2217     $form->{title}  = $locale->text('Add Vendor Invoice');
2218     $form->{script} = 'ir.pl';
2219     $script         = "ir";
2220     $buysell        = 'sell';
2221   }
2222   if ($form->{type} eq 'sales_order' || $form->{type} eq 'sales_quotation') {
2223     $form->{title}  = $locale->text('Add Sales Invoice');
2224     $form->{script} = 'is.pl';
2225     $script         = "is";
2226     $buysell        = 'buy';
2227   }
2228
2229   # bo creates the id, reset it
2230   map { delete $form->{$_} }
2231     qw(id subject message cc bcc printed emailed queued);
2232   $form->{ $form->{vc} } =~ s/--.*//g;
2233   $form->{type} = "invoice";
2234
2235   # locale messages
2236   $locale = new Locale "$myconfig{countrycode}", "$script";
2237
2238   require "bin/mozilla/$form->{script}";
2239
2240   map { $form->{"select$_"} = "" } ($form->{vc}, currency);
2241
2242   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
2243     qw(creditlimit creditremaining);
2244
2245   $currency = $form->{currency};
2246   &invoice_links;
2247
2248   $form->{currency}     = $currency;
2249   $form->{exchangerate} = "";
2250   $form->{forex}        = "";
2251   $form->{exchangerate} = $exchangerate
2252     if (
2253         $form->{forex} = (
2254                     $exchangerate =
2255                       $form->check_exchangerate(
2256                       \%myconfig, $form->{currency}, $form->{invdate}, $buysell
2257                       )));
2258
2259   $form->{creditremaining} -= ($form->{oldinvtotal} - $form->{ordtotal});
2260
2261   &prepare_invoice;
2262
2263   # format amounts
2264   for $i (1 .. $form->{rowcount}) {
2265     $form->{"discount_$i"} =
2266       $form->format_amount(\%myconfig, $form->{"discount_$i"});
2267
2268     ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
2269     $dec           = length $dec;
2270     $decimalplaces = ($dec > 2) ? $dec : 2;
2271
2272     # copy delivery date from reqdate for order -> invoice conversion
2273     $form->{"deliverydate_$i"} = $form->{"reqdate_$i"}
2274       unless $form->{"deliverydate_$i"};
2275
2276     $form->{"sellprice_$i"} =
2277       $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
2278                            $decimalplaces);
2279
2280     (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/);
2281     $dec_qty = length $dec_qty;
2282     $form->{"qty_$i"} =
2283       $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
2284
2285     map { $form->{"${_}_$i"} =~ s/\"/&quot;/g }
2286       qw(partnumber description unit);
2287
2288   }
2289
2290   &display_form;
2291
2292   $lxdebug->leave_sub();
2293 }
2294
2295 sub backorder_exchangerate {
2296   $lxdebug->enter_sub();
2297   my ($orddate, $buysell) = @_;
2298
2299   $form->header;
2300
2301   print qq|
2302 <body>
2303
2304 <form method=post action=$form->{script}>
2305 |;
2306
2307   # delete action variable
2308   map { delete $form->{$_} } qw(action header exchangerate);
2309
2310   foreach $key (keys %$form) {
2311     $form->{$key} =~ s/\"/&quot;/g;
2312     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
2313   }
2314
2315   $form->{title} = $locale->text('Add Exchangerate');
2316
2317   print qq|
2318
2319 <input type=hidden name=login value=$form->{login}>
2320 <input type=hidden name=password value=$form->{password}>
2321
2322 <input type=hidden name=exchangeratedate value=$orddate>
2323 <input type=hidden name=buysell value=$buysell>
2324
2325 <table width=100%>
2326   <tr><th class=listtop>$form->{title}</th></tr>
2327   <tr height="5"></tr>
2328   <tr>
2329     <td>
2330       <table>
2331         <tr>
2332           <th align=right>| . $locale->text('Currency') . qq|</th>
2333           <td>$form->{currency}</td>
2334         </tr>
2335         <tr>
2336           <th align=right>| . $locale->text('Date') . qq|</th>
2337           <td>$orddate</td>
2338         </tr>
2339         <tr>
2340           <th align=right>| . $locale->text('Exchangerate') . qq|</th>
2341           <td><input name=exchangerate size=11></td>
2342         </tr>
2343       </table>
2344     </td>
2345   </tr>
2346 </table>
2347
2348 <hr size=3 noshade>
2349
2350 <br>
2351 <input type=hidden name=nextsub value=save_exchangerate>
2352
2353 <input name=action class=submit type=submit value="|
2354     . $locale->text('Continue') . qq|">
2355
2356 </form>
2357
2358 </body>
2359 </html>
2360 |;
2361
2362   $lxdebug->leave_sub();
2363 }
2364
2365 sub save_exchangerate {
2366   $lxdebug->enter_sub();
2367
2368   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'));
2369   $form->{exchangerate} =
2370     $form->parse_amount(\%myconfig, $form->{exchangerate});
2371   $form->save_exchangerate(\%myconfig, $form->{currency},
2372                            $form->{exchangeratedate},
2373                            $form->{exchangerate}, $form->{buysell});
2374
2375   &invoice;
2376
2377   $lxdebug->leave_sub();
2378 }
2379
2380 sub create_backorder {
2381   $lxdebug->enter_sub();
2382
2383   $form->{shipped} = 1;
2384
2385   # figure out if we need to create a backorder
2386   # items aren't saved if qty != 0
2387
2388   for $i (1 .. $form->{rowcount}) {
2389     $totalqty  += $qty  = $form->{"qty_$i"};
2390     $totalship += $ship = $form->{"ship_$i"};
2391
2392     $form->{"qty_$i"} = $qty - $ship;
2393   }
2394
2395   if ($totalship == 0) {
2396     map { $form->{"ship_$_"} = $form->{"qty_$_"} } (1 .. $form->{rowcount});
2397     $form->{ordtotal} = 0;
2398     $form->{shipped}  = 0;
2399     return;
2400   }
2401
2402   if ($totalqty == $totalship) {
2403     map { $form->{"qty_$_"} = $form->{"ship_$_"} } (1 .. $form->{rowcount});
2404     $form->{ordtotal} = 0;
2405     return;
2406   }
2407
2408   @flds = (
2409     qw(partnumber description qty ship unit sellprice discount id inventory_accno bin income_accno expense_accno listprice assembly taxaccounts partsgroup)
2410   );
2411
2412   for $i (1 .. $form->{rowcount}) {
2413     map {
2414       $form->{"${_}_$i"} =
2415         $form->format_amount(\%myconfig, $form->{"${_}_$i"})
2416     } qw(sellprice discount);
2417   }
2418
2419   relink_accounts();
2420
2421   OE->save(\%myconfig, \%$form);
2422
2423   # rebuild rows for invoice
2424   @a     = ();
2425   $count = 0;
2426
2427   for $i (1 .. $form->{rowcount}) {
2428     $form->{"qty_$i"} = $form->{"ship_$i"};
2429
2430     if ($form->{"qty_$i"}) {
2431       push @a, {};
2432       $j = $#a;
2433       map { $a[$j]->{$_} = $form->{"${_}_$i"} } @flds;
2434       $count++;
2435     }
2436   }
2437
2438   $form->redo_rows(\@flds, \@a, $count, $form->{rowcount});
2439   $form->{rowcount} = $count;
2440
2441   $lxdebug->leave_sub();
2442 }
2443
2444 sub save_as_new {
2445   $lxdebug->enter_sub();
2446
2447   $form->{saveasnew} = 1;
2448   $form->{closed}    = 0;
2449   map { delete $form->{$_} } qw(printed emailed queued);
2450
2451   # Let Lx-Office assign a new order number if the user hasn't changed the
2452   # previous one. If it has been changed manually then use it as-is.
2453   my $idx = $form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber";
2454   $form->{$idx} =~ s/^\s*//g;
2455   $form->{$idx} =~ s/\s*$//g;
2456   if ($form->{saved_xyznumber} &&
2457       ($form->{saved_xyznumber} eq $form->{$idx})) {
2458     delete($form->{$idx});
2459   }
2460
2461   &save;
2462
2463   $lxdebug->leave_sub();
2464 }
2465
2466 sub check_for_direct_delivery_yes {
2467   $lxdebug->enter_sub();
2468
2469   $form->{direct_delivery_checked} = 1;
2470   delete @{$form}{grep /^shipto/, keys %{ $form }};
2471   map { s/^CFDD_//; $form->{$_} = $form->{"CFDD_${_}"} } grep /^CFDD_/, keys %{ $form };
2472   $form->{shipto} = 1;
2473   purchase_order();
2474   $lxdebug->leave_sub();
2475 }
2476
2477 sub check_for_direct_delivery_no {
2478   $lxdebug->enter_sub();
2479
2480   $form->{direct_delivery_checked} = 1;
2481   delete @{$form}{grep /^shipto/, keys %{ $form }};
2482   purchase_order();
2483
2484   $lxdebug->leave_sub();
2485 }
2486
2487 sub check_for_direct_delivery {
2488   $lxdebug->enter_sub();
2489
2490   if ($form->{direct_delivery_checked}
2491       || (!$form->{shiptoname} && !$form->{shiptostreet} && !$form->{shipto_id})) {
2492     $lxdebug->leave_sub();
2493     return;
2494   }
2495
2496   if ($form->{shipto_id}) {
2497     Common->get_shipto_by_id(\%myconfig, $form, $form->{shipto_id}, "CFDD_");
2498
2499   } else {
2500     map { $form->{"CFDD_${_}"} = $form->{$_ } } grep /^shipto/, keys %{ $form };
2501   }
2502
2503   delete $form->{action};
2504   $form->{VARIABLES} = [ map { { "key" => $_, "value" => $form->{$_} } } grep { ref $_ eq "" } keys %{ $form } ];
2505
2506   $form->header();
2507   print $form->parse_html_template("oe/check_for_direct_delivery");
2508
2509   $lxdebug->leave_sub();
2510
2511   exit 0;
2512 }
2513
2514 sub purchase_order {
2515   $lxdebug->enter_sub();
2516
2517   if ($form->{type} eq 'sales_order') {
2518     check_for_direct_delivery();
2519   }
2520
2521   if (   $form->{type} eq 'sales_quotation'
2522       || $form->{type} eq 'request_quotation') {
2523     OE->close_order(\%myconfig, \%$form);
2524   }
2525
2526   if ($form->{type} =~ /^sales_/) {
2527     delete($form->{ordnumber});
2528   }
2529
2530   $form->{cp_id} *= 1;
2531
2532   $form->{title} = $locale->text('Add Purchase Order');
2533   $form->{vc}    = "vendor";
2534   $form->{type}  = "purchase_order";
2535
2536   &poso;
2537
2538   $lxdebug->leave_sub();
2539 }
2540
2541 sub sales_order {
2542   $lxdebug->enter_sub();
2543
2544   if (   $form->{type} eq 'sales_quotation'
2545       || $form->{type} eq 'request_quotation') {
2546     OE->close_order(\%myconfig, $form);
2547   }
2548
2549   if ($form->{type} eq "purchase_order") {
2550     delete($form->{ordnumber});
2551   }
2552
2553   $form->{cp_id} *= 1;
2554
2555   $form->{title} = $locale->text('Add Sales Order');
2556   $form->{vc}    = "customer";
2557   $form->{type}  = "sales_order";
2558
2559   &poso;
2560
2561   $lxdebug->leave_sub();
2562 }
2563
2564 sub poso {
2565   $lxdebug->enter_sub();
2566
2567   $form->{transdate} = $form->current_date(\%myconfig);
2568   delete $form->{duedate};
2569
2570   $form->{closed} = 0;
2571
2572   $form->{old_employee_id} = $form->{employee_id};
2573   $form->{old_salesman_id} = $form->{salesman_id};
2574
2575   # reset
2576   map { delete $form->{$_} }
2577     qw(id subject message cc bcc printed emailed queued customer vendor creditlimit creditremaining discount tradediscount oldinvtotal);
2578
2579   for $i (1 .. $form->{rowcount}) {
2580     map({ $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig,
2581                                                      $form->{"${_}_${i}"})
2582             if ($form->{"${_}_${i}"}) }
2583         qw(ship qty sellprice listprice basefactor));
2584   }
2585
2586   &order_links;
2587
2588   &prepare_order;
2589
2590   # format amounts
2591   for $i (1 .. $form->{rowcount} - 1) {
2592     map { $form->{"${_}_$i"} =~ s/\"/&quot;/g }
2593       qw(partnumber description unit);
2594   }
2595
2596   map { $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}, 0, "0") }
2597     qw(creditlimit creditremaining);
2598
2599   &update;
2600
2601   $lxdebug->leave_sub();
2602 }
2603
2604 sub e_mail {
2605   $lxdebug->enter_sub();
2606
2607   $form->{print_and_save} = 1;
2608
2609   $print_post = 1;
2610
2611   my $saved_form = save_form();
2612
2613   save();
2614
2615   my %saved_vars;
2616   map({ $saved_vars{$_} = $form->{$_}; } qw(id ordnumber quonumber));
2617   restore_form($saved_form);
2618   map({ $form->{$_} = $saved_vars{$_}; } qw(id ordnumber quonumber));
2619
2620   edit_e_mail();
2621
2622   $lxdebug->leave_sub();
2623 }
2624
2625 sub yes {
2626   call_sub($form->{yes_nextsub});
2627 }
2628
2629 sub no {
2630   call_sub($form->{no_nextsub});
2631 }