Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / DB / RequirementSpec.pm
index bc68c17..024e60d 100644 (file)
@@ -9,6 +9,10 @@ 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);
@@ -141,7 +145,7 @@ sub create_copy {
   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;
   }
@@ -152,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;
@@ -171,19 +175,24 @@ 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_and_reset_position = sub {
     my ($src_obj) = @_;
-    my $cloned    = Rose::DB::Object::Helpers::clone_and_reset($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_and_reset_position->($_) } @{ $text_block->pictures_sorted } ]);
     return $cloned;
@@ -203,7 +212,7 @@ sub _copy_from {
   $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;
 
@@ -211,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};