306 lines
12 KiB
PHP
306 lines
12 KiB
PHP
<?php
|
|
|
|
use Illuminate\Database\Migrations\Migration;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
return new class extends Migration
|
|
{
|
|
// Laravel's migration ledger provides idempotency; object drift fails explicitly.
|
|
public function up(): void
|
|
{
|
|
if (DB::connection()->getDriverName() !== 'pgsql') {
|
|
throw new RuntimeException('InvestMoz requires PostgreSQL with PostGIS. Use the isolated pgsql test environment.');
|
|
}
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.skills (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
code text NOT NULL,
|
|
name text NOT NULL,
|
|
CONSTRAINT imz_skills_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_skills_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_skills_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted'))
|
|
);
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.occupations (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
code text NOT NULL,
|
|
name text NOT NULL,
|
|
CONSTRAINT imz_occupations_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_occupations_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_occupations_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted'))
|
|
);
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.training_needs (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
project_id uuid CONSTRAINT imz_training_needs_project_id_fk REFERENCES public.projects(id) ON DELETE SET NULL ON UPDATE CASCADE,
|
|
occupation_id uuid CONSTRAINT imz_training_needs_occupation_id_fk REFERENCES public.occupations(id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
|
skill_id uuid CONSTRAINT imz_training_needs_skill_id_fk REFERENCES public.skills(id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
|
quantity integer NOT NULL,
|
|
priority text NOT NULL,
|
|
CONSTRAINT imz_training_needs_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_training_needs_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_training_needs_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted')),
|
|
CONSTRAINT imz_training_needs_check_03 CHECK (quantity>0),
|
|
CONSTRAINT imz_training_needs_check_04 CHECK (priority IN ('Must','Should','Could'))
|
|
);
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.training_providers (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
organization_id uuid CONSTRAINT imz_training_providers_organization_id_fk REFERENCES public.organizations(id) ON DELETE SET NULL ON UPDATE CASCADE,
|
|
name text NOT NULL,
|
|
status text NOT NULL,
|
|
CONSTRAINT imz_training_providers_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_training_providers_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_training_providers_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted')),
|
|
CONSTRAINT imz_training_providers_check_03 CHECK (status IN ('candidate','approved','inactive'))
|
|
);
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.courses (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
provider_id uuid NOT NULL CONSTRAINT imz_courses_provider_id_fk REFERENCES public.training_providers(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
|
code text NOT NULL,
|
|
title text NOT NULL,
|
|
status text NOT NULL,
|
|
CONSTRAINT imz_courses_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_courses_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_courses_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted')),
|
|
CONSTRAINT imz_courses_check_03 CHECK (status IN ('draft','published','retired'))
|
|
);
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
CREATE TABLE public.education_opportunities (
|
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
|
source_system text NOT NULL DEFAULT 'investmoz',
|
|
external_id text,
|
|
version_no integer NOT NULL DEFAULT 1,
|
|
data_classification text NOT NULL DEFAULT 'internal',
|
|
correlation_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
deleted_at timestamptz,
|
|
course_id uuid NOT NULL CONSTRAINT imz_education_opportunities_course_id_fk REFERENCES public.courses(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
|
geo_location_id uuid CONSTRAINT imz_education_opportunities_geo_location_id_fk REFERENCES public.geo_locations(id) ON DELETE SET NULL ON UPDATE CASCADE,
|
|
start_date date NOT NULL,
|
|
end_date date,
|
|
capacity integer,
|
|
status text NOT NULL,
|
|
CONSTRAINT imz_education_opportunities_pk PRIMARY KEY (id),
|
|
CONSTRAINT imz_education_opportunities_check_01 CHECK (version_no > 0),
|
|
CONSTRAINT imz_education_opportunities_check_02 CHECK (data_classification IN ('public','internal','confidential','restricted')),
|
|
CONSTRAINT imz_education_opportunities_check_03 CHECK (capacity>=0),
|
|
CONSTRAINT imz_education_opportunities_check_04 CHECK (status IN ('planned','open','closed','cancelled')),
|
|
CONSTRAINT imz_education_opportunities_check_05 CHECK (end_date IS NULL OR end_date>=start_date)
|
|
);
|
|
SQL);
|
|
}
|
|
|
|
public function down(): void
|
|
{
|
|
if (DB::connection()->getDriverName() !== 'pgsql') {
|
|
throw new RuntimeException('InvestMoz rollback requires PostgreSQL.');
|
|
}
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_course_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_geo_location_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_check_03 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_check_04 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.education_opportunities DROP CONSTRAINT IF EXISTS imz_education_opportunities_check_05 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.education_opportunities RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.courses DROP CONSTRAINT IF EXISTS imz_courses_provider_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.courses DROP CONSTRAINT IF EXISTS imz_courses_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.courses DROP CONSTRAINT IF EXISTS imz_courses_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.courses DROP CONSTRAINT IF EXISTS imz_courses_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.courses DROP CONSTRAINT IF EXISTS imz_courses_check_03 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.courses RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_providers DROP CONSTRAINT IF EXISTS imz_training_providers_organization_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_providers DROP CONSTRAINT IF EXISTS imz_training_providers_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_providers DROP CONSTRAINT IF EXISTS imz_training_providers_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_providers DROP CONSTRAINT IF EXISTS imz_training_providers_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_providers DROP CONSTRAINT IF EXISTS imz_training_providers_check_03 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.training_providers RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_project_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_occupation_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_skill_id_fk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_check_03 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.training_needs DROP CONSTRAINT IF EXISTS imz_training_needs_check_04 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.training_needs RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.occupations DROP CONSTRAINT IF EXISTS imz_occupations_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.occupations DROP CONSTRAINT IF EXISTS imz_occupations_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.occupations DROP CONSTRAINT IF EXISTS imz_occupations_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.occupations RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.skills DROP CONSTRAINT IF EXISTS imz_skills_pk RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.skills DROP CONSTRAINT IF EXISTS imz_skills_check_01 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
ALTER TABLE IF EXISTS public.skills DROP CONSTRAINT IF EXISTS imz_skills_check_02 RESTRICT;
|
|
SQL);
|
|
|
|
DB::statement(<<<'SQL'
|
|
DROP TABLE IF EXISTS public.skills RESTRICT;
|
|
SQL);
|
|
}
|
|
};
|