]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/RequirementSpec.pm
Finanzcontrolling: Auftragswertperiodizität berücksichtigen
[mfinanz.git] / SL / Controller / RequirementSpec.pm
index 7e25d7e7ded7c73c58b6c02ca04010e177627157..3158cd09ac1931d0273f2922094e8b65d18fc73e 100644 (file)
@@ -21,6 +21,7 @@ use SL::DB::RequirementSpecRisk;
 use SL::DB::RequirementSpecStatus;
 use SL::DB::RequirementSpecType;
 use SL::DB::RequirementSpec;
 use SL::DB::RequirementSpecStatus;
 use SL::DB::RequirementSpecType;
 use SL::DB::RequirementSpec;
+use SL::Helper::CreatePDF qw();
 use SL::Helper::Flash;
 use SL::Locale::String;
 use SL::Template::LaTeX;
 use SL::Helper::Flash;
 use SL::Locale::String;
 use SL::Template::LaTeX;
@@ -29,7 +30,7 @@ use Rose::Object::MakeMethods::Generic
 (
   scalar                  => [ qw(requirement_spec_item visible_item visible_section) ],
   'scalar --get_set_init' => [ qw(requirement_spec customers types statuses complexities risks projects project_types project_statuses default_project_type default_project_status copy_source js
 (
   scalar                  => [ qw(requirement_spec_item visible_item visible_section) ],
   'scalar --get_set_init' => [ qw(requirement_spec customers types statuses complexities risks projects project_types project_statuses default_project_type default_project_status copy_source js
-                                  current_text_block_output_position models) ],
+                                  current_text_block_output_position models time_based_units html_template) ],
 );
 
 __PACKAGE__->run_before('setup');
 );
 
 __PACKAGE__->run_before('setup');
@@ -207,7 +208,7 @@ sub action_revert_to {
   my $version = $versioned_copy->versions->[0];
   $version->update_attributes(working_copy_id => $self->requirement_spec->id);
 
   my $version = $versioned_copy->versions->[0];
   $version->update_attributes(working_copy_id => $self->requirement_spec->id);
 
-  flash_later('info', t8('The requirement spec has been reverted to version #1.', $self->requirement_spec->version->version_number));
+  flash_later('info', t8('The requirement spec has been reverted to version #1.', $versioned_copy->version->version_number));
   $self->js->redirect_to($self->url_for(action => 'show', id => $self->requirement_spec->id))->render($self);
 }
 
   $self->js->redirect_to($self->url_for(action => 'show', id => $self->requirement_spec->id))->render($self);
 }
 
@@ -231,10 +232,34 @@ sub action_create_pdf {
   unlink $result{file_name};
 }
 
   unlink $result{file_name};
 }
 
+sub action_create_html {
+  my ($self, %params) = @_;
+
+  my $base_name       = $self->requirement_spec->type->template_file_name || 'requirement_spec';
+  my @pictures        = $self->prepare_pictures_for_printing;
+  my $content         = SL::Helper::CreatePDF->create_parsed_file(
+    template      => "${base_name}.html",
+    format        => 'html',
+    template_type => 'HTML',
+    variables     => {
+      SELF        => $self,
+      rspec       => $self->requirement_spec,
+    });
+
+  # $content is now a scalar of bytes, but $self->render() expects a
+  # scalar of characters.
+  $content = Encode::decode('utf-8', $content);
+
+  $self->render(\$content, { layout => 0, process => 0 });
+}
+
 sub action_select_template_to_paste {
   my ($self) = @_;
 
 sub action_select_template_to_paste {
   my ($self) = @_;
 
-  my @templates = grep { @{ $_->sections } || @{ $_->text_blocks } } @{ SL::DB::Manager::RequirementSpec->get_all(where => [ is_template => 1 ], sort_by => 'lower(title)') };
+  my @templates = @{ SL::DB::Manager::RequirementSpec->get_all(
+    where   => [ is_template => 1, SL::DB::Manager::RequirementSpec->not_empty_filter ],
+    sort_by => 'lower(requirement_specs.title)',
+  ) };
   $self->render('requirement_spec/select_template_to_paste', { layout => 0 }, TEMPLATES => \@templates);
 }
 
   $self->render('requirement_spec/select_template_to_paste', { layout => 0 }, TEMPLATES => \@templates);
 }
 
@@ -253,9 +278,42 @@ sub action_paste_template {
     $self->render_first_pasted_section_as_list($result{sections}->[0]);
   }
 
     $self->render_first_pasted_section_as_list($result{sections}->[0]);
   }
 
+  my $parts_list = $self->render('requirement_spec_part/show', { output => 0 });
+  $self->js
+    ->replaceWith('#additional_parts_list_container', $parts_list)
+    ->show(       '#additional_parts_list_container')
+    ->remove(     '#additional_parts_form_container');
+
   $self->invalidate_version->render($self);
 }
 
   $self->invalidate_version->render($self);
 }
 
+sub action_renumber_sections {
+  my ($self)  = @_;
+
+  my %numbers = map { ($_ => 1)                                                                         } qw(section function_block);
+  my %formats = map { my $method = "${_}_number_format"; ($_ => $self->requirement_spec->type->$method) } qw(section function_block);
+  my @items   = @{ $self->requirement_spec->sections_sorted };
+
+  $self->requirement_spec->db->with_transaction(sub {
+    while (@items) {
+      my $item = shift @items;
+      my $type = $item->parent_id ? 'function_block' : 'section';
+
+      $item->update_attributes(fb_number => SL::PrefixedNumber->new(number => $formats{$type} || 0)->set_to($numbers{$type}));
+
+      $numbers{$type}++;
+
+      unshift @items, @{ $item->children_sorted };
+    }
+
+    $self->requirement_spec->invalidate_version unless $self->requirement_spec->is_template;
+
+    1;
+  });
+
+  $self->redirect_to(action => 'show', id => $self->requirement_spec->id);
+}
+
 #
 # filters
 #
 #
 # filters
 #
@@ -265,7 +323,7 @@ sub setup {
 
   $::auth->assert('requirement_spec_edit');
   $::request->{layout}->use_stylesheet("${_}.css") for qw(jquery.contextMenu requirement_spec);
 
   $::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);
+  $::request->{layout}->use_javascript("${_}.js")  for qw(jquery.jstree jquery/jquery.contextMenu jquery/jquery.hotkeys requirement_spec ckeditor/ckeditor ckeditor/adapters/jquery autocomplete_part);
   $self->init_visible_section;
 
   return 1;
   $self->init_visible_section;
 
   return 1;
@@ -280,6 +338,7 @@ sub init_project_types          { SL::DB::Manager::ProjectType->get_all_sorted
 sub init_projects               { SL::DB::Manager::Project->get_all_sorted                    }
 sub init_risks                  { SL::DB::Manager::RequirementSpecRisk->get_all_sorted        }
 sub init_statuses               { SL::DB::Manager::RequirementSpecStatus->get_all_sorted      }
 sub init_projects               { SL::DB::Manager::Project->get_all_sorted                    }
 sub init_risks                  { SL::DB::Manager::RequirementSpecRisk->get_all_sorted        }
 sub init_statuses               { SL::DB::Manager::RequirementSpecStatus->get_all_sorted      }
+sub init_time_based_units       { SL::DB::Manager::Unit->time_based_units                     }
 sub init_types                  { SL::DB::Manager::RequirementSpecType->get_all_sorted        }
 
 sub init_customers {
 sub init_types                  { SL::DB::Manager::RequirementSpecType->get_all_sorted        }
 
 sub init_customers {
@@ -576,4 +635,11 @@ sub init_models {
   );
 }
 
   );
 }
 
+sub init_html_template {
+  my ($self)    = @_;
+  my $base_name = $self->requirement_spec->type->template_file_name || 'requirement_spec';
+  my $template  = SL::Helper::CreatePDF->find_template(name => $base_name, extension => 'html');
+  return !!$template;
+}
+
 1;
 1;