reconciliation_links automatisch mit Abhängigkeiten löschen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Sep 2016 08:46:10 +0000 (10:46 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Sep 2016 09:18:55 +0000 (11:18 +0200)
Wenn man einen Eintrag aus acc_trans löschen möchte (z.B. beim Löschen
einer gebuchten Einkaufs- oder Verkaufsrechnung, zu der bereits
Zahlungen verbucht wurden, für die wiederum ein Bankabgleich
stattgefunden hat), so wird bisher nur der Eintrag aus ar/ap
entfernt. Datenbanktrigger entfernen dann die Einträge aus »acc_trans« —
doch diese sind in dem Moment noch über »reconciliation_links«
referenziert.

Die »reconciliation_links« verknüpft allerdings ausschließlich die
Einträge aus »acc_trans« bzw. »bank_transactions« ohne weitere
Nebenwirkungen. Daher genügt es, wenn die Einträge über ein »ON DELETE
CASCADE« auf ihren Fremschlüssel mit gelöscht werden.

Diese Änderung betrifft auch #193 (»Kontenabgleich mit Bank« verhindert
nachträgliches Hinzufügen von Zahlungen). Durch die Änderung passiert
jetzt beim nachträglichen Buchen von Zahlungen Folgendes:

• Einträge aus »acc_trans« werden gelöscht
• Einträge aus »reconciliation_links« fliegen durch »ON DELETE CASCADE«
  automatisch mit raus
• Einträge in »acc_trans« werden wieder neu eingefügt, nicht aber
  Einträge in »reconciliation_links«

Sprich diese Änderung versteckt den Bug, dass das nachträgliche
Verändern von Zahlungen bereits abgeglichene Zahlungen falsch
behandelt. Das muss weiterhin gefixt werden, das Fehlverhalten ist
schlicht nicht mehr so offensichtlich.

sql/Pg-upgrade2/auto_delete_reconciliation_links_on_acc_trans_deletion.pl [new file with mode: 0644]

diff --git a/sql/Pg-upgrade2/auto_delete_reconciliation_links_on_acc_trans_deletion.pl b/sql/Pg-upgrade2/auto_delete_reconciliation_links_on_acc_trans_deletion.pl
new file mode 100644 (file)
index 0000000..70e76f7
--- /dev/null
@@ -0,0 +1,26 @@
+# @tag: auto_delete_reconciliation_links_on_acc_trans_deletion
+# @description: Automatisch Einträge aus reconciliation_links entfernen, wenn referenzierte Einträge gelöscht werden
+# @depends: automatic_reconciliation
+package SL::DBUpgrade2::auto_delete_reconciliation_links_on_acc_trans_deletion;
+
+use utf8;
+use strict;
+
+use parent qw(SL::DBUpgrade2::Base);
+
+sub run {
+  my ($self) = @_;
+
+  $self->drop_constraints(table => $_) for qw(reconciliation_links);
+
+  my @queries = (
+    q|ALTER TABLE reconciliation_links ADD CONSTRAINT reconciliation_links_acc_trans_id_fkey   FOREIGN KEY (acc_trans_id)        REFERENCES acc_trans         (acc_trans_id) ON DELETE CASCADE|,
+    q|ALTER TABLE reconciliation_links ADD CONSTRAINT reconciliation_links_bank_transaction_id FOREIGN KEY (bank_transaction_id) REFERENCES bank_transactions (id)           ON DELETE CASCADE|,
+  );
+
+  $self->db_query($_) for @queries;
+
+  return 1;
+}
+
+1;