X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fio.pl;h=89e40d0e5d38312705c76fc413d545921921d8b2;hb=00177fae5986f1de25515c7103d10fc36a38cefd;hp=0cde59cec08488435662692efba1846a271afd84;hpb=333003d332756c5f53a33720aea7b714dfd335c8;p=kivitendo-erp.git diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index 0cde59cec..89e40d0e5 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -40,7 +40,7 @@ use Carp; use CGI; use List::MoreUtils qw(any uniq apply); -use List::Util qw(min max first); +use List::Util qw(sum min max first); use List::UtilsBy qw(sort_by uniq_by); use SL::ClientJS; @@ -56,6 +56,7 @@ use SL::PriceSource; use SL::Presenter::Part; use SL::DB::Contact; +use SL::DB::Currency; use SL::DB::Customer; use SL::DB::Default; use SL::DB::Language; @@ -169,6 +170,12 @@ sub display_row { my @row2_sort = qw( serialnr projectnr reqdate subtotal marge listprice lastcost onhand ); + # serialnr is important for delivery_orders + if ($form->{type} eq 'sales_delivery_order') { + splice @row2_sort, 0, 1; + splice @header_sort, 4, 0, "serialnr"; + } + my %column_def = ( runningnumber => { width => 5, value => $locale->text('No.'), display => 1, }, partnumber => { width => 8, value => $locale->text('Number'), display => 1, }, @@ -327,7 +334,7 @@ sub display_row { $ship_qty /= ( $all_units->{$form->{"unit_$i"}}->{factor} || 1 ); $column_data{ship} = $form->format_amount(\%myconfig, $form->round_amount($ship_qty, 2) * 1) . ' ' . $form->{"unit_$i"} - . $cgi->hidden(-name => "ship_$i", -value => $form->format_amount(\%myconfig, $form->{"ship_$i"}, $qty_dec)); + . $cgi->hidden(-name => "ship_$i", -value => $form->{"ship_$i"}, $qty_dec); my $ship_missing_qty = $form->{"qty_$i"} - $ship_qty; my $ship_missing_amount = $form->round_amount($ship_missing_qty * $form->{"sellprice_$i"} * (100 - $form->{"discount_$i"}) / 100 / $price_factor, 2); @@ -470,7 +477,7 @@ sub display_row { map { $form->{"${_}_${i}"} = $form->format_amount(\%myconfig, $form->{"${_}_${i}"}) } qw(sellprice discount lastcost); push @hidden_vars, grep { defined $form->{"${_}_${i}"} } qw(sellprice discount not_discountable price_factor_id lastcost); push @hidden_vars, "stock_${stock_in_out}_sum_qty", "stock_${stock_in_out}"; - push @hidden_vars, qw(delivery_order_items_id converted_from_orderitems_id converted_from_delivery_order_items_id); + push @hidden_vars, qw(delivery_order_items_id converted_from_orderitems_id converted_from_delivery_order_items_id has_sernumber); } my @HIDDENS = map { value => $_}, ( @@ -910,16 +917,24 @@ sub order { _order(); if ($::instance_conf->get_feature_experimental_order) { + + # At this point, the record is saved and the exchangerate contains + # an unformatted value. _make_record uses RDBO attributes (i.e. _as_number) + # to assign values and thus expects an formatted value. + $::form->{exchangerate} = $::form->format_amount(\%::myconfig, $::form->{exchangerate}); + my $order = _make_record(); - $order->globalproject_id(undef) if !$order->globalproject_id; - $order->payment_id(undef) if !$order->payment_id; + + $order->currency(SL::DB::Currency->new(name => $::form->{currency})->load) if $::form->{currency}; + $order->globalproject_id(undef) if !$order->globalproject_id; + $order->payment_id(undef) if !$order->payment_id; + my $row = 1; foreach my $item (@{$order->items_sorted}) { $item->custom_variables([]); $item->price_factor_id(undef) if !$item->price_factor_id; $item->project_id(undef) if !$item->project_id; - $item->discount($item->discount/100.0); # autovivify all cvars that are not in the form (cvars_by_config can do it). # workaround to pre-parse number-cvars (parse_custom_variable_values does not parse number values). @@ -935,6 +950,7 @@ sub order { require SL::Controller::Order; my $c = SL::Controller::Order->new(order => $order); + $c->setup_custom_shipto_from_form($order, $::form); $c->action_edit(); $main::lxdebug->leave_sub(); @@ -1376,6 +1392,8 @@ sub print_form { $form->get_shipto(\%myconfig); } + $form->set_addition_billing_address_print_variables; + $form->{notes} =~ s/^\s+//g; delete $form->{printer_command}; @@ -1399,7 +1417,7 @@ sub print_form { # Format dates. format_dates($output_dateformat, $output_longdates, - qw(invdate orddate quodate pldate duedate reqdate transdate + qw(invdate orddate quodate pldate duedate reqdate transdate tax_point shippingdate deliverydate validitydate paymentdate datepaid transdate_oe transdate_do transdate_quo deliverydate_oe dodate employee_startdate employee_enddate @@ -1554,6 +1572,10 @@ sub print_form { today => DateTime->today, }; + if ($defaults->print_interpolate_variables_in_positions) { + $form->substitute_placeholders_in_template_arrays({ field => 'description', type => 'text' }, { field => 'longdescription', type => 'html' }); + } + $form->parse_template(\%myconfig); $form->{callback} = ""; @@ -1661,7 +1683,7 @@ sub relink_accounts { $form->{"taxaccounts"} =~ s/\s*$//; $form->{"taxaccounts"} =~ s/^\s*//; foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) { - map({ delete($form->{"${accno}_${_}"}); } qw(rate description taxnumber)); + map({ delete($form->{"${accno}_${_}"}); } qw(rate description taxnumber tax_id)); # add tax_id ? } $form->{"taxaccounts"} = ""; @@ -1718,6 +1740,7 @@ sub _update_part_information { $form->{"weight_$i"} = $info->{weight}; $form->{"part_type_$i"} = $info->{part_type}; $form->{"classification_id_$i"} = $info->{classification_id}; + $form->{"has_sernumber_$i"} = $info->{has_sernumber}; } $main::lxdebug->leave_sub(); @@ -1852,7 +1875,7 @@ sub _remove_billed_or_delivered_rows { # TODO: both of these are makeshift so that price sources can operate on rdbo objects. if # this ever gets rewritten in controller style, throw this out sub _make_record_item { - my ($row) = @_; + my ($row, %params) = @_; my $class = { sales_order => 'OrderItem', @@ -1922,6 +1945,11 @@ sub _make_record_item { $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"})); } + if ($obj->can('qty')) { + $obj->qty( $obj->qty * $params{factor}); + $obj->base_qty($obj->base_qty * $params{factor}); + } + return $obj; } @@ -1941,6 +1969,8 @@ sub _make_record { : do { die 'unknown invoice type' }; } + my $factor = $::form->{type} =~ m{credit_note} ? -1 : 1; + return unless $class; $class = 'SL::DB::' . $class; @@ -1971,21 +2001,29 @@ sub _make_record { my @items; for my $i (1 .. $::form->{rowcount}) { next unless $::form->{"id_$i"}; - push @items, _make_record_item($i); + push @items, _make_record_item($i, factor => $factor); } $obj->items(@items) if @items; $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder'; + if ($class eq 'SL::DB::Invoice') { + my $paid = $factor * + sum + map { $::form->parse_amount(\%::myconfig, $::form->{$_}) } + grep { m{^paid_\d+$} } + keys %{ $::form }; + $obj->paid($paid); + } + return $obj; } sub setup_sales_purchase_print_options { my $print_form = Form->new(''); $print_form->{printers} = SL::DB::Manager::Printer->get_all_sorted; - $print_form->{languages} = SL::DB::Manager::Language->get_all_sorted; - $print_form->{$_} = $::form->{$_} for qw(type media language_id printer_id storno); + $print_form->{$_} = $::form->{$_} for qw(type media printer_id storno formname groupitems); return SL::Helper::PrintOptions->get_print_options( form => $print_form, @@ -1996,7 +2034,7 @@ sub setup_sales_purchase_print_options { } sub _get_files_for_email_dialog { - my %files = map { ($_ => []) } qw(versions files vc_files part_files); + my %files = map { ($_ => []) } qw(versions files vc_files part_files project_files); return %files if !$::instance_conf->get_doc_storage; @@ -2005,6 +2043,8 @@ sub _get_files_for_email_dialog { $files{files} = [ SL::File->get_all( object_id => $::form->{id}, object_type => $::form->{type}, file_type => 'attachment') ]; $files{vc_files} = [ SL::File->get_all( object_id => $::form->{vc_id}, object_type => $::form->{vc}, file_type => 'attachment') ] if $::form->{vc} && $::form->{"vc_id"}; + $files{project_files} = [ SL::File->get_all(object_id => $::form->{project_id}, object_type => 'project',file_type => 'attachment') ] + if $::form->{project_id}; } my @parts = @@ -2067,11 +2107,18 @@ sub show_sales_purchase_email_dialog { $::form->{language} = $::form->get_template_language(\%::myconfig); $::form->{language} = "_" . $::form->{language}; + my %body_params = (record_email => $record_email); + if (($::form->{type} eq 'invoice') && $::form->{direct_debit}) { + $body_params{translation_type} = "preset_text_invoice_direct_debit"; + $body_params{fallback_translation_type} = "preset_text_invoice"; + } + + $::form->{all_employees} = SL::DB::Manager::Employee->get_all(query => [ deleted => 0 ]); my $email_form = { to => $email, cc => $email_cc, subject => $::form->generate_email_subject, - message => $::form->generate_email_body('record_email' => $record_email), + message => $::form->generate_email_body(%body_params), attachment_filename => $::form->generate_attachment_filename, js_send_function => 'kivi.SalesPurchase.send_email()', }; @@ -2083,6 +2130,7 @@ sub show_sales_purchase_email_dialog { FILES => \%files, is_customer => $::form->{vc} eq 'customer', is_invoice_mail => ($record_email && $::form->{type} eq 'invoice'), + ALL_EMPLOYEES => $::form->{all_employees}, }); print $::form->ajax_response_header, $html; @@ -2120,7 +2168,12 @@ sub _maybe_attach_zugferd_data { my $record = _make_record(); - return if !$record || !$record->can('create_pdf_a_print_options') || !$record->can('create_zugferd_data'); + return if !$record + || !$record->can('customer') + || !$record->customer + || !$record->can('create_pdf_a_print_options') + || !$record->can('create_zugferd_data') + || !$record->customer->create_zugferd_invoices_for_this_customer; eval { my $xmlfile = File::Temp->new; @@ -2130,8 +2183,8 @@ sub _maybe_attach_zugferd_data { $form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_a} = $record->create_pdf_a_print_options(zugferd_xmp_data => $record->create_zugferd_xmp_data); $form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_attachments} = [ { source => $xmlfile, - name => 'ZUGFeRD-invoice.xml', - description => $::locale->text('ZUGFeRD invoice'), + name => 'factur-x.xml', + description => $::locale->text('Factur-X/ZUGFeRD invoice'), relationship => '/Alternative', mime_type => 'text/xml', }