Final slice of Phase 3 (stacked on 3b pipeline). The onboarding transaction that turns a SELECTED candidate into active crew, per Crewing-Implementation-Spec §8.5/§9/§11. Behind NEXT_PUBLIC_CREWING_ENABLED; production unchanged. What's in - Schema (crewing_onboarding migration): CrewAssignment + AssignmentStatus (ACTIVE/ON_LEAVE/SIGNED_OFF — leave/sign-off are Phase 4); ContractLetter (salaryRestricted); SalaryStructure += assignmentId; CrewActionType += CREW_ONBOARDED. Employee numbers CRW-xxxx via lib/employee-number.ts. - Action (onboardCandidate, onboard_crew): one transaction off a SELECTED application — assign employeeId, create CrewAssignment(ACTIVE, signOnDate), bind the approved SalaryStructure (assignmentId + effectiveFrom), Application → ONBOARDED, Requisition → FILLED, CrewMember → EMPLOYEE (+ currentRank); contract letter stored after. Guards flag + permission + SELECTED state. - Screen: the SELECTED action card's "Onboard to crew" modal (joining date, contract upload, starts-automatically chips); the CRW- number shows on the ONBOARDED card. Tests & docs - Integration: onboarding.test.ts (5) — full transaction, requisition FILLED + salary binding, joining-date + SELECTED-only guards, permission gating, sequential CRW- ids. type-check clean; full unit (234) + integration (168) green. - CLAUDE.md updated with the Phase 3c surface. Deferred: SITE_STAFF login creation for management ranks (grantsLogin) — a follow-up; attendance/experience/PPE records begin in Phase 4. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63 lines
2.5 KiB
SQL
63 lines
2.5 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "AssignmentStatus" AS ENUM ('ACTIVE', 'ON_LEAVE', 'SIGNED_OFF');
|
|
|
|
-- AlterEnum
|
|
ALTER TYPE "CrewActionType" ADD VALUE 'CREW_ONBOARDED';
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "SalaryStructure" ADD COLUMN "assignmentId" TEXT;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CrewAssignment" (
|
|
"id" TEXT NOT NULL,
|
|
"status" "AssignmentStatus" NOT NULL DEFAULT 'ACTIVE',
|
|
"signOnDate" TIMESTAMP(3) NOT NULL,
|
|
"signOffDate" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"crewMemberId" TEXT NOT NULL,
|
|
"rankId" TEXT NOT NULL,
|
|
"vesselId" TEXT,
|
|
"siteId" TEXT,
|
|
"requisitionId" TEXT,
|
|
|
|
CONSTRAINT "CrewAssignment_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContractLetter" (
|
|
"id" TEXT NOT NULL,
|
|
"assignmentId" TEXT NOT NULL,
|
|
"fileKey" TEXT NOT NULL,
|
|
"salaryRestricted" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ContractLetter_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "CrewAssignment_requisitionId_key" ON "CrewAssignment"("requisitionId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ContractLetter_assignmentId_key" ON "ContractLetter"("assignmentId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SalaryStructure" ADD CONSTRAINT "SalaryStructure_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "CrewAssignment"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CrewAssignment" ADD CONSTRAINT "CrewAssignment_crewMemberId_fkey" FOREIGN KEY ("crewMemberId") REFERENCES "CrewMember"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CrewAssignment" ADD CONSTRAINT "CrewAssignment_rankId_fkey" FOREIGN KEY ("rankId") REFERENCES "Rank"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CrewAssignment" ADD CONSTRAINT "CrewAssignment_vesselId_fkey" FOREIGN KEY ("vesselId") REFERENCES "Vessel"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CrewAssignment" ADD CONSTRAINT "CrewAssignment_siteId_fkey" FOREIGN KEY ("siteId") REFERENCES "Site"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CrewAssignment" ADD CONSTRAINT "CrewAssignment_requisitionId_fkey" FOREIGN KEY ("requisitionId") REFERENCES "Requisition"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContractLetter" ADD CONSTRAINT "ContractLetter_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "CrewAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|