X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FController%2FOrder.pm;h=5d3049267a621b75325addffe2a4c24b91f0f924;hb=598383b3b6b63428fcabc5fb6e5595ec59de28e3;hp=1c4bce82ad0cb8319b51597f92898b9b55aa62e6;hpb=8e413f64229523fe4e632e7bf9f54aed49321c53;p=kivitendo-erp.git diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index 1c4bce82a..5d3049267 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -30,7 +30,7 @@ use SL::Helper::UserPreferences::UpdatePositions; use SL::Controller::Helper::GetModels; -use List::Util qw(first); +use List::Util qw(first sum0); use List::UtilsBy qw(sort_by uniq_by); use List::MoreUtils qw(any none pairwise first_index); use English qw(-no_match_vars); @@ -370,7 +370,8 @@ sub action_show_email_dialog { $form->{$self->nr_key()} = $self->order->number; $form->{formname} = $self->type; $form->{type} = $self->type; - $form->{language} = 'de'; + $form->{language} = '_' . $self->order->language->template_code if $self->order->language; + $form->{language_id} = $self->order->language->id if $self->order->language; $form->{format} = 'pdf'; $email_form->{subject} = $form->generate_email_subject(); @@ -688,11 +689,13 @@ sub action_customer_vendor_changed { ->replaceWith('#business_info_row', $self->build_business_info_row) ->val( '#order_taxzone_id', $self->order->taxzone_id) ->val( '#order_taxincluded', $self->order->taxincluded) + ->val( '#order_currency_id', $self->order->currency_id) ->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'); + ->focus( '#order_' . $self->cv . '_id') + ->run('kivi.Order.update_exchangerate'); $self->js_redisplay_amounts_and_taxes; $self->js_redisplay_cvpartnumbers; @@ -775,8 +778,13 @@ sub action_add_item { SELF => $self, ); - $self->js - ->append('#row_table_id', $row_as_html); + if ($::form->{insert_before_item_id}) { + $self->js + ->before ('.row_entry:has(#item_' . $::form->{insert_before_item_id} . ')', $row_as_html); + } else { + $self->js + ->append('#row_table_id', $row_as_html); + } if ( $item->part->is_assortment ) { $form_attr->{qty_as_number} = 1 unless $form_attr->{qty_as_number}; @@ -800,18 +808,24 @@ sub action_add_item { ID => $item_id, SELF => $self, ); - $self->js - ->append('#row_table_id', $row_as_html); + if ($::form->{insert_before_item_id}) { + $self->js + ->before ('.row_entry:has(#item_' . $::form->{insert_before_item_id} . ')', $row_as_html); + } else { + $self->js + ->append('#row_table_id', $row_as_html); + } }; }; $self->js ->val('.add_item_input', '') ->run('kivi.Order.init_row_handlers') - ->run('kivi.Order.row_table_scroll_down') ->run('kivi.Order.renumber_positions') ->focus('#add_item_parts_id_name'); + $self->js->run('kivi.Order.row_table_scroll_down') if !$::form->{insert_before_item_id}; + $self->js_redisplay_amounts_and_taxes; $self->js->render(); } @@ -882,16 +896,23 @@ sub action_add_multi_items { SELF => $self, ); - $self->js->append('#row_table_id', $row_as_html); + if ($::form->{insert_before_item_id}) { + $self->js + ->before ('.row_entry:has(#item_' . $::form->{insert_before_item_id} . ')', $row_as_html); + } else { + $self->js + ->append('#row_table_id', $row_as_html); + } } $self->js ->run('kivi.Order.close_multi_items_dialog') ->run('kivi.Order.init_row_handlers') - ->run('kivi.Order.row_table_scroll_down') ->run('kivi.Order.renumber_positions') ->focus('#add_item_parts_id_name'); + $self->js->run('kivi.Order.row_table_scroll_down') if !$::form->{insert_before_item_id}; + $self->js_redisplay_amounts_and_taxes; $self->js->render(); } @@ -907,6 +928,18 @@ sub action_recalc_amounts_and_taxes { $self->js->render(); } +sub action_update_exchangerate { + my ($self) = @_; + + my $data = { + is_standard => $self->order->currency_id == $::instance_conf->get_currency_id, + currency_name => $self->order->currency->name, + exchangerate => $self->order->daily_exchangerate_as_null_number, + }; + + $self->render(\SL::JSON::to_json($data), { type => 'json', process => 0 }); +} + # redisplay item rows if they are sorted by an attribute sub action_reorder_items { my ($self) = @_; @@ -1330,8 +1363,9 @@ sub make_order { # order here solves this problem. my $order; $order = SL::DB::Order->new(id => $::form->{id})->load(with => [ 'orderitems', 'orderitems.part' ]) if $::form->{id}; - $order ||= SL::DB::Order->new(orderitems => [], - quotation => (any { $self->type eq $_ } (sales_quotation_type(), request_quotation_type()))); + $order ||= SL::DB::Order->new(orderitems => [], + quotation => (any { $self->type eq $_ } (sales_quotation_type(), request_quotation_type())), + currency_id => $::instance_conf->get_currency_id()); my $cv_id_method = $self->cv . '_id'; if (!$::form->{id} && $::form->{$cv_id_method}) { @@ -1339,8 +1373,8 @@ sub make_order { setup_order_from_cv($order); } - my $form_orderitems = delete $::form->{order}->{orderitems}; - my $form_periodic_invoices_config = delete $::form->{order}->{periodic_invoices_config}; + my $form_orderitems = delete $::form->{order}->{orderitems}; + my $form_periodic_invoices_config = delete $::form->{order}->{periodic_invoices_config}; $order->assign_attributes(%{$::form->{order}}); @@ -1471,7 +1505,7 @@ sub new_item { sub setup_order_from_cv { my ($order) = @_; - $order->$_($order->customervendor->$_) for (qw(taxzone_id payment_id delivery_term_id)); + $order->$_($order->customervendor->$_) for (qw(taxzone_id payment_id delivery_term_id currency_id)); $order->intnotes($order->customervendor->notes); @@ -1490,20 +1524,16 @@ sub setup_order_from_cv { sub recalc { my ($self) = @_; - # bb: todo: currency later - $self->order->currency_id($::instance_conf->get_currency_id()); - my %pat = $self->order->calculate_prices_and_taxes(); + $self->{taxes} = []; - foreach my $tax_chart_id (keys %{ $pat{taxes} }) { - my $tax = SL::DB::Manager::Tax->find_by(chart_id => $tax_chart_id); + foreach my $tax_id (keys %{ $pat{taxes_by_tax_id} }) { + my $netamount = sum0 map { $pat{amounts}->{$_}->{amount} } grep { $pat{amounts}->{$_}->{tax_id} == $tax_id } keys %{ $pat{amounts} }; - my @amount_keys = grep { $pat{amounts}->{$_}->{tax_id} == $tax->id } keys %{ $pat{amounts} }; - push(@{ $self->{taxes} }, { amount => $pat{taxes}->{$tax_chart_id}, - netamount => $pat{amounts}->{$amount_keys[0]}->{amount}, - tax => $tax }); + push(@{ $self->{taxes} }, { amount => $pat{taxes_by_tax_id}->{$tax_id}, + netamount => $netamount, + tax => SL::DB::Tax->new(id => $tax_id)->load }); } - pairwise { $a->{linetotal} = $b->{linetotal} } @{$self->order->items_sorted}, @{$pat{items}}; } @@ -1639,6 +1669,7 @@ sub pre_render { my ($self) = @_; $self->{all_taxzones} = SL::DB::Manager::TaxZone->get_all_sorted(); + $self->{all_currencies} = SL::DB::Manager::Currency->get_all_sorted(); $self->{all_departments} = SL::DB::Manager::Department->get_all_sorted(); $self->{all_employees} = SL::DB::Manager::Employee->get_all(where => [ or => [ id => $self->order->employee_id, deleted => 0 ] ], @@ -1932,6 +1963,9 @@ sub get_title_for { sub get_item_cvpartnumber { my ($self, $item) = @_; + return if !$self->search_cvpartnumber; + return if !$self->order->customervendor; + if ($self->cv eq 'vendor') { my @mms = grep { $_->make eq $self->order->customervendor->id } @{$item->part->makemodels}; $item->{cvpartnumber} = $mms[0]->model if scalar @mms; @@ -2086,8 +2120,6 @@ java script functions =item * testing -=item * currency - =item * credit limit =item * more workflows (quotation, rfq)