+ $main::lxdebug->leave_sub();
+}
+
+sub invoice_multi {
+ $main::lxdebug->enter_sub();
+
+ my $form = $main::form;
+ my %myconfig = %main::myconfig;
+ my $locale = $main::locale;
+
+ check_do_access();
+ $main::auth->assert($form->{type} eq 'sales_delivery_order' ? 'invoice_edit' : 'vendor_invoice_edit');
+
+ my @do_ids = map { $form->{"trans_id_$_"} } grep { $form->{"multi_id_$_"} } (1..$form->{rowcount});
+
+ if (!scalar @do_ids) {
+ $form->show_generic_error($locale->text('You have not selected any delivery order.'), 'back_button' => 1);
+ }
+
+ map { delete $form->{$_} } grep { m/^(?:trans|multi)_id_\d+/ } keys %{ $form };
+
+ if (!DO->retrieve('vc' => $form->{vc}, 'ids' => \@do_ids)) {
+ $form->show_generic_error($form->{vc} eq 'customer' ?
+ $locale->text('You cannot create an invoice for delivery orders for different customers.') :
+ $locale->text('You cannot create an invoice for delivery orders from different vendors.'),
+ 'back_button' => 1);
+ }
+
+ my $source_type = $form->{type};
+ $form->{convert_from_do_ids} = join ' ', @do_ids;
+ # bei der auswahl von mehreren Lieferscheinen fuer eine Rechnung, die einfach in donumber_array
+ # zwischenspeichern (DO.pm) und als ' '-separierte Liste wieder zurueckschreiben
+ # Hinweis: delete gibt den wert zurueck und loescht danach das element (nett und einfach)
+ # $shell: perldoc perlunc; /delete EXPR
+ $form->{donumber} = delete $form->{donumber_array};
+ $form->{deliverydate} = $form->{transdate};
+ $form->{transdate} = $form->current_date(\%myconfig);
+ $form->{duedate} = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
+ $form->{type} = "invoice";
+ $form->{closed} = 0;
+ $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
+
+ my ($script, $buysell);
+ if ($source_type eq 'purchase_delivery_order') {
+ $form->{title} = $locale->text('Add Vendor Invoice');
+ $form->{script} = 'ir.pl';
+ $script = "ir";
+ $buysell = 'sell';
+
+ } else {
+ $form->{title} = $locale->text('Add Sales Invoice');
+ $form->{script} = 'is.pl';
+ $script = "is";
+ $buysell = 'buy';
+ }
+
+ map { delete $form->{$_} } qw(id subject message cc bcc printed emailed queued);
+
+ # get vendor or customer discount
+ my $vc_discount;
+ my $saved_form = save_form();
+ if ($form->{vc} eq 'vendor') {
+ IR->get_vendor(\%myconfig, \%$form);
+ $vc_discount = $form->{vendor_discount};
+ } else {
+ IS->get_customer(\%myconfig, \%$form);
+ $vc_discount = $form->{customer_discount};
+ }
+ restore_form($saved_form);
+
+ $form->{rowcount} = 0;
+ foreach my $ref (@{ $form->{form_details} }) {
+ $form->{rowcount}++;
+ $ref->{reqdate} ||= $ref->{dord_transdate}; # copy transdates into each invoice row
+ map { $form->{"${_}_$form->{rowcount}"} = $ref->{$_} } keys %{ $ref };
+ map { $form->{"${_}_$form->{rowcount}"} = $form->format_amount(\%myconfig, $ref->{$_}) } qw(qty sellprice lastcost);
+
+ if ($vc_discount){ # falls wir einen Lieferanten/Kundenrabatt haben
+ # und keinen anderen discount wert an $i ...
+ $form->{"discount_$form->{rowcount}"} ||= $vc_discount; # ... nehmen wir diesen Rabatt
+ }
+
+ $form->{"discount_$form->{rowcount}"} = $form->{"discount_$form->{rowcount}"} * 100; #s.a. Bug 1151
+ # Anm.: Eine Änderung des discounts in der SL/DO.pm->retrieve (select (doi.discount * 100) as discount) ergibt in psql einen
+ # Wert von 10.0000001490116. Ferner ist der Rabatt in der Rechnung dann bei 1.0 (?). Deswegen lasse ich das hier. jb 10.10.09
+
+ $form->{"discount_$form->{rowcount}"} = $form->format_amount(\%myconfig, $form->{"discount_$form->{rowcount}"});
+ }
+ delete $form->{form_details};
+
+ $locale = new Locale "$myconfig{countrycode}", "$script";
+
+ require "bin/mozilla/$form->{script}";
+
+ invoice_links();
+ prepare_invoice();
+ display_form();
+
+ $main::lxdebug->leave_sub();