krona-staff/migrations/0009_professions.up.sql

32 lines
1.5 KiB
SQL

CREATE TABLE staff_professions (
id VARCHAR(26) PRIMARY KEY CHECK (id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'),
tenant_id VARCHAR(26) NOT NULL CHECK (tenant_id ~ '^[0-9A-HJKMNP-TV-Z]{26}$'),
code VARCHAR(80) NOT NULL,
name VARCHAR(160) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'archived')),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (tenant_id, id),
UNIQUE (tenant_id, code),
UNIQUE (tenant_id, name)
);
ALTER TABLE staff_professions ENABLE ROW LEVEL SECURITY;
ALTER TABLE staff_professions FORCE ROW LEVEL SECURITY;
CREATE POLICY staff_professions_tenant_isolation ON staff_professions
USING (tenant_id = current_setting('app.tenant_id', true))
WITH CHECK (tenant_id = current_setting('app.tenant_id', true));
ALTER TABLE staff_employees ADD COLUMN profession_id VARCHAR(26);
ALTER TABLE staff_employees ADD CONSTRAINT staff_employees_profession_fk
FOREIGN KEY (tenant_id, profession_id) REFERENCES staff_professions (tenant_id, id);
CREATE INDEX staff_employees_profession_idx ON staff_employees (tenant_id, profession_id);
CREATE UNIQUE INDEX staff_employees_external_ref_idx
ON staff_employees (tenant_id, external_ref) WHERE external_ref IS NOT NULL;
CREATE UNIQUE INDEX staff_pay_assignments_effective_version_idx
ON staff_pay_assignments
(tenant_id, employee_id, COALESCE(org_unit_id, ''), effective_from);
GRANT SELECT, INSERT, UPDATE, DELETE ON staff_professions TO krona_staff_app;