Specs stay at repo root (cross-VM). Move deploy and code into logical projects with README per domain, updated manifest.yaml, and symlinks at legacy paths for VM122 backward compatibility.
44 lines
1.2 KiB
Python
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
|