X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/b36180dee0d6dd13d7def595f374cbe117d9bae5..48c71a4b51f5359a7ab7e9bc51280baf9bc9b9b2:/SL/Controller/Order.pm?ds=inline diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index f6f6986a1..47ab4e7de 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -10,6 +10,7 @@ use SL::SessionFile::Random; use SL::PriceSource; use SL::Webdav; use SL::File; +use SL::MIME; use SL::Util qw(trim); use SL::YAML; use SL::DB::Order; @@ -39,7 +40,7 @@ use Sort::Naturally; use Rose::Object::MakeMethods::Generic ( scalar => [ qw(item_ids_to_delete) ], - 'scalar --get_set_init' => [ qw(order valid_types type cv p multi_items_models all_price_factors) ], + 'scalar --get_set_init' => [ qw(order valid_types type cv p multi_items_models all_price_factors search_cvpartnumber) ], ); @@ -47,10 +48,12 @@ use Rose::Object::MakeMethods::Generic __PACKAGE__->run_before('check_auth'); __PACKAGE__->run_before('recalc', - only => [ qw(save save_as_new save_and_delivery_order save_and_invoice print send_email) ]); + only => [ qw(save save_as_new save_and_delivery_order save_and_invoice save_and_ap_transaction + print send_email) ]); __PACKAGE__->run_before('get_unalterable_data', - only => [ qw(save save_as_new save_and_delivery_order save_and_invoice print send_email) ]); + only => [ qw(save save_as_new save_and_delivery_order save_and_invoice save_and_ap_transaction + print send_email) ]); # # actions @@ -360,7 +363,7 @@ sub action_download_pdf { my $tmp_filename = $::auth->get_session_value("Order::print-${key}"); return $self->send_file( $tmp_filename, - type => 'application/pdf', + type => SL::MIME->mime_type_from_ext($::form->{pdf_filename}), name => $::form->{pdf_filename}, ); } @@ -647,6 +650,33 @@ sub action_purchase_order { $_[0]->workflow_sales_or_purchase_order(); } +# workflow from purchase order to ap transaction +sub action_save_and_ap_transaction { + my ($self) = @_; + + my $errors = $self->save(); + + if (scalar @{ $errors }) { + $self->js->flash('error', $_) foreach @{ $errors }; + return $self->js->render(); + } + + my $text = $self->type eq sales_order_type() ? $::locale->text('The order has been saved') + : $self->type eq purchase_order_type() ? $::locale->text('The order has been saved') + : $self->type eq sales_quotation_type() ? $::locale->text('The quotation has been saved') + : $self->type eq request_quotation_type() ? $::locale->text('The rfq has been saved') + : ''; + flash_later('info', $text); + + my @redirect_params = ( + controller => 'ap.pl', + action => 'add_from_purchase_order', + id => $self->order->id, + ); + + $self->redirect_to(@redirect_params); +} + # set form elements in respect to a changed customer or vendor # # This action is called on an change of the customer/vendor picker. @@ -685,6 +715,7 @@ sub action_customer_vendor_changed { ->focus( '#order_' . $self->cv . '_id'); $self->js_redisplay_amounts_and_taxes; + $self->js_redisplay_cvpartnumbers; $self->js->render(); } @@ -755,12 +786,15 @@ sub action_add_item { $self->recalc(); + $self->get_item_cvpartnumber($item); + my $item_id = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000); my $row_as_html = $self->p->render('order/tabs/_row', - ITEM => $item, - ID => $item_id, - TYPE => $self->type, - ALL_PRICE_FACTORS => $self->all_price_factors + ITEM => $item, + ID => $item_id, + TYPE => $self->type, + ALL_PRICE_FACTORS => $self->all_price_factors, + SEARCH_CVPARTNUMBER => $self->search_cvpartnumber, ); $self->js @@ -781,12 +815,14 @@ sub action_add_item { $self->order->add_items( $item ); $self->recalc(); + $self->get_item_cvpartnumber($item); my $item_id = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000); my $row_as_html = $self->p->render('order/tabs/_row', - ITEM => $item, - ID => $item_id, - TYPE => $self->type, - ALL_PRICE_FACTORS => $self->all_price_factors + ITEM => $item, + ID => $item_id, + TYPE => $self->type, + ALL_PRICE_FACTORS => $self->all_price_factors, + SEARCH_CVPARTNUMBER => $self->search_cvpartnumber, ); $self->js ->append('#row_table_id', $row_as_html); @@ -862,12 +898,14 @@ sub action_add_multi_items { $self->recalc(); foreach my $item (@items) { + $self->get_item_cvpartnumber($item); my $item_id = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000); my $row_as_html = $self->p->render('order/tabs/_row', - ITEM => $item, - ID => $item_id, - TYPE => $self->type, - ALL_PRICE_FACTORS => $self->all_price_factors + ITEM => $item, + ID => $item_id, + TYPE => $self->type, + ALL_PRICE_FACTORS => $self->all_price_factors, + SEARCH_CVPARTNUMBER => $self->search_cvpartnumber, ); $self->js->append('#row_table_id', $row_as_html); @@ -900,13 +938,16 @@ sub action_reorder_items { my ($self) = @_; my %sort_keys = ( - partnumber => sub { $_[0]->part->partnumber }, - description => sub { $_[0]->description }, - qty => sub { $_[0]->qty }, - sellprice => sub { $_[0]->sellprice }, - discount => sub { $_[0]->discount }, + partnumber => sub { $_[0]->part->partnumber }, + description => sub { $_[0]->description }, + qty => sub { $_[0]->qty }, + sellprice => sub { $_[0]->sellprice }, + discount => sub { $_[0]->discount }, + cvpartnumber => sub { $_[0]->{cvpartnumber} }, ); + $self->get_item_cvpartnumber($_) for @{$self->order->items_sorted}; + my $method = $sort_keys{$::form->{order_by}}; my @to_sort = map { { old_pos => $_->position, order_by => $method->($_) } } @{ $self->order->items_sorted }; if ($::form->{sort_dir}) { @@ -1054,6 +1095,17 @@ sub js_redisplay_amounts_and_taxes { ->insertBefore($self->build_tax_rows, '#amount_row_id'); } +sub js_redisplay_cvpartnumbers { + my ($self) = @_; + + $self->get_item_cvpartnumber($_) for @{$self->order->items_sorted}; + + my @data = map {[$_->{cvpartnumber}]} @{ $self->order->items_sorted }; + + $self->js + ->run('kivi.Order.redisplay_cvpartnumbers', \@data); +} + sub js_reset_order_and_item_ids_after_save { my ($self) = @_; @@ -1104,6 +1156,17 @@ sub init_cv { return $cv; } +sub init_search_cvpartnumber { + my ($self) = @_; + + my $user_prefs = SL::Helper::UserPreferences::PartPickerSearch->new(); + my $search_cvpartnumber; + $search_cvpartnumber = !!$user_prefs->get_sales_search_customer_partnumber() if $self->cv eq 'customer'; + $search_cvpartnumber = !!$user_prefs->get_purchase_search_makemodel() if $self->cv eq 'vendor'; + + return $search_cvpartnumber; +} + sub init_p { SL::Presenter->get; } @@ -1601,6 +1664,8 @@ sub pre_render { } } @all_objects; } + $self->get_item_cvpartnumber($_) for @{$self->order->items_sorted}; + $::request->{layout}->use_javascript("${_}.js") for qw(kivi.SalesPurchase kivi.Order kivi.File ckeditor/ckeditor ckeditor/adapters/jquery edit_periodic_invoices_config calculate_qty); $self->setup_edit_action_bar; } @@ -1659,6 +1724,12 @@ sub setup_edit_action_bar { call => [ 'kivi.Order.save', 'save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ], checks => [ 'kivi.Order.check_save_active_periodic_invoices' ], ], + action => [ + t8('Save and AP Transaction'), + call => [ 'kivi.Order.save', 'save_and_ap_transaction', $::instance_conf->get_order_warn_duplicate_parts ], + only_if => (any { $self->type eq $_ } (purchase_order_type())) + ], + ], # end of combobox "Workflow" combobox => [ @@ -1830,6 +1901,18 @@ sub get_title_for { : ''; } +sub get_item_cvpartnumber { + my ($self, $item) = @_; + + 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; + } elsif ($self->cv eq 'customer') { + my @cps = grep { $_->customer_id eq $self->order->customervendor->id } @{$item->part->customerprices}; + $item->{cvpartnumber} = $cps[0]->customer_partnumber if scalar @cps; + } +} + sub sales_order_type { 'sales_order'; } @@ -1869,9 +1952,8 @@ SL::Controller::Order - controller for orders This is a new form to enter orders, completely rewritten with the use of controller and java script techniques. -The aim is to provide the user a better expirience and a faster flow -of work. Also the code should be more readable, more reliable and -better to maintain. +The aim is to provide the user a better experience and a faster workflow. Also +the code should be more readable, more reliable and better to maintain. =head2 Key Features @@ -1902,7 +1984,7 @@ possible (by partnumber, description, qty, sellprice and discount for now). =item * No C is necessary. All entries and calculations are managed -with ajax-calls and the page does only reload on C. +with ajax-calls and the page only reloads on C. =item *