X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FOrder.pm;h=d8d197a853471d81c0331e6a40025e0531862b77;hb=b1e1ad26766dc4c64000c33cf3a71d3e0cdea8f1;hp=9c1d77366a4a92c8ec8ce7ef821d64afac9abbb8;hpb=bba88a1b49d0c06c0b496dedc41599712a12c8e3;p=kivitendo-erp.git diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index 9c1d77366..d8d197a85 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -22,6 +22,7 @@ use SL::DB::RecordLink; use SL::Helper::CreatePDF qw(:all); use SL::Helper::PrintOptions; +use SL::Helper::ShippedQty; use SL::Controller::Helper::GetModels; @@ -72,7 +73,23 @@ sub action_add { sub action_edit { my ($self) = @_; - $self->load_order; + if ($::form->{id}) { + $self->load_order; + + } else { + # this is to edit an order from an unsaved order object + + # set item ids to new fake id, to identify them as new items + foreach my $item (@{$self->order->items_sorted}) { + $item->{new_fake_id} = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000); + } + # trigger rendering values for second row/longdescription as hidden, + # because they are loaded only on demand. So we need to keep the values + # from the source. + $_->{render_second_row} = 1 for @{ $self->order->items_sorted }; + $_->{render_longdescription} = 1 for @{ $self->order->items_sorted }; + } + $self->recalc(); $self->pre_render(); $self->render( @@ -199,8 +216,8 @@ sub action_print { my $copies = $::form->{print_options}->{copies}; my $groupitems = $::form->{print_options}->{groupitems}; - # only pdf by now - if (none { $format eq $_ } qw(pdf)) { + # only pdf and opendocument by now + if (none { $format eq $_ } qw(pdf opendocument opendocument_pdf)) { return $self->js->flash('error', t8('Format \'#1\' is not supported yet/anymore.', $format))->render; } @@ -370,11 +387,11 @@ sub action_send_email { $language = SL::DB::Language->new(id => $::form->{print_options}->{language_id})->load if $::form->{print_options}->{language_id}; my $pdf; - my @errors = genereate_pdf($self->order, \$pdf, {media => $::form->{media}, - format => $::form->{print_options}->{format}, - formname => $::form->{print_options}->{formname}, - language => $language, - groupitems => $::form->{print_options}->{groupitems}}); + my @errors = generate_pdf($self->order, \$pdf, {media => $::form->{media}, + format => $::form->{print_options}->{format}, + formname => $::form->{print_options}->{formname}, + language => $language, + groupitems => $::form->{print_options}->{groupitems}}); if (scalar @errors) { return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self); } @@ -606,6 +623,7 @@ sub action_customer_vendor_changed { ->val( '#order_payment_id', $self->order->payment_id) ->val( '#order_delivery_term_id', $self->order->delivery_term_id) ->val( '#order_intnotes', $self->order->intnotes) + ->val( '#language_id', $self->order->$cv_method->language_id) ->focus( '#order_' . $self->cv . '_id'); $self->js_redisplay_amounts_and_taxes; @@ -950,6 +968,19 @@ sub js_redisplay_amounts_and_taxes { $self->js->show('#subtotal_row_id'); } + if ($self->order->is_sales) { + my $is_neg = $self->order->marge_total < 0; + $self->js + ->html('#marge_total_id', $::form->format_amount(\%::myconfig, $self->order->marge_total, 2)) + ->html('#marge_percent_id', $::form->format_amount(\%::myconfig, $self->order->marge_percent, 2)) + ->action_if( $is_neg, 'addClass', '#marge_total_id', 'plus0') + ->action_if( $is_neg, 'addClass', '#marge_percent_id', 'plus0') + ->action_if( $is_neg, 'addClass', '#marge_percent_sign_id', 'plus0') + ->action_if(!$is_neg, 'removeClass', '#marge_total_id', 'plus0') + ->action_if(!$is_neg, 'removeClass', '#marge_percent_id', 'plus0') + ->action_if(!$is_neg, 'removeClass', '#marge_percent_sign_id', 'plus0'); + } + $self->js ->html('#netamount_id', $::form->format_amount(\%::myconfig, $self->order->netamount, -2)) ->html('#amount_id', $::form->format_amount(\%::myconfig, $self->order->amount, -2)) @@ -1265,7 +1296,7 @@ sub setup_order_from_cv { $order->intnotes($order->customervendor->notes); if ($order->is_sales) { - $order->salesman_id($order->customer->salesman_id); + $order->salesman_id($order->customer->salesman_id || SL::DB::Manager::Employee->current->id); $order->taxincluded(defined($order->customer->taxincluded_checked) ? $order->customer->taxincluded_checked : $::myconfig{taxincluded_checked}); @@ -1440,7 +1471,7 @@ sub pre_render { show_headers => 1, no_queue => 1, no_postscript => 1, - no_opendocument => 1, + no_opendocument => 0, no_html => 1}, ); @@ -1450,6 +1481,11 @@ sub pre_render { $item->active_discount_source($price_source->discount_from_source($item->active_discount_source)); } + if (any { $self->type eq $_ } (sales_order_type(), purchase_order_type())) { + # calculate shipped qtys here to prevent calling calculate for every item via the items method + SL::Helper::ShippedQty->new->calculate($self->order)->write_to_objects; + } + if ($self->order->number && $::instance_conf->get_webdav) { my $webdav = SL::Webdav->new( type => $self->type, @@ -1489,19 +1525,6 @@ sub setup_edit_action_bar { checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], disabled => !$self->order->id ? t8('This object has not been saved yet.') : undef, ], - action => [ - t8('Save and Delivery Order'), - call => [ 'kivi.Order.save', 'save_and_delivery_order', $::instance_conf->get_order_warn_duplicate_parts, - $::instance_conf->get_order_warn_no_deliverydate, - ], - checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], - only_if => (any { $self->type eq $_ } (sales_order_type(), purchase_order_type())) - ], - action => [ - t8('Save and Invoice'), - call => [ 'kivi.Order.save', 'save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ], - checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], - ], ], # end of combobox "Save" combobox => [ @@ -1520,6 +1543,19 @@ sub setup_edit_action_bar { only_if => (any { $self->type eq $_ } (sales_order_type(), request_quotation_type())), disabled => !$self->order->id ? t8('This object has not been saved yet.') : undef, ], + action => [ + t8('Save and Delivery Order'), + call => [ 'kivi.Order.save', 'save_and_delivery_order', $::instance_conf->get_order_warn_duplicate_parts, + $::instance_conf->get_order_warn_no_deliverydate, + ], + checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], + only_if => (any { $self->type eq $_ } (sales_order_type(), purchase_order_type())) + ], + action => [ + t8('Save and Invoice'), + call => [ 'kivi.Order.save', 'save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ], + checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], + ], ], # end of combobox "Workflow" combobox => [ @@ -1569,9 +1605,17 @@ sub generate_pdf { $order->language($params->{language}); $order->flatten_to_form($print_form, format_amounts => 1); + my $template_ext; + my $template_type; + if ($print_form->{format} =~ /(opendocument|oasis)/i) { + $template_ext = 'odt'; + $template_type = 'OpenDocument'; + } + # search for the template my ($template_file, @template_files) = SL::Helper::CreatePDF->find_template( name => $print_form->{formname}, + extension => $template_ext, email => $print_form->{media} eq 'email', language => $params->{language}, printer_id => $print_form->{printer_id}, # todo @@ -1588,8 +1632,10 @@ sub generate_pdf { $print_form->prepare_for_printing; $$pdf_ref = SL::Helper::CreatePDF->create_pdf( - template => $template_file, - variables => $print_form, + format => $print_form->{format}, + template_type => $template_type, + template => $template_file, + variables => $print_form, variable_content_types => { longdescription => 'html', partnotes => 'html', @@ -1836,7 +1882,7 @@ java script functions =item * credit limit -=item * more workflows (save as new, quotation, purchase order) +=item * more workflows (quotation, rfq) =item * price sources: little symbols showing better price / better discount @@ -1941,12 +1987,6 @@ editor or on text processing application). A warning when leaving the page without saveing unchanged inputs. -=item * - -Workflows for delivery order and invoice are in the menu "Save", because the -order is saved before opening the new document form. Nevertheless perhaps these -workflow buttons should be put under "Workflows". - =back