projects
/
kivitendo-erp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Payment - falsche geschweifte Klammer bei Skonto Zahlungsvorschlag
[kivitendo-erp.git]
/
SL
/
DB
/
RequirementSpec.pm
diff --git
a/SL/DB/RequirementSpec.pm
b/SL/DB/RequirementSpec.pm
index
52ae4ec
..
1cc1771
100644
(file)
--- a/
SL/DB/RequirementSpec.pm
+++ b/
SL/DB/RequirementSpec.pm
@@
-8,6
+8,12
@@
use Rose::DB::Object::Helpers;
use SL::DB::MetaSetup::RequirementSpec;
use SL::DB::Manager::RequirementSpec;
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);
use SL::Locale::String;
use SL::Util qw(_hashify);
@@
-42,10
+48,17
@@
__PACKAGE__->meta->add_relationship(
class => 'SL::DB::RequirementSpecOrder',
column_map => { id => 'requirement_spec_id' },
},
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__->meta->initialize;
+__PACKAGE__->attr_duration(qw(time_estimation));
+
__PACKAGE__->before_save('_before_save_initialize_not_null_columns');
sub validate {
__PACKAGE__->before_save('_before_save_initialize_not_null_columns');
sub validate {
@@
-60,8
+73,9
@@
sub validate {
sub _before_save_initialize_not_null_columns {
my ($self) = @_;
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;
}
return 1;
}
@@
-117,6
+131,14
@@
sub versioned_copies_sorted {
return \@copies;
}
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) = @_;
sub create_copy {
my ($self, %params) = @_;
@@
-149,17
+171,30
@@
sub _copy_from {
# Copy attributes.
if (!$params->{paste_template}) {
# 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);
}
%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;
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);
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;
};
return $cloned;
};
@@
-171,8
+206,13
@@
sub _copy_from {
$self->add_text_blocks($paste_template_result{text_blocks});
}
$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.
# Save new object -- we need its ID for the items.
- $self->save;
+ $self->save
(cascade => 1)
;
my %id_to_clone;
my %id_to_clone;
@@
-292,6
+332,12
@@
sub invalidate_version {
);
}
);
}
+sub compare_to {
+ my ($self, $other) = @_;
+
+ return $self->id <=> $other->id;
+}
+
1;
__END__
1;
__END__
@@
-503,6
+549,11
@@
column in ascending order. If the C<output_position> parameter is
given then only the text blocks belonging to that C<output_position>
are returned.
given then only the text blocks belonging to that C<output_position>
are returned.
+=item C<parts_sorted>
+
+Returns an array reference of additional parts sorted by their
+positional column in ascending order.
+
=item C<validate>
Validate values before saving. Returns list or human-readable error
=item C<validate>
Validate values before saving. Returns list or human-readable error