diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql index d8df06ab62377c8ca80c3a282eb08a0f5a7e6b89..d9c301f6bcd1a8c77ebc435b97c8feb156bb5447 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(); + +---------------------------------------------------------------------------------------------------------------------