 COMMENT ON COLUMN "delegation_chain_row"."loop"          IS 'Not null, if member is part of a loop, see "delegation_chain_loop_tag" type';
 
 
+CREATE FUNCTION "delegation_chain_for_closed_issue"
+  ( "member_id_p"           "member"."id"%TYPE,
+    "issue_id_p"            "issue"."id"%TYPE )
+  RETURNS SETOF "delegation_chain_row"
+  LANGUAGE 'plpgsql' STABLE AS $$
+    DECLARE
+      "output_row"           "delegation_chain_row";
+      "direct_voter_row"     "direct_voter"%ROWTYPE;
+      "delegating_voter_row" "delegating_voter"%ROWTYPE;
+    BEGIN
+      "output_row"."index"         := 0;
+      "output_row"."member_id"     := "member_id_p";
+      "output_row"."member_valid"  := TRUE;
+      "output_row"."participation" := FALSE;
+      "output_row"."overridden"    := FALSE;
+      "output_row"."disabled_out"  := FALSE;
+      LOOP
+        SELECT INTO "direct_voter_row" * FROM "direct_voter"
+          WHERE "issue_id" = "issue_id_p"
+          AND "member_id" = "output_row"."member_id";
+        IF "direct_voter_row"."member_id" NOTNULL THEN
+          "output_row"."participation" := TRUE;
+          "output_row"."scope_out"     := NULL;
+          "output_row"."disabled_out"  := NULL;
+          RETURN NEXT "output_row";
+          RETURN;
+        END IF;
+        SELECT INTO "delegating_voter_row" * FROM "delegating_voter"
+          WHERE "issue_id" = "issue_id_p"
+          AND "member_id" = "output_row"."member_id";
+        IF "delegating_voter_row"."member_id" ISNULL THEN
+          RETURN;
+        END IF;
+        "output_row"."scope_out" := "delegating_voter_row"."scope";
+        RETURN NEXT "output_row";
+        "output_row"."member_id" := "delegating_voter_row"."delegate_member_ids"[1];
+        "output_row"."scope_in"  := "output_row"."scope_out";
+      END LOOP;
+    END;
+  $$;
+
+COMMENT ON FUNCTION "delegation_chain_for_closed_issue"
+  ( "member"."id"%TYPE,
+    "member"."id"%TYPE )
+  IS 'Helper function for "delegation_chain" function, handling the special case of closed issues after voting';
+
+
 CREATE FUNCTION "delegation_chain"
   ( "member_id_p"           "member"."id"%TYPE,
     "unit_id_p"             "unit"."id"%TYPE,
     "area_id_p"             "area"."id"%TYPE,
     "issue_id_p"            "issue"."id"%TYPE,
-    "simulate_trustee_id_p" "member"."id"%TYPE )
+    "simulate_trustee_id_p" "member"."id"%TYPE DEFAULT NULL )
   RETURNS SETOF "delegation_chain_row"
   LANGUAGE 'plpgsql' STABLE AS $$
     DECLARE




--------------------------------------------------
-- Set returning function for delegation chains --
--------------------------------------------------


CREATE TYPE "delegation_chain_loop_tag" AS ENUM

        "area_id_p" ISNULL AND
        "issue_id_p" NOTNULL
      THEN
        SELECT INTO "issue_row" * FROM "issue" WHERE "id" = "issue_id_p";
        IF "issue_row"."id" ISNULL THEN
          RETURN;
        END IF;
        IF "issue_row"."closed" NOTNULL THEN
          IF "simulate_trustee_id_p" NOTNULL THEN
            RAISE EXCEPTION 'Tried to simulate delegation chain for closed issue.';
          END IF;
          FOR "output_row" IN
            SELECT * FROM
            "delegation_chain_for_closed_issue"("member_id_p", "issue_id_p")
          LOOP
            RETURN NEXT "output_row";
          END LOOP;
          RETURN;
        END IF;
        "scope_v" := 'issue';
        SELECT "area_id" INTO "area_id_v"
          FROM "issue" WHERE "id" = "issue_id_p";
        SELECT "unit_id" INTO "unit_id_v"
