Verknüfpte Belege: Keine Verknüpfungen zu Angebot von Angebot oder Auftrag.
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Wed, 23 Mar 2022 09:41:57 +0000 (10:41 +0100)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 28 Mar 2022 09:45:12 +0000 (11:45 +0200)
Ein Angbot beginnt immer einen neuen Workflow (es sei denn der Vorgänger ist
ein Pflichtenheft).
Das kann sonst dazu führen, dass eine Position mehrere Angebote als Vorgänger
hat und dann kann das Angebot nicht mehr gedruckt werden. Auch logisch ist
das nicht sinnvoll.

Fix im Auftrags-Controller und Upgrade-Skript, um solche Verknüpfungen zu
entfernen.

SL/Controller/Order.pm
sql/Pg-upgrade2/record_links_remove_to_quotation.pl [new file with mode: 0644]

index f0920f7..b7793b1 100644 (file)
@@ -1847,7 +1847,10 @@ sub workflow_sales_or_request_for_quotation {
   my $destination_type = $::form->{type} eq sales_order_type() ? sales_quotation_type() : request_quotation_type();
 
   $self->order(SL::DB::Order->new_from($self->order, destination_type => $destination_type));
-  $self->{converted_from_oe_id} = delete $::form->{id};
+  delete $::form->{id};
+
+  # no linked records from order to quotations
+  delete $::form->{$_} for qw(converted_from_oe_id converted_from_orderitems_ids);
 
   # set item ids to new fake id, to identify them as new items
   foreach my $item (@{$self->order->items_sorted}) {
diff --git a/sql/Pg-upgrade2/record_links_remove_to_quotation.pl b/sql/Pg-upgrade2/record_links_remove_to_quotation.pl
new file mode 100644 (file)
index 0000000..e926006
--- /dev/null
@@ -0,0 +1,51 @@
+# @tag: record_links_remove_to_quotation
+# @description: Verknüpfte Positionen mit Ziel Angebot und dazugehörige Belegverknüpfung entfernen, wenn Quelle Angebot oder Auftrag.
+# @depends: release_3_6_0
+package SL::DBUpgrade2::record_links_remove_to_quotation;
+
+use strict;
+use utf8;
+
+use parent qw(SL::DBUpgrade2::Base);
+
+use SL::DBUtils;
+
+sub run {
+  my ($self) = @_;
+
+  my $query = qq|SELECT record_links.id AS rl_id, from_oe.id AS from_oe_id, to_oe.id AS to_oe_id FROM record_links
+                   LEFT JOIN orderitems from_oi ON (from_oi.id = from_id)
+                   LEFT JOIN orderitems to_oi   ON (to_oi.id   = to_id)
+                   LEFT JOIN oe         from_oe ON (from_oe.id = from_oi.trans_id)
+                   LEFT JOIN oe         to_oe   ON (to_oe.id   = to_oi.trans_id)
+                 WHERE from_table = 'orderitems'
+                   AND to_table   = 'orderitems'
+                   AND to_oe.quotation IS TRUE|;
+
+  my $refs = selectall_hashref_query($::form, $self->dbh, $query);
+
+  my $query_delete_oi_links = qq|
+    DELETE FROM record_links WHERE id = ?;
+  |;
+  my $sth_delete_oi_links = $self->dbh->prepare($query_delete_oi_links);
+
+  my $query_delete_oe_links = qq|
+    DELETE FROM record_links WHERE from_table = 'oe' AND to_table = 'oe' AND from_id = ? AND to_id = ?;
+  |;
+  my $sth_delete_oe_links = $self->dbh->prepare($query_delete_oe_links);
+
+  my %oe_links;
+  foreach my $ref (@$refs) {
+    $sth_delete_oi_links->execute($ref->{rl_id}) || $::form->dberror($query_delete_oi_links);
+    $oe_links{$ref->{from_oe_id} . ':' . $ref->{to_oe_id}} = 1;
+  }
+
+  for my $from_to (keys %oe_links) {
+    my ($from_oe_id, $to_oe_id) = split ':', $from_to;
+    $sth_delete_oe_links->execute($from_oe_id, $to_oe_id) || $::form->dberror($query_delete_oe_links);
+  }
+
+  return 1;
+}
+
+1;