+sub create_or_update {
+ my $self = shift;
+ my $is_new = !$self->requirement_spec->id;
+ my $params = delete($::form->{requirement_spec}) || { };
+ my $title = $is_new ? t8('Create a new requirement spec') : t8('Edit requirement spec');
+
+ $self->requirement_spec->assign_attributes(%{ $params });
+
+ my @errors = $self->requirement_spec->validate;
+
+ if (@errors) {
+ return $self->js->error(@errors)->render($self) if $::request->is_ajax;
+
+ flash('error', @errors);
+ $self->render('requirement_spec/new', title => $title);
+ return;
+ }
+
+ my $db = $self->requirement_spec->db;
+ if (!$db->do_transaction(sub {
+ if ($self->copy_source) {
+ $self->requirement_spec($self->copy_source->create_copy(%{ $params }));
+ } else {
+ $self->requirement_spec->save;
+ }
+ })) {
+ $::lxdebug->message(LXDebug::WARN(), "Error: " . $db->error);
+ @errors = ($::locale->text('Saving failed. Error message from the database: #1'), $db->error);
+ return $self->js->error(@errors)->render($self) if $::request->is_ajax;
+
+ $self->requirement_spec->id(undef) if $is_new;
+ flash('error', @errors);
+ return $self->render('requirement_spec/new', title => $title);
+ }
+
+ if ($::request->is_ajax) {
+ my $html = $self->render('requirement_spec/_header', { output => 0 });
+ return $self->invalidate_version
+ ->replaceWith('#requirement-spec-header', $html)
+ ->flash('info', t8('The requirement spec has been saved.'))
+ ->render($self);
+ }
+
+ flash_later('info', $is_new ? t8('The requirement spec has been created.') : t8('The requirement spec has been saved.'));
+ $self->redirect_to(action => 'show', id => $self->requirement_spec->id);