text: BEGIN;
  
  CREATE OR REPLACE VIEW "liquid_feedback_version" AS
    SELECT * FROM (VALUES ('2.2.4', 2, 2, 4))
    AS "subquery"("string", "major", "minor", "revision");
  
  
  ALTER TABLE "member" ADD COLUMN "last_delegation_check" TIMESTAMPTZ;
  ALTER TABLE "member" ADD COLUMN "login_recovery_expiry" TIMESTAMPTZ;
  
  COMMENT ON COLUMN "member"."last_delegation_check" IS 'Timestamp of last delegation check (i.e. confirmation of all unit and area delegations)';
  COMMENT ON COLUMN "member"."login_recovery_expiry"        IS 'Date/time after which another login recovery attempt is allowed';
  COMMENT ON COLUMN "member"."password_reset_secret"        IS 'Secret string sent via e-mail for password recovery';
  COMMENT ON COLUMN "member"."password_reset_secret_expiry" IS 'Date/time until the password recovery secret is valid, and date/time after which another password recovery attempt is allowed';
  
  ALTER TABLE "session" ADD COLUMN "needs_delegation_check" BOOLEAN NOT NULL DEFAULT FALSE;
  COMMENT ON COLUMN "session"."needs_delegation_check" IS 'Set to TRUE, if member must perform a delegation check to proceed with login; see column "last_delegation_check" in "member" table';
   
  CREATE OR REPLACE VIEW "event_seen_by_member" AS
    SELECT
      "member"."id" AS "seen_by_member_id",
      CASE WHEN "event"."state" IN (
        'voting',
        'finished_without_winner',
        'finished_with_winner'
      ) THEN
        'voting'::"notify_level"
      ELSE
        CASE WHEN "event"."state" IN (
          'verification',
          'canceled_after_revocation_during_verification',
          'canceled_no_initiative_admitted'
        ) THEN
          'verification'::"notify_level"
        ELSE
          CASE WHEN "event"."state" IN (
            'discussion',
            'canceled_after_revocation_during_discussion'
          ) THEN
            'discussion'::"notify_level"
          ELSE
            'all'::"notify_level"
          END
        END
      END AS "notify_level",
      "event".*
    FROM "member" CROSS JOIN "event"
    LEFT JOIN "issue"
      ON "event"."issue_id" = "issue"."id"
    LEFT JOIN "membership"
      ON "member"."id" = "membership"."member_id"
      AND "issue"."area_id" = "membership"."area_id"
    LEFT JOIN "interest"
      ON "member"."id" = "interest"."member_id"
      AND "event"."issue_id" = "interest"."issue_id"
    LEFT JOIN "ignored_member"
      ON "member"."id" = "ignored_member"."member_id"
      AND "event"."member_id" = "ignored_member"."other_member_id"
    LEFT JOIN "ignored_initiative"
      ON "member"."id" = "ignored_initiative"."member_id"
      AND "event"."initiative_id" = "ignored_initiative"."initiative_id"
    WHERE (
      "interest"."member_id" NOTNULL OR
      ( "membership"."member_id" NOTNULL AND
        "event"."event" IN (
          'issue_state_changed',
          'initiative_created_in_new_issue',
          'initiative_created_in_existing_issue',
          'initiative_revoked' ) ) )
    AND "ignored_member"."member_id" ISNULL
    AND "ignored_initiative"."member_id" ISNULL;
  
  CREATE OR REPLACE VIEW "selected_event_seen_by_member" AS
    SELECT
      "member"."id" AS "seen_by_member_id",
      CASE WHEN "event"."state" IN (
        'voting',
        'finished_without_winner',
        'finished_with_winner'
      ) THEN
        'voting'::"notify_level"
      ELSE
        CASE WHEN "event"."state" IN (
          'verification',
          'canceled_after_revocation_during_verification',
          'canceled_no_initiative_admitted'
        ) THEN
          'verification'::"notify_level"
        ELSE
          CASE WHEN "event"."state" IN (
            'discussion',
            'canceled_after_revocation_during_discussion'
          ) THEN
            'discussion'::"notify_level"
          ELSE
            'all'::"notify_level"
          END
        END
      END AS "notify_level",
      "event".*
    FROM "member" CROSS JOIN "event"
    LEFT JOIN "issue"
      ON "event"."issue_id" = "issue"."id"
    LEFT JOIN "membership"
      ON "member"."id" = "membership"."member_id"
      AND "issue"."area_id" = "membership"."area_id"
    LEFT JOIN "interest"
      ON "member"."id" = "interest"."member_id"
      AND "event"."issue_id" = "interest"."issue_id"
    LEFT JOIN "ignored_member"
      ON "member"."id" = "ignored_member"."member_id"
      AND "event"."member_id" = "ignored_member"."other_member_id"
    LEFT JOIN "ignored_initiative"
      ON "member"."id" = "ignored_initiative"."member_id"
      AND "event"."initiative_id" = "ignored_initiative"."initiative_id"
    WHERE (
      ( "member"."notify_level" >= 'all' ) OR
      ( "member"."notify_level" >= 'voting' AND
        "event"."state" IN (
          'voting',
          'finished_without_winner',
          'finished_with_winner' ) ) OR
      ( "member"."notify_level" >= 'verification' AND
        "event"."state" IN (
          'verification',
          'canceled_after_revocation_during_verification',
          'canceled_no_initiative_admitted' ) ) OR
      ( "member"."notify_level" >= 'discussion' AND
        "event"."state" IN (
          'discussion',
          'canceled_after_revocation_during_discussion' ) ) )
    AND (
      "interest"."member_id" NOTNULL OR
      ( "membership"."member_id" NOTNULL AND
        "event"."event" IN (
          'issue_state_changed',
          'initiative_created_in_new_issue',
          'initiative_created_in_existing_issue',
          'initiative_revoked' ) ) )
    AND "ignored_member"."member_id" ISNULL
    AND "ignored_initiative"."member_id" ISNULL;
  
  CREATE OR REPLACE FUNCTION "delete_member"("member_id_p" "member"."id"%TYPE)
    RETURNS VOID
    LANGUAGE 'plpgsql' VOLATILE AS $$
      BEGIN
        UPDATE "member" SET
          "last_login"                   = NULL,
          "last_delegation_check"        = NULL,
          "login"                        = NULL,
          "password"                     = NULL,
          "locked"                       = TRUE,
          "active"                       = FALSE,
          "notify_email"                 = NULL,
          "notify_email_unconfirmed"     = NULL,
          "notify_email_secret"          = NULL,
          "notify_email_secret_expiry"   = NULL,
          "notify_email_lock_expiry"     = NULL,
          "login_recovery_expiry"        = NULL,
          "password_reset_secret"        = NULL,
          "password_reset_secret_expiry" = NULL,
          "organizational_unit"          = NULL,
          "internal_posts"               = NULL,
          "realname"                     = NULL,
          "birthday"                     = NULL,
          "address"                      = NULL,
          "email"                        = NULL,
          "xmpp_address"                 = NULL,
          "website"                      = NULL,
          "phone"                        = NULL,
          "mobile_phone"                 = NULL,
          "profession"                   = NULL,
          "external_memberships"         = NULL,
          "external_posts"               = NULL,
          "statement"                    = NULL
          WHERE "id" = "member_id_p";
        -- "text_search_data" is updated by triggers
        DELETE FROM "setting"            WHERE "member_id" = "member_id_p";
        DELETE FROM "setting_map"        WHERE "member_id" = "member_id_p";
        DELETE FROM "member_relation_setting" WHERE "member_id" = "member_id_p";
        DELETE FROM "member_image"       WHERE "member_id" = "member_id_p";
        DELETE FROM "contact"            WHERE "member_id" = "member_id_p";
        DELETE FROM "ignored_member"     WHERE "member_id" = "member_id_p";
        DELETE FROM "session"            WHERE "member_id" = "member_id_p";
        DELETE FROM "area_setting"       WHERE "member_id" = "member_id_p";
        DELETE FROM "issue_setting"      WHERE "member_id" = "member_id_p";
        DELETE FROM "ignored_initiative" WHERE "member_id" = "member_id_p";
        DELETE FROM "initiative_setting" WHERE "member_id" = "member_id_p";
        DELETE FROM "suggestion_setting" WHERE "member_id" = "member_id_p";
        DELETE FROM "membership"         WHERE "member_id" = "member_id_p";
        DELETE FROM "delegation"         WHERE "truster_id" = "member_id_p";
        DELETE FROM "non_voter"          WHERE "member_id" = "member_id_p";
        DELETE FROM "direct_voter" USING "issue"
          WHERE "direct_voter"."issue_id" = "issue"."id"
          AND "issue"."closed" ISNULL
          AND "member_id" = "member_id_p";
        RETURN;
      END;
    $$;
  
  CREATE OR REPLACE FUNCTION "delete_private_data"()
    RETURNS VOID
    LANGUAGE 'plpgsql' VOLATILE AS $$
      BEGIN
        DELETE FROM "temporary_transaction_data";
        DELETE FROM "member" WHERE "activated" ISNULL;
        UPDATE "member" SET
          "invite_code"                  = NULL,
          "invite_code_expiry"           = NULL,
          "admin_comment"                = NULL,
          "last_login"                   = NULL,
          "last_delegation_check"        = NULL,
          "login"                        = NULL,
          "password"                     = NULL,
          "lang"                         = NULL,
          "notify_email"                 = NULL,
          "notify_email_unconfirmed"     = NULL,
          "notify_email_secret"          = NULL,
          "notify_email_secret_expiry"   = NULL,
          "notify_email_lock_expiry"     = NULL,
          "notify_level"                 = NULL,
          "login_recovery_expiry"        = NULL,
          "password_reset_secret"        = NULL,
          "password_reset_secret_expiry" = NULL,
          "organizational_unit"          = NULL,
          "internal_posts"               = NULL,
          "realname"                     = NULL,
          "birthday"                     = NULL,
          "address"                      = NULL,
          "email"                        = NULL,
          "xmpp_address"                 = NULL,
          "website"                      = NULL,
          "phone"                        = NULL,
          "mobile_phone"                 = NULL,
          "profession"                   = NULL,
          "external_memberships"         = NULL,
          "external_posts"               = NULL,
          "formatting_engine"            = NULL,
          "statement"                    = NULL;
        -- "text_search_data" is updated by triggers
        DELETE FROM "setting";
        DELETE FROM "setting_map";
        DELETE FROM "member_relation_setting";
        DELETE FROM "member_image";
        DELETE FROM "contact";
        DELETE FROM "ignored_member";
        DELETE FROM "session";
        DELETE FROM "area_setting";
        DELETE FROM "issue_setting";
        DELETE FROM "ignored_initiative";
        DELETE FROM "initiative_setting";
        DELETE FROM "suggestion_setting";
        DELETE FROM "non_voter";
        DELETE FROM "direct_voter" USING "issue"
          WHERE "direct_voter"."issue_id" = "issue"."id"
          AND "issue"."closed" ISNULL;
        RETURN;
      END;
    $$;
  
  COMMIT;
  