ligbox-ops-platform/api/app/crm_routes.py
Ligbox Spec Hub 3a2c64834b Initial import: ligbox-ops-platform + specs + LAPTOP + obsidian merge (CT130)
Source: VM122 /opt + obsidian-infra + LAPTOP
Hub: CT130 spec-hub 10.10.10.130
2026-06-19 17:26:41 +00:00

44 lines
1.2 KiB
Python

"""CRM / Leads API — Spec 012."""
from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, Query
from app import auth, crm_leads
from app.permissions import can_read_crm_leads
router = APIRouter(prefix="/api/v1/crm", tags=["crm"])
def _db():
from app.main import db
return db()
@router.get("/leads")
def list_crm_leads(user: auth.DeskUser = Depends(auth.get_current_user)):
if not can_read_crm_leads(user.role):
raise HTTPException(403, "insufficient permissions")
with _db() as conn:
leads = crm_leads.list_leads(conn)
stale_hours = crm_leads.ONBOARD_STALE_HOURS
return {
"leads": leads,
"total": len(leads),
"stale_hours": stale_hours,
}
@router.post("/leads/sync")
def sync_stale_leads(
stale_hours: int | None = Query(default=None, ge=0, le=720),
user: auth.DeskUser = Depends(auth.require_internal_or_user),
):
if user.username != "worker" and not can_read_crm_leads(user.role):
raise HTTPException(403, "insufficient permissions")
with _db() as conn:
result = crm_leads.promote_stale_leads(conn, stale_hours=stale_hours)
total = crm_leads.count_leads(conn)
result["leads_total"] = total
return result