1 -- @tag: delete_cvars_on_trans_deletion
 
   2 -- @description: Einträge in benutzerdefinierten Variablen löschen, deren Bezugsbelege gelöscht wurde
 
   3 -- @depends: release_3_1_0
 
   5 -- 1. Alle benutzerdefinierten Variablen löschen, für die es keine
 
   6 -- Einträge in den dazugehörigen Tabellen mehr gibt.
 
   8 -- 1.1. Alle CVars für Artikel selber (sub_module ist leer):
 
   9 DELETE FROM custom_variables
 
  10 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'IC'))
 
  11   AND (COALESCE(sub_module, '') = '')
 
  12   AND (trans_id NOT IN (SELECT id FROM parts));
 
  14 -- 1.2. Alle CVars für Angebote/Aufträge, Lieferscheine, Rechnungen
 
  15 -- (sub_module gesetzt):
 
  16 DELETE FROM custom_variables
 
  17 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'IC'))
 
  18   AND (sub_module = 'orderitems')
 
  19   AND (trans_id NOT IN (SELECT id FROM orderitems));
 
  21 DELETE FROM custom_variables
 
  22 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'IC'))
 
  23   AND (sub_module = 'delivery_order_items')
 
  24   AND (trans_id NOT IN (SELECT id FROM delivery_order_items));
 
  26 DELETE FROM custom_variables
 
  27 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'IC'))
 
  28   AND (sub_module = 'invoice')
 
  29   AND (trans_id NOT IN (SELECT id FROM invoice));
 
  31 -- 1.3. Alle CVars für Kunden/Lieferanten:
 
  32 DELETE FROM custom_variables
 
  33 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'CT'))
 
  34   AND (trans_id NOT IN (SELECT id FROM customer UNION SELECT id FROM vendor));
 
  36 -- 1.4. Alle CVars für Ansprechpersonen:
 
  37 DELETE FROM custom_variables
 
  38 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'Contacts'))
 
  39   AND (trans_id NOT IN (SELECT cp_id FROM contacts));
 
  41 -- 1.5. Alle CVars für Projekte:
 
  42 DELETE FROM custom_variables
 
  43 WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = 'Projects'))
 
  44   AND (trans_id NOT IN (SELECT id FROM project));
 
  46 -- 2. Triggerfunktionen erstellen, die die benutzerdefinierten
 
  49 -- 2.1. Parametrisierte Backend-Funktion zum Löschen:
 
  50 CREATE OR REPLACE FUNCTION delete_custom_variables_with_sub_module(config_module TEXT, cvar_sub_module TEXT, old_id INTEGER)
 
  53     DELETE FROM custom_variables
 
  54     WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE module = config_module))
 
  55       AND (COALESCE(sub_module, '') = cvar_sub_module)
 
  56       AND (trans_id                 = old_id);
 
  62 -- 2.2. Nun die Funktionen, die als Trigger aufgerufen wird und die
 
  63 -- entscheidet, wie genau zu löschen ist:
 
  64 CREATE OR REPLACE FUNCTION delete_custom_variables_trigger()
 
  67     IF (TG_TABLE_NAME IN ('orderitems', 'delivery_order_items', 'invoice')) THEN
 
  68       PERFORM delete_custom_variables_with_sub_module('IC', TG_TABLE_NAME, old.id);
 
  71     IF (TG_TABLE_NAME = 'parts') THEN
 
  72       PERFORM delete_custom_variables_with_sub_module('IC', '', old.id);
 
  75     IF (TG_TABLE_NAME IN ('customer', 'vendor')) THEN
 
  76       PERFORM delete_custom_variables_with_sub_module('CT', '', old.id);
 
  79     IF (TG_TABLE_NAME = 'contacts') THEN
 
  80       PERFORM delete_custom_variables_with_sub_module('Contacts', '', old.id);
 
  83     IF (TG_TABLE_NAME = 'project') THEN
 
  84       PERFORM delete_custom_variables_with_sub_module('Projects', '', old.id);
 
  91 -- 3. Die eigentlichen Trigger erstellen:
 
  94 DROP TRIGGER IF EXISTS orderitems_delete_custom_variables_after_deletion ON orderitems;
 
  96 CREATE TRIGGER orderitems_delete_custom_variables_after_deletion
 
  97 AFTER DELETE ON orderitems
 
  98 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 100 -- 3.2. delivery_order_items
 
 101 DROP TRIGGER IF EXISTS delivery_order_items_delete_custom_variables_after_deletion ON delivery_order_items;
 
 103 CREATE TRIGGER delivery_order_items_delete_custom_variables_after_deletion
 
 104 AFTER DELETE ON delivery_order_items
 
 105 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 108 DROP TRIGGER IF EXISTS invoice_delete_custom_variables_after_deletion ON invoice;
 
 110 CREATE TRIGGER invoice_delete_custom_variables_after_deletion
 
 111 AFTER DELETE ON invoice
 
 112 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 115 DROP TRIGGER IF EXISTS parts_delete_custom_variables_after_deletion ON parts;
 
 117 CREATE TRIGGER parts_delete_custom_variables_after_deletion
 
 118 AFTER DELETE ON parts
 
 119 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 122 DROP TRIGGER IF EXISTS customer_delete_custom_variables_after_deletion ON customer;
 
 124 CREATE TRIGGER customer_delete_custom_variables_after_deletion
 
 125 AFTER DELETE ON customer
 
 126 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 129 DROP TRIGGER IF EXISTS vendor_delete_custom_variables_after_deletion ON vendor;
 
 131 CREATE TRIGGER vendor_delete_custom_variables_after_deletion
 
 132 AFTER DELETE ON vendor
 
 133 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 136 DROP TRIGGER IF EXISTS contacts_delete_custom_variables_after_deletion ON contacts;
 
 138 CREATE TRIGGER contacts_delete_custom_variables_after_deletion
 
 139 AFTER DELETE ON contacts
 
 140 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();
 
 143 DROP TRIGGER IF EXISTS project_delete_custom_variables_after_deletion ON project;
 
 145 CREATE TRIGGER project_delete_custom_variables_after_deletion
 
 146 AFTER DELETE ON project
 
 147 FOR EACH ROW EXECUTE PROCEDURE delete_custom_variables_trigger();