chore: heygermany customer project
Some checks failed
Main / Setup and Test (push) Has been cancelled
Main / Build Website (push) Has been cancelled

This commit is contained in:
e2e
2026-07-11 09:28:50 +02:00
commit aae77ea31e
398 changed files with 38345 additions and 0 deletions

452
db/sqlite/0001-baseline.sql Normal file
View File

@@ -0,0 +1,452 @@
PRAGMA foreign_keys = ON;
CREATE TABLE IF NOT EXISTS "auth_user" (
"id" TEXT PRIMARY KEY,
"name" TEXT NOT NULL,
"email" TEXT NOT NULL UNIQUE,
"email_verified" BOOLEAN NOT NULL DEFAULT 0,
"image" TEXT,
"role" TEXT NOT NULL DEFAULT 'owner',
"type" TEXT NOT NULL DEFAULT 'candidate',
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "auth_session" (
"id" TEXT PRIMARY KEY,
"expires_at" TIMESTAMP NOT NULL,
"token" TEXT NOT NULL UNIQUE,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"ip_address" TEXT,
"user_agent" TEXT,
"user_id" TEXT NOT NULL REFERENCES "auth_user"("id") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS "auth_account" (
"id" TEXT PRIMARY KEY,
"account_id" TEXT NOT NULL,
"provider_id" TEXT NOT NULL,
"user_id" TEXT NOT NULL REFERENCES "auth_user"("id") ON DELETE CASCADE,
"access_token" TEXT,
"refresh_token" TEXT,
"id_token" TEXT,
"access_token_expires_at" TIMESTAMP,
"refresh_token_expires_at" TIMESTAMP,
"scope" TEXT,
"password" TEXT,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE ("provider_id", "account_id")
);
CREATE TABLE IF NOT EXISTS "auth_verification" (
"id" TEXT PRIMARY KEY,
"identifier" TEXT NOT NULL,
"value" TEXT NOT NULL,
"expires_at" TIMESTAMP NOT NULL,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "countries" (
"iso3" CHAR(3) PRIMARY KEY,
"iso2" CHAR(2) NOT NULL,
"name" TEXT NOT NULL,
"name_br" TEXT,
"name_ko" TEXT,
"name_pt_br" TEXT,
"name_pt" TEXT,
"name_nl" TEXT,
"name_hr" TEXT,
"name_fa" TEXT,
"name_de" TEXT,
"name_es" TEXT,
"name_fr" TEXT,
"name_ja" TEXT,
"name_it" TEXT,
"name_zh_cn" TEXT,
"name_tr" TEXT,
"name_ru" TEXT,
"name_uk" TEXT,
"name_pl" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "user" (
"user_id" TEXT PRIMARY KEY,
"email" TEXT NOT NULL UNIQUE,
"name" TEXT NOT NULL,
"email_verified_at" TIMESTAMP,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"role" TEXT NOT NULL,
"type" TEXT NOT NULL,
"email_verification_token" TEXT
);
CREATE TABLE IF NOT EXISTS "user_auth" (
"user_id" TEXT PRIMARY KEY REFERENCES "user"("user_id") ON DELETE CASCADE,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"magic_link" TEXT
);
CREATE TABLE IF NOT EXISTS "candidate" (
"candidate_id" TEXT PRIMARY KEY,
"email" TEXT NOT NULL UNIQUE,
"name" TEXT NOT NULL,
"state_work_preference" ARRAY,
"join_talent_pool" BOOLEAN,
"living_in_germany" BOOLEAN,
"eu_passport" BOOLEAN,
"country_education" TEXT REFERENCES "countries"("iso3"),
"license_provided" BOOLEAN,
"language_certificate_provided" BOOLEAN,
"language_self_assessment_level" TEXT,
"submitted_at" TIMESTAMP,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"phone" TEXT,
"date_of_birth" DATE,
"current_residence" TEXT,
"qualification_status_home_country" TEXT,
"qualification_status_germany" TEXT,
"license_mandatory" BOOLEAN,
"duration_requirements_met" BOOLEAN,
"status" TEXT NOT NULL DEFAULT 'Initial',
"incomplete_reminder_sent_at" TIMESTAMP,
"recognition_likelihood" TEXT,
"professional_recognition_status" TEXT,
"nationality" TEXT,
"languages_spoken" ARRAY,
"status_changed_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"lifecycle_notifications" JSON NOT NULL DEFAULT '{}',
"analysis_last_run_at" TIMESTAMP,
"analysis_input_fingerprint" TEXT,
"invalidated_at" TIMESTAMP,
"reupload_requested_at" TIMESTAMP,
"reuploaded_at" TIMESTAMP,
"failed_purged_at" TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "candidate_document" (
"document_id" TEXT PRIMARY KEY,
"candidate_id" TEXT NOT NULL REFERENCES "candidate"("candidate_id") ON DELETE CASCADE,
"category" TEXT NOT NULL,
"title" TEXT,
"note" TEXT,
"file_path" TEXT NOT NULL,
"file_name" TEXT NOT NULL,
"file_size" INTEGER,
"mime_type" TEXT,
"uploaded" BOOLEAN DEFAULT 0,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"ocr_text" TEXT,
"ocr_model" TEXT,
"ocr_started_at" TIMESTAMP,
"ocr_ended_at" TIMESTAMP,
"document_status" TEXT NOT NULL DEFAULT 'Unverified'
);
CREATE TABLE IF NOT EXISTS "candidate_education" (
"education_id" TEXT PRIMARY KEY,
"candidate_id" TEXT NOT NULL UNIQUE REFERENCES "candidate"("candidate_id") ON DELETE CASCADE,
"institution" TEXT,
"country" TEXT,
"program" TEXT,
"completion_date" DATE,
"ai_institution" TEXT,
"ai_country" TEXT,
"ai_program" TEXT,
"ai_completion_date" DATE,
"ai_extracted_by" TEXT,
"ai_extraction_date" TIMESTAMP,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"nursing_related_degree" BOOLEAN,
"accredited_university" BOOLEAN,
"accredited_study_program" BOOLEAN,
"ai_nursing_related_degree" BOOLEAN,
"ai_accredited_university" BOOLEAN,
"ai_accredited_study_program" BOOLEAN,
"has_theory" BOOLEAN,
"has_practice" BOOLEAN,
"duration_hours" INTEGER,
"is_nursing_focus" BOOLEAN,
"ai_has_theory" BOOLEAN,
"ai_has_practice" BOOLEAN,
"ai_duration_hours" INTEGER,
"ai_is_nursing_focus" BOOLEAN
);
CREATE TABLE IF NOT EXISTS "candidate_license" (
"license_id" TEXT PRIMARY KEY,
"candidate_id" TEXT NOT NULL UNIQUE REFERENCES "candidate"("candidate_id") ON DELETE CASCADE,
"license_number" TEXT,
"issuing_authority" TEXT,
"issue_date" DATE,
"expiry_date" DATE,
"status" TEXT,
"license_type" TEXT,
"ai_license_number" TEXT,
"ai_issuing_authority" TEXT,
"ai_issue_date" DATE,
"ai_expiry_date" DATE,
"ai_status" TEXT,
"ai_license_type" TEXT,
"ai_extracted_by" TEXT,
"ai_extraction_date" TIMESTAMP,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "candidate_language" (
"language_id" TEXT PRIMARY KEY,
"candidate_id" TEXT NOT NULL UNIQUE REFERENCES "candidate"("candidate_id") ON DELETE CASCADE,
"level" TEXT,
"issuing_body" TEXT,
"issue_date" DATE,
"certified_skills" ARRAY,
"ai_level" TEXT,
"ai_issuing_body" TEXT,
"ai_issue_date" DATE,
"ai_certified_skills" ARRAY,
"ai_extracted_by" TEXT,
"ai_extraction_date" TIMESTAMP,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "candidate_experience" (
"experience_id" TEXT PRIMARY KEY,
"candidate_id" TEXT NOT NULL UNIQUE REFERENCES "candidate"("candidate_id") ON DELETE CASCADE,
"employer_name" TEXT,
"role_title" TEXT,
"department" TEXT,
"start_date" DATE,
"end_date" DATE,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"country" TEXT,
"city" TEXT,
"facility_type" TEXT
);
CREATE TABLE IF NOT EXISTS "leads" (
"lead_id" TEXT PRIMARY KEY,
"first_name" TEXT NOT NULL,
"last_name" TEXT NOT NULL,
"email" TEXT NOT NULL,
"phone" TEXT,
"facility_name" TEXT NOT NULL,
"facility_type" TEXT NOT NULL,
"nurses_needed_range" TEXT,
"message" TEXT,
"source" TEXT NOT NULL DEFAULT 'pilot',
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "country" (
"country_id" TEXT PRIMARY KEY,
"iso_code" TEXT NOT NULL,
"name_english" TEXT NOT NULL,
"name_official" TEXT,
"name_short" TEXT,
"publicated" BOOLEAN NOT NULL,
"hidden" BOOLEAN,
"country_group" TEXT NOT NULL,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "location" (
"location_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"country_id" TEXT NOT NULL REFERENCES "country"("country_id") ON DELETE CASCADE,
"origin_name" TEXT NOT NULL,
"name_short" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "institution_type" (
"institution_type_id" TEXT PRIMARY KEY,
"name_short" TEXT,
"status" TEXT,
"comment" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "institution" (
"institution_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"country_id" TEXT NOT NULL REFERENCES "country"("country_id") ON DELETE CASCADE,
"location_id" TEXT REFERENCES "location"("location_id") ON DELETE SET NULL,
"institution_type_id" TEXT NOT NULL REFERENCES "institution_type"("institution_type_id") ON DELETE CASCADE,
"name_short" TEXT,
"abbreviation" TEXT,
"homepage" TEXT,
"name_german" TEXT,
"address_street" TEXT,
"address_zip" TEXT,
"address_city" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "degree_type" (
"degree_type_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"country_id" TEXT NOT NULL REFERENCES "country"("country_id") ON DELETE CASCADE,
"name_short" TEXT,
"name_german" TEXT,
"name_female" TEXT,
"name_female_german" TEXT,
"comment" TEXT,
"hide_requirement" BOOLEAN,
"requirement" TEXT,
"additional_requirement" TEXT,
"hide_studies" BOOLEAN,
"studies_min_length" REAL,
"studies_max_length" REAL,
"explanation_studies_length" TEXT,
"studies_description" TEXT,
"abbreviation" TEXT,
"abbreviation_female" TEXT,
"degree_class" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "degree_type_equivalence" (
"degree_type_equivalence_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"degree_type_id" TEXT NOT NULL REFERENCES "degree_type"("degree_type_id") ON DELETE CASCADE,
"hidden" BOOLEAN,
"equivalence_class" TEXT NOT NULL,
"comment" TEXT,
"admin_comment" TEXT,
"internal_comment" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "degree_field_of_study" (
"degree_field_of_study_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"country_id" TEXT NOT NULL REFERENCES "country"("country_id") ON DELETE CASCADE,
"name_short" TEXT,
"name_german" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "degree" (
"degree_id" TEXT PRIMARY KEY,
"id_original" TEXT NOT NULL,
"country_id" TEXT NOT NULL REFERENCES "country"("country_id") ON DELETE CASCADE,
"degree_type_id" TEXT REFERENCES "degree_type"("degree_type_id") ON DELETE SET NULL,
"field_of_study_id" TEXT REFERENCES "degree_field_of_study"("degree_field_of_study_id") ON DELETE SET NULL,
"degree_short" TEXT,
"name_short" TEXT,
"name_german" TEXT,
"name_female" TEXT,
"name_female_german" TEXT,
"comment" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "alias_name" (
"alias_name_id" TEXT PRIMARY KEY,
"type" TEXT NOT NULL,
"id_original" TEXT NOT NULL,
"name_short" TEXT,
"name_german" TEXT,
"comment" TEXT,
"hidden" BOOLEAN,
"deleted" BOOLEAN,
"language_id" TEXT,
"name_translated" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS "institution_degree" (
"institution_id" TEXT NOT NULL REFERENCES "institution"("institution_id") ON DELETE CASCADE,
"degree_id" TEXT NOT NULL REFERENCES "degree"("degree_id") ON DELETE CASCADE,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("institution_id", "degree_id")
);
CREATE TABLE IF NOT EXISTS "degree_equivalence" (
"degree_id" TEXT NOT NULL REFERENCES "degree"("degree_id") ON DELETE CASCADE,
"equivalence_id" TEXT NOT NULL REFERENCES "degree_type_equivalence"("degree_type_equivalence_id") ON DELETE CASCADE,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("degree_id", "equivalence_id")
);
CREATE TABLE IF NOT EXISTS "degree_type_equivalence_link" (
"degree_type_id" TEXT NOT NULL REFERENCES "degree_type"("degree_type_id") ON DELETE CASCADE,
"equivalence_id" TEXT NOT NULL REFERENCES "degree_type_equivalence"("degree_type_equivalence_id") ON DELETE CASCADE,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("degree_type_id", "equivalence_id")
);
CREATE TABLE IF NOT EXISTS "entity_name_link" (
"entity_type" TEXT NOT NULL,
"entity_id" TEXT NOT NULL,
"name_id" TEXT NOT NULL REFERENCES "alias_name"("alias_name_id") ON DELETE CASCADE,
"name_type" TEXT NOT NULL,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"last_updated_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("entity_type", "entity_id", "name_id")
);
CREATE INDEX IF NOT EXISTS "idx_auth_session_user_id" ON "auth_session" ("user_id");
CREATE INDEX IF NOT EXISTS "idx_auth_account_user_id" ON "auth_account" ("user_id");
CREATE INDEX IF NOT EXISTS "idx_auth_verification_identifier" ON "auth_verification" ("identifier");
CREATE INDEX IF NOT EXISTS "idx_candidate_status_changed_at" ON "candidate" ("status", "status_changed_at");
CREATE INDEX IF NOT EXISTS "idx_candidate_reupload_flags" ON "candidate" ("invalidated_at", "reuploaded_at");
CREATE INDEX IF NOT EXISTS "idx_candidate_document_candidate_id" ON "candidate_document" ("candidate_id");
CREATE UNIQUE INDEX IF NOT EXISTS "idx_candidate_document_profile_image_unique"
ON "candidate_document" ("candidate_id")
WHERE "category" = 'profile_image';
CREATE VIEW IF NOT EXISTS "institution_search" AS
SELECT
i.institution_id,
i.name_short AS main_name_short,
i.name_german AS main_name_german,
a.name_short AS alias_name_short,
a.name_german AS alias_name_german,
enl.name_type AS alias_type
FROM "institution" i
LEFT JOIN "entity_name_link" enl
ON enl.entity_type = 'institution'
AND enl.entity_id = i.institution_id
LEFT JOIN "alias_name" a
ON a.alias_name_id = enl.name_id;
CREATE VIEW IF NOT EXISTS "degree_search" AS
SELECT
d.degree_id,
d.name_short AS main_name_short,
d.name_german AS main_name_german,
a.name_short AS alias_name_short,
a.name_german AS alias_name_german,
enl.name_type AS alias_type
FROM "degree" d
LEFT JOIN "entity_name_link" enl
ON enl.entity_type = 'degree'
AND enl.entity_id = d.degree_id
LEFT JOIN "alias_name" a
ON a.alias_name_id = enl.name_id;