From 63419a26f1090c71bbd5b6a512c77aed7b52b2f5 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Mon, 2 Feb 2026 14:35:48 +0530 Subject: [PATCH] feat(hr): add employee links + fulfillment fields to schemas/models --- backend/app/models/hr.py | 11 +++++++++++ backend/app/schemas/hr.py | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/backend/app/models/hr.py b/backend/app/models/hr.py index 4f8adc1..54d0193 100644 --- a/backend/app/models/hr.py +++ b/backend/app/models/hr.py @@ -19,6 +19,11 @@ class HeadcountRequest(SQLModel, table=True): justification: str | None = None status: str = Field(default="submitted") + # fulfillment linkage (optional) + fulfilled_employee_id: int | None = Field(default=None, foreign_key="employees.id") + fulfilled_onboarding_id: int | None = Field(default=None, foreign_key="agent_onboardings.id") + fulfilled_at: datetime | None = None + created_at: datetime = Field(default_factory=datetime.utcnow) @@ -32,6 +37,9 @@ class EmploymentAction(SQLModel, table=True): action_type: str # praise|warning|pip|termination notes: str | None = None + # Optional idempotency key to prevent duplicates on retries + idempotency_key: str | None = Field(default=None, index=True, unique=True) + created_at: datetime = Field(default_factory=datetime.utcnow) @@ -46,6 +54,9 @@ class AgentOnboarding(SQLModel, table=True): tools_json: str | None = None owner_hr_id: int | None = Field(default=None, foreign_key="employees.id") + # Link to the employee record once created + employee_id: int | None = Field(default=None, foreign_key="employees.id") + status: str = Field(default="planned") # planned|spawning|spawned|verified|blocked spawned_agent_id: str | None = None session_key: str | None = None diff --git a/backend/app/schemas/hr.py b/backend/app/schemas/hr.py index 691e44f..6b92288 100644 --- a/backend/app/schemas/hr.py +++ b/backend/app/schemas/hr.py @@ -15,6 +15,8 @@ class HeadcountRequestCreate(SQLModel): class HeadcountRequestUpdate(SQLModel): status: str | None = None justification: str | None = None + fulfilled_employee_id: int | None = None + fulfilled_onboarding_id: int | None = None class EmploymentActionCreate(SQLModel): @@ -22,6 +24,7 @@ class EmploymentActionCreate(SQLModel): issued_by_employee_id: int action_type: str notes: str | None = None + idempotency_key: str | None = None class AgentOnboardingCreate(SQLModel): @@ -31,6 +34,7 @@ class AgentOnboardingCreate(SQLModel): cron_interval_ms: int | None = None tools_json: str | None = None owner_hr_id: int | None = None + employee_id: int | None = None status: str = "planned" spawned_agent_id: str | None = None session_key: str | None = None @@ -44,6 +48,7 @@ class AgentOnboardingUpdate(SQLModel): cron_interval_ms: int | None = None tools_json: str | None = None owner_hr_id: int | None = None + employee_id: int | None = None status: str | None = None spawned_agent_id: str | None = None session_key: str | None = None