From e3c36c9720574bf3d0632350ae9ef96a9b19db96 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Mon, 6 Jun 2016 08:26:08 +0000
Subject: [PATCH] Task #8887: added constrain trigger to
 update_specification_successor_startendtimes

---
 .../sql/add_triggers.sql                      | 40 +++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql
index d8df06ab623..d9c301f6bcd 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql
@@ -143,3 +143,43 @@ CREATE TRIGGER trigger_before_insert_conflict_reason_do_task_status_check
   EXECUTE PROCEDURE resource_allocation.before_insert_conflict_reason_do_task_status_check();
 
 ---------------------------------------------------------------------------------------------------------------------
+
+DROP TRIGGER IF EXISTS trigger_specification_update_successor_startendtimes ON resource_allocation.specification;
+DROP FUNCTION IF EXISTS resource_allocation.update_specification_successor_startendtimes();
+
+CREATE OR REPLACE FUNCTION resource_allocation.update_specification_successor_startendtimes()
+  RETURNS trigger AS
+$BODY$
+DECLARE
+task RECORD;
+suc_task RECORD;
+successor_task_id int;
+moved_end_seconds double precision;
+BEGIN
+    IF NEW.starttime <> OLD.starttime OR NEW.endtime <> OLD.endtime THEN
+        SELECT EXTRACT(epoch FROM age(NEW.endtime, OLD.endtime)) INTO moved_end_seconds;
+	FOR task IN SELECT * FROM resource_allocation.task_view tv WHERE tv.specification_id = NEW.id LOOP
+	    IF task.successor_ids IS NOT NULL THEN
+		    FOREACH successor_task_id IN ARRAY task.successor_ids LOOP
+			FOR suc_task IN SELECT * FROM resource_allocation.task_view tv WHERE tv.id = successor_task_id LOOP
+			    UPDATE resource_allocation.specification SET (starttime, endtime) = (starttime + moved_end_seconds * interval '1 second', endtime + moved_end_seconds * interval '1 second') WHERE id = suc_task.specification_id;
+			END LOOP;
+		    END LOOP;
+	    END IF;
+	END LOOP;
+    END IF;
+RETURN NEW;
+END;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+ALTER FUNCTION resource_allocation.update_specification_successor_startendtimes()
+  OWNER TO resourceassignment;
+
+CREATE TRIGGER trigger_specification_update_successor_startendtimes
+  AFTER UPDATE
+  ON resource_allocation.specification
+  FOR EACH ROW
+  EXECUTE PROCEDURE resource_allocation.update_specification_successor_startendtimes();
+
+---------------------------------------------------------------------------------------------------------------------
-- 
GitLab