X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FRequirementSpec.pm;h=024e60d7b58b8fc633dbf5b4a60d1f25a16ec404;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hp=e5dae7ebd563dbfabcefd2b5c94bfa959afd85e8;hpb=89ade8da54d47af2cbf100fac07bf88ed9f23c43;p=kivitendo-erp.git diff --git a/SL/DB/RequirementSpec.pm b/SL/DB/RequirementSpec.pm index e5dae7ebd..024e60d7b 100644 --- a/SL/DB/RequirementSpec.pm +++ b/SL/DB/RequirementSpec.pm @@ -8,6 +8,11 @@ use Rose::DB::Object::Helpers; use SL::DB::MetaSetup::RequirementSpec; use SL::DB::Manager::RequirementSpec; +use SL::DB::Helper::AttrDuration; +use SL::DB::Helper::CustomVariables ( + module => 'RequirementSpecs', + cvars_alias => 1, +); use SL::DB::Helper::LinkedRecords; use SL::Locale::String; use SL::Util qw(_hashify); @@ -43,10 +48,17 @@ __PACKAGE__->meta->add_relationship( class => 'SL::DB::RequirementSpecOrder', column_map => { id => 'requirement_spec_id' }, }, + parts => { + type => 'one to many', + class => 'SL::DB::RequirementSpecPart', + column_map => { id => 'requirement_spec_id' }, + }, ); __PACKAGE__->meta->initialize; +__PACKAGE__->attr_duration(qw(time_estimation)); + __PACKAGE__->before_save('_before_save_initialize_not_null_columns'); sub validate { @@ -119,13 +131,21 @@ sub versioned_copies_sorted { return \@copies; } +sub parts_sorted { + my ($self, @rest) = @_; + + croak "This sub is not a writer" if @rest; + + return [ sort { $a->position <=> $b->position } @{ $self->parts } ]; +} + sub create_copy { my ($self, %params) = @_; return $self->_create_copy(%params) if $self->db->in_transaction; my $copy; - if (!$self->db->do_transaction(sub { $copy = $self->_create_copy(%params) })) { + if (!$self->db->with_transaction(sub { $copy = $self->_create_copy(%params) })) { $::lxdebug->message(LXDebug->WARN(), "create_copy failed: " . join("\n", (split(/\n/, $self->db->error))[0..2])); return undef; } @@ -136,7 +156,7 @@ sub create_copy { sub _create_copy { my ($self, %params) = @_; - my $copy = Rose::DB::Object::Helpers::clone_and_reset($self); + my $copy = $self->clone_and_reset; $copy->copy_from($self, %params); return $copy; @@ -155,21 +175,26 @@ sub _copy_from { %attributes); } + # Copy custom variables. + foreach my $var (@{ $source->cvars_by_config }) { + $self->cvar_by_name($var->config->name)->value($var->value); + } + my %paste_template_result; # Clone text blocks and pictures. - my $clone_picture = sub { - my ($picture) = @_; - my $cloned = Rose::DB::Object::Helpers::clone_and_reset($picture); + my $clone_and_reset_position = sub { + my ($src_obj) = @_; + my $cloned = $src_obj->clone_and_reset; $cloned->position(undef); return $cloned; }; my $clone_text_block = sub { my ($text_block) = @_; - my $cloned = Rose::DB::Object::Helpers::clone_and_reset($text_block); + my $cloned = $text_block->clone_and_reset; $cloned->position(undef); - $cloned->pictures([ map { $clone_picture->($_) } @{ $text_block->pictures_sorted } ]); + $cloned->pictures([ map { $clone_and_reset_position->($_) } @{ $text_block->pictures_sorted } ]); return $cloned; }; @@ -181,8 +206,13 @@ sub _copy_from { $self->add_text_blocks($paste_template_result{text_blocks}); } + # Clone additional parts. + $paste_template_result{parts} = [ map { $clone_and_reset_position->($_) } @{ $source->parts } ]; + my $accessor = $params->{paste_template} ? "add_parts" : "parts"; + $self->$accessor($paste_template_result{parts}); + # Save new object -- we need its ID for the items. - $self->save; + $self->save(cascade => 1); my %id_to_clone; @@ -190,7 +220,7 @@ sub _copy_from { my $clone_item; $clone_item = sub { my ($item) = @_; - my $cloned = Rose::DB::Object::Helpers::clone_and_reset($item); + my $cloned = $item->clone_and_reset; $cloned->requirement_spec_id($self->id); $cloned->position(undef); $cloned->fb_number(undef) if $params->{paste_template}; @@ -519,6 +549,11 @@ column in ascending order. If the C parameter is given then only the text blocks belonging to that C are returned. +=item C + +Returns an array reference of additional parts sorted by their +positional column in ascending order. + =item C Validate values before saving. Returns list or human-readable error