X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FOrder.pm;h=b57d772c03e6549b0159f754db1fe994d35ed8f4;hb=56eff7149decfec3250984d74307b8dc7b568d6a;hp=cd36a07a5c6e4c0c701f4953862be9e7981cbbf1;hpb=698bf12d23e82883b9cc8920e40e1d15c6298d00;p=kivitendo-erp.git diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index cd36a07a5..b57d772c0 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -99,6 +99,36 @@ sub action_edit { ); } +# edit a collective order (consisting of one or more existing orders) +sub action_edit_collective { + my ($self) = @_; + + # collect order ids + my @multi_ids = map { + $_ =~ m{^multi_id_(\d+)$} && $::form->{'multi_id_' . $1} && $::form->{'trans_id_' . $1} && $::form->{'trans_id_' . $1} + } grep { $_ =~ m{^multi_id_\d+$} } keys %$::form; + + # fall back to add if no ids are given + if (scalar @multi_ids == 0) { + $self->action_add(); + return; + } + + # fall back to save as new if only one id is given + if (scalar @multi_ids == 1) { + $self->order(SL::DB::Order->new(id => $multi_ids[0])->load); + $self->action_save_as_new(); + return; + } + + # make new order from given orders + my @multi_orders = map { SL::DB::Order->new(id => $_)->load } @multi_ids; + $self->{converted_from_oe_id} = join ' ', map { $_->id } @multi_orders; + $self->order(SL::DB::Order->new_from_multi(\@multi_orders, sort_sources_by => 'transdate')); + + $self->action_edit(); +} + # delete the order sub action_delete { my ($self) = @_; @@ -210,6 +240,16 @@ sub action_save_as_new { sub action_print { my ($self) = @_; + my $errors = $self->save(); + + if (scalar @{ $errors }) { + $self->js->flash('error', $_) foreach @{ $errors }; + return $self->js->render(); + } + + $self->js->val('#id', $self->order->id) + ->val('#order_' . $self->nr_key(), $self->order->number); + my $format = $::form->{print_options}->{format}; my $media = $::form->{print_options}->{media}; my $formname = $::form->{print_options}->{formname}; @@ -370,6 +410,17 @@ sub action_show_email_dialog { sub action_send_email { my ($self) = @_; + my $errors = $self->save(); + + if (scalar @{ $errors }) { + $self->js->run('kivi.Order.close_email_dialog'); + $self->js->flash('error', $_) foreach @{ $errors }; + return $self->js->render(); + } + + $self->js->val('#id', $self->order->id) + ->val('#order_' . $self->nr_key(), $self->order->number); + my $email_form = delete $::form->{email_form}; my %field_names = (to => 'email'); @@ -388,10 +439,10 @@ sub action_send_email { my $pdf; 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}}); + 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); } @@ -417,6 +468,8 @@ sub action_send_email { $intnotes .= t8('Subject') . ": " . $::form->{subject} . "\n\n"; $intnotes .= t8('Message') . ": " . $::form->{message}; + $self->order->update_attributes(intnotes => $intnotes); + $self->js ->val('#order_intnotes', $intnotes) ->run('kivi.Order.close_email_dialog') @@ -435,7 +488,7 @@ sub action_show_periodic_invoices_config_dialog { $config ||= SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $::form->{id}) if $::form->{id}; $config ||= SL::DB::PeriodicInvoicesConfig->new(periodicity => 'm', order_value_periodicity => 'p', # = same as periodicity - start_date_as_date => $::form->{transdate} || $::form->current_date, + start_date_as_date => $::form->{transdate_as_date} || $::form->current_date, extend_automatically_by => 12, active => 1, email_subject => GenericTranslations->get( @@ -623,6 +676,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; @@ -967,6 +1021,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)) @@ -1152,8 +1219,10 @@ sub make_order { $order->assign_attributes(%{$::form->{order}}); - my $periodic_invoices_config = make_periodic_invoices_config_from_yaml($form_periodic_invoices_config); - $order->periodic_invoices_config($periodic_invoices_config) if $periodic_invoices_config; + if (my $periodic_invoices_config_attrs = $form_periodic_invoices_config ? YAML::Load($form_periodic_invoices_config) : undef) { + my $periodic_invoices_config = $order->periodic_invoices_config || $order->periodic_invoices_config(SL::DB::PeriodicInvoicesConfig->new); + $periodic_invoices_config->assign_attributes(%$periodic_invoices_config_attrs); + } # remove deleted items $self->item_ids_to_delete([]); @@ -1282,7 +1351,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}); @@ -1361,13 +1430,17 @@ sub save { my $db = $self->order->db; $db->with_transaction(sub { - SL::DB::OrderItem->new(id => $_)->delete for @{$self->item_ids_to_delete}; + SL::DB::OrderItem->new(id => $_)->delete for @{$self->item_ids_to_delete || []}; $self->order->save(cascade => 1); # link records if ($::form->{converted_from_oe_id}) { - SL::DB::Order->new(id => $::form->{converted_from_oe_id})->load->link_to_record($self->order); - + my @converted_from_oe_ids = split ' ', $::form->{converted_from_oe_id}; + foreach my $converted_from_oe_id (@converted_from_oe_ids) { + my $src = SL::DB::Order->new(id => $converted_from_oe_id)->load; + $src->update_attributes(closed => 1) if $src->type =~ /_quotation$/; + $src->link_to_record($self->order); + } if (scalar @{ $::form->{converted_from_orderitems_ids} || [] }) { my $idx = 0; foreach (@{ $self->order->items_sorted }) { @@ -1511,19 +1584,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 => [ @@ -1542,6 +1602,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 => [ @@ -1549,12 +1622,12 @@ sub setup_edit_action_bar { t8('Export'), ], action => [ - t8('Print'), - call => [ 'kivi.Order.show_print_options' ], + t8('Save and print'), + call => [ 'kivi.Order.show_print_options', $::instance_conf->get_order_warn_duplicate_parts ], ], action => [ - t8('E-mail'), - call => [ 'kivi.Order.email' ], + t8('Save and E-mail'), + call => [ 'kivi.Order.email', $::instance_conf->get_order_warn_duplicate_parts ], ], action => [ t8('Download attachments of all parts'), @@ -1774,11 +1847,6 @@ Possibility to enter more than one item at once. =item * -Save order only on "save" (and "save and delivery order"-workflow). No -hidden save on "print" or "email". - -=item * - Item list in a scrollable area, so that the workflow buttons stay at the bottom. @@ -1868,7 +1936,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 @@ -1973,12 +2041,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