Kundenstatistik: Link bei den Rechnungen, Übersetzungen
[kivitendo-erp.git] / SL / Controller / RequirementSpec.pm
index 9fd3cf3..b22e15f 100644 (file)
@@ -53,6 +53,7 @@ my %sort_columns = (
 sub action_list {
   my ($self) = @_;
 
+  $self->_setup_search_action_bar;
   $self->prepare_report;
   $self->report_generator_list_objects(report => $self->{report}, objects => $self->models->get);
 }
@@ -324,7 +325,7 @@ sub setup {
 
   $::auth->assert('requirement_spec_edit');
   $::request->{layout}->use_stylesheet("${_}.css") for qw(jquery.contextMenu requirement_spec);
-  $::request->{layout}->use_javascript("${_}.js")  for qw(jquery.jstree jquery/jquery.contextMenu jquery/jquery.hotkeys requirement_spec ckeditor/ckeditor ckeditor/adapters/jquery kivi.Part.js autocomplete_customer);
+  $::request->{layout}->use_javascript("${_}.js")  for qw(jquery.jstree jquery/jquery.contextMenu jquery/jquery.hotkeys requirement_spec ckeditor/ckeditor ckeditor/adapters/jquery kivi.Part kivi.CustomerVendor);
   $self->init_visible_section;
 
   return 1;
@@ -382,10 +383,11 @@ sub init_include_cvars {
 #
 
 sub create_or_update {
-  my $self   = shift;
-  my $is_new = !$self->requirement_spec->id;
-  my $params = delete($::form->{requirement_spec}) || { };
-  my $cvars  = delete($::form->{cvars})            || { };
+  my $self                 = shift;
+  my $is_new               = !$self->requirement_spec->id;
+  my $previous_customer_id = $self->requirement_spec->customer_id;
+  my $params               = delete($::form->{requirement_spec}) || { };
+  my $cvars                = delete($::form->{cvars})            || { };
 
   # Forcefully make it clear to Rose which custom_variables exist (or don't), so that the ones added with »add_custom_variables« are visible when calling »custom_variables«.
   if ($is_new) {
@@ -424,6 +426,18 @@ sub create_or_update {
       $self->requirement_spec($self->copy_source->create_copy(%{ $params }));
     } else {
       $self->requirement_spec->save(cascade => 1);
+
+      # If the current requirement spec has versions and the
+      # customer's been changed, then the customer of all the versions
+      # has to be changed, too.
+      if (   !$is_new
+          && !$self->requirement_spec->is_template
+          && ($previous_customer_id != $self->requirement_spec->customer_id)) {
+        SL::DB::Manager::RequirementSpec->update_all(
+          set   => { customer_id     => $self->requirement_spec->customer_id },
+          where => [ working_copy_id => $self->requirement_spec->id          ],
+        );
+      }
     }
     1;
   })) {
@@ -476,9 +490,9 @@ sub prepare_report {
   if (!$is_template) {
     %column_defs = (
       %column_defs,
-      customer      => { raw_data => sub { $self->presenter->customer($_[0]->customer, display => 'table-cell', callback => $callback) },
+      customer      => { raw_data => sub { $_[0]->customer->presenter->customer(display => 'table-cell', callback => $callback) },
                          sub      => sub { $_[0]->customer->name } },
-      projectnumber => { raw_data => sub { $self->presenter->project($_[0]->project, display => 'table-cell', callback => $callback) },
+      projectnumber => { raw_data => sub { $_[0]->project ? $_[0]->project->presenter->project(display => 'table-cell', callback => $callback) : '' },
                          sub      => sub { $_[0]->project_id ? $_[0]->project->projectnumber : '' } },
       status        => { sub      => sub { $_[0]->status->description } },
       type          => { sub      => sub { $_[0]->type->description } },
@@ -541,7 +555,7 @@ sub render_pasted_text_block {
       ->hide('#text-block-list-empty');
   }
 
-  my $node       = $self->presenter->requirement_spec_text_block_jstree_data($text_block);
+  my $node       = $text_block->presenter->jstree_data;
   my $front_back = $text_block->output_position == 0 ? 'front' : 'back';
   $self->js
     ->jstree->create_node('#tree', "#tb-${front_back}", 'last', $node)
@@ -563,7 +577,7 @@ sub set_default_filter_args {
 sub render_pasted_section {
   my ($self, $item, $parent_id) = @_;
 
-  my $node = $self->presenter->requirement_spec_item_jstree_data($item);
+  my $node = $item->presenter->jstree_data;
   $self->js
     ->jstree->create_node('#tree', $parent_id ? "#fb-${parent_id}" : '#sections', 'last', $node)
     ->jstree->open_node(  '#tree', $parent_id ? "#fb-${parent_id}" : '#sections');
@@ -703,4 +717,22 @@ sub _setup_form_action_bar {
   }
 }
 
+sub _setup_search_action_bar {
+  my ($self, %params) = @_;
+
+  for my $bar ($::request->layout->get('actionbar')) {
+    $bar->add(
+      action => [
+        t8('Update'),
+        submit    => [ '#search_form', { action => 'RequirementSpec/list' } ],
+        accesskey => 'enter',
+      ],
+      link => [
+        t8('Add'),
+        link => $self->url_for(action => 'new', is_template => $::form->{is_template}),
+      ],
+    );
+  }
+}
+
 1;