X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FRequirementSpec.pm;h=cd603aa6f1c4ef3f05d03eb65e3dc14b8be6d5f3;hb=fee5532a132c44dcfc1743393cba00c8e3397176;hp=52ae4eca7d901dd7f5b4bf7b57fbe538bae95b70;hpb=13fbd33663c229ec309a858ac1d393fdd508ddbe;p=kivitendo-erp.git diff --git a/SL/DB/RequirementSpec.pm b/SL/DB/RequirementSpec.pm index 52ae4eca7..cd603aa6f 100644 --- a/SL/DB/RequirementSpec.pm +++ b/SL/DB/RequirementSpec.pm @@ -8,6 +8,7 @@ use Rose::DB::Object::Helpers; use SL::DB::MetaSetup::RequirementSpec; use SL::DB::Manager::RequirementSpec; +use SL::DB::Helper::LinkedRecords; use SL::Locale::String; use SL::Util qw(_hashify); @@ -42,6 +43,11 @@ __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; @@ -60,8 +66,9 @@ sub validate { sub _before_save_initialize_not_null_columns { my ($self) = @_; - $self->previous_section_number(0) if !defined $self->previous_section_number; - $self->previous_fb_number(0) if !defined $self->previous_fb_number; + for (qw(previous_section_number previous_fb_number previous_picture_number)) { + $self->$_(0) if !defined $self->$_; + } return 1; } @@ -117,6 +124,14 @@ 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) = @_; @@ -149,17 +164,25 @@ sub _copy_from { # Copy attributes. if (!$params->{paste_template}) { - $self->assign_attributes(map({ ($_ => $source->$_) } qw(type_id status_id customer_id project_id title hourly_rate time_estimation previous_section_number previous_fb_number is_template)), + $self->assign_attributes(map({ ($_ => $source->$_) } qw(type_id status_id customer_id project_id title hourly_rate time_estimation previous_section_number previous_fb_number previous_picture_number is_template)), %attributes); } my %paste_template_result; - # Clone text blocks. + # Clone text blocks and pictures. + my $clone_and_reset_position = sub { + my ($src_obj) = @_; + my $cloned = Rose::DB::Object::Helpers::clone_and_reset($src_obj); + $cloned->position(undef); + return $cloned; + }; + my $clone_text_block = sub { my ($text_block) = @_; my $cloned = Rose::DB::Object::Helpers::clone_and_reset($text_block); $cloned->position(undef); + $cloned->pictures([ map { $clone_and_reset_position->($_) } @{ $text_block->pictures_sorted } ]); return $cloned; }; @@ -171,6 +194,11 @@ 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; @@ -292,6 +320,12 @@ sub invalidate_version { ); } +sub compare_to { + my ($self, $other) = @_; + + return $self->id <=> $other->id; +} + 1; __END__ @@ -503,6 +537,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