2026-02-01 23:16:56 +05:30
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
|
from sqlmodel import Session, select
|
|
|
|
|
|
2026-02-02 01:36:32 +05:30
|
|
|
from app.api.utils import log_activity, get_actor_employee_id
|
2026-02-01 23:16:56 +05:30
|
|
|
from app.db.session import get_session
|
2026-02-02 01:36:32 +05:30
|
|
|
from app.models.hr import EmploymentAction, HeadcountRequest, AgentOnboarding
|
|
|
|
|
from app.schemas.hr import EmploymentActionCreate, HeadcountRequestCreate, HeadcountRequestUpdate, AgentOnboardingCreate, AgentOnboardingUpdate
|
2026-02-01 23:16:56 +05:30
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/hr", tags=["hr"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/headcount", response_model=list[HeadcountRequest])
|
|
|
|
|
def list_headcount_requests(session: Session = Depends(get_session)):
|
|
|
|
|
return session.exec(select(HeadcountRequest).order_by(HeadcountRequest.id.desc())).all()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/headcount", response_model=HeadcountRequest)
|
2026-02-02 01:36:32 +05:30
|
|
|
def create_headcount_request(payload: HeadcountRequestCreate, session: Session = Depends(get_session), actor_employee_id: int = Depends(get_actor_employee_id)):
|
2026-02-01 23:16:56 +05:30
|
|
|
req = HeadcountRequest(**payload.model_dump())
|
|
|
|
|
session.add(req)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(req)
|
2026-02-02 01:36:32 +05:30
|
|
|
log_activity(session, actor_employee_id=actor_employee_id, entity_type="headcount_request", entity_id=req.id, verb="submitted")
|
2026-02-01 23:16:56 +05:30
|
|
|
session.commit()
|
|
|
|
|
return req
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.patch("/headcount/{request_id}", response_model=HeadcountRequest)
|
2026-02-02 01:36:32 +05:30
|
|
|
def update_headcount_request(request_id: int, payload: HeadcountRequestUpdate, session: Session = Depends(get_session), actor_employee_id: int = Depends(get_actor_employee_id)):
|
2026-02-01 23:16:56 +05:30
|
|
|
req = session.get(HeadcountRequest, request_id)
|
|
|
|
|
if not req:
|
|
|
|
|
raise HTTPException(status_code=404, detail="Request not found")
|
|
|
|
|
|
|
|
|
|
data = payload.model_dump(exclude_unset=True)
|
|
|
|
|
for k, v in data.items():
|
|
|
|
|
setattr(req, k, v)
|
|
|
|
|
|
|
|
|
|
session.add(req)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(req)
|
2026-02-02 01:36:32 +05:30
|
|
|
log_activity(session, actor_employee_id=actor_employee_id, entity_type="headcount_request", entity_id=req.id, verb="updated", payload=data)
|
2026-02-01 23:16:56 +05:30
|
|
|
session.commit()
|
|
|
|
|
return req
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/actions", response_model=list[EmploymentAction])
|
|
|
|
|
def list_employment_actions(session: Session = Depends(get_session)):
|
|
|
|
|
return session.exec(select(EmploymentAction).order_by(EmploymentAction.id.desc())).all()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/actions", response_model=EmploymentAction)
|
2026-02-02 01:36:32 +05:30
|
|
|
def create_employment_action(payload: EmploymentActionCreate, session: Session = Depends(get_session), actor_employee_id: int = Depends(get_actor_employee_id)):
|
2026-02-01 23:16:56 +05:30
|
|
|
action = EmploymentAction(**payload.model_dump())
|
|
|
|
|
session.add(action)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(action)
|
2026-02-02 01:36:32 +05:30
|
|
|
log_activity(session, actor_employee_id=actor_employee_id, entity_type="employment_action", entity_id=action.id, verb=action.action_type, payload={"employee_id": action.employee_id})
|
2026-02-01 23:16:56 +05:30
|
|
|
session.commit()
|
|
|
|
|
return action
|
2026-02-02 01:36:32 +05:30
|
|
|
|
|
|
|
|
@router.get("/onboarding", response_model=list[AgentOnboarding])
|
|
|
|
|
def list_agent_onboarding(session: Session = Depends(get_session)):
|
|
|
|
|
return session.exec(select(AgentOnboarding).order_by(AgentOnboarding.id.desc())).all()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/onboarding", response_model=AgentOnboarding)
|
|
|
|
|
def create_agent_onboarding(payload: AgentOnboardingCreate, session: Session = Depends(get_session), actor_employee_id: int = Depends(get_actor_employee_id)):
|
|
|
|
|
item = AgentOnboarding(**payload.model_dump())
|
|
|
|
|
session.add(item)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(item)
|
|
|
|
|
log_activity(session, actor_employee_id=actor_employee_id, entity_type="agent_onboarding", entity_id=item.id, verb="created", payload={"agent_name": item.agent_name, "status": item.status})
|
|
|
|
|
session.commit()
|
|
|
|
|
return item
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.patch("/onboarding/{onboarding_id}", response_model=AgentOnboarding)
|
|
|
|
|
def update_agent_onboarding(onboarding_id: int, payload: AgentOnboardingUpdate, session: Session = Depends(get_session), actor_employee_id: int = Depends(get_actor_employee_id)):
|
|
|
|
|
item = session.get(AgentOnboarding, onboarding_id)
|
|
|
|
|
if not item:
|
|
|
|
|
raise HTTPException(status_code=404, detail="Onboarding record not found")
|
|
|
|
|
|
|
|
|
|
data = payload.model_dump(exclude_unset=True)
|
|
|
|
|
for k, v in data.items():
|
|
|
|
|
setattr(item, k, v)
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
item.updated_at = datetime.utcnow()
|
|
|
|
|
|
|
|
|
|
session.add(item)
|
|
|
|
|
session.commit()
|
|
|
|
|
session.refresh(item)
|
|
|
|
|
log_activity(session, actor_employee_id=actor_employee_id, entity_type="agent_onboarding", entity_id=item.id, verb="updated", payload=data)
|
|
|
|
|
session.commit()
|
|
|
|
|
return item
|
|
|
|
|
|