Files
heygermany-e2e-mrg5ct1q/db/postgres/0025-lifecycle-v2.sql
e2e 2c4174b44b
Some checks failed
Main / Setup and Test (push) Has been cancelled
Main / Build Website (push) Has been cancelled
chore: heygermany customer project
2026-07-11 11:13:08 +02:00

74 lines
2.9 KiB
PL/PgSQL

ALTER TYPE app.applicant_status ADD VALUE IF NOT EXISTS 'Failed';
ALTER TABLE app.candidate
ADD COLUMN IF NOT EXISTS status_changed_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
ADD COLUMN IF NOT EXISTS lifecycle_notifications jsonb DEFAULT '{}'::jsonb NOT NULL,
ADD COLUMN IF NOT EXISTS analysis_last_run_at timestamp with time zone,
ADD COLUMN IF NOT EXISTS analysis_input_fingerprint text,
ADD COLUMN IF NOT EXISTS invalidated_at timestamp with time zone,
ADD COLUMN IF NOT EXISTS reupload_requested_at timestamp with time zone,
ADD COLUMN IF NOT EXISTS reuploaded_at timestamp with time zone,
ADD COLUMN IF NOT EXISTS failed_purged_at timestamp with time zone;
UPDATE app.candidate
SET status_changed_at = CASE
WHEN status = 'Initial'::app.applicant_status THEN COALESCE(created_at, last_updated_at, CURRENT_TIMESTAMP)
WHEN status = 'Pending'::app.applicant_status THEN COALESCE(submitted_at, last_updated_at, created_at, CURRENT_TIMESTAMP)
ELSE COALESCE(last_updated_at, submitted_at, created_at, CURRENT_TIMESTAMP)
END;
CREATE INDEX IF NOT EXISTS idx_candidate_status_changed_at ON app.candidate (status, status_changed_at);
CREATE INDEX IF NOT EXISTS idx_candidate_reupload_flags ON app.candidate (invalidated_at, reuploaded_at);
CREATE OR REPLACE FUNCTION app.handle_candidate_status_lifecycle()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.status IS DISTINCT FROM OLD.status THEN
NEW.status_changed_at = CURRENT_TIMESTAMP;
IF NEW.status = 'Invalid'::app.applicant_status THEN
NEW.invalidated_at = CURRENT_TIMESTAMP;
NEW.reuploaded_at = NULL;
ELSIF OLD.status = 'Invalid'::app.applicant_status
AND NEW.status = 'Initial'::app.applicant_status THEN
NEW.reupload_requested_at = CURRENT_TIMESTAMP;
END IF;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS candidate_status_lifecycle_trigger ON app.candidate;
CREATE TRIGGER candidate_status_lifecycle_trigger
BEFORE UPDATE OF status ON app.candidate
FOR EACH ROW
EXECUTE FUNCTION app.handle_candidate_status_lifecycle();
CREATE OR REPLACE FUNCTION app.mark_candidate_reuploaded_after_invalid()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.uploaded IS TRUE
AND (OLD.uploaded IS DISTINCT FROM TRUE) THEN
UPDATE app.candidate
SET reuploaded_at = CURRENT_TIMESTAMP
WHERE candidate_id = NEW.candidate_id
AND invalidated_at IS NOT NULL
AND status = 'Initial'::app.applicant_status
AND (reuploaded_at IS NULL OR reuploaded_at < invalidated_at);
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS candidate_document_reupload_marker_trigger ON app.candidate_document;
CREATE TRIGGER candidate_document_reupload_marker_trigger
AFTER UPDATE OF uploaded ON app.candidate_document
FOR EACH ROW
EXECUTE FUNCTION app.mark_candidate_reuploaded_after_invalid();