ligbox-ops-platform/projects/ops-desk/api/app/vm123/provision.py
Ligbox Spec Hub 3ee63b3018 Add full stack health cards for VMs 112-130 and rename INFRA COD.
New /api/v1/infra/stack/status probes all stack apps/APIs/SW; Infra UI groups proc-cards by VM; wire vm123 router; menu INFRA COD and Serviços IaaS · Infra as Code labels.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-19 22:41:53 +00:00

71 lines
2.3 KiB
Python

"""Provisionamento staff VM123 ao activar utilizador Desk."""
from __future__ import annotations
import logging
from typing import Any
from app.vm123 import foss_client, odoo_client, openpanel_client, provision_store
from app.vm123.role_map import PROVISIONABLE_DESK_ROLES
log = logging.getLogger(__name__)
def provision_desk_user(
conn,
*,
desk_username: str,
desk_role: str,
display_name: str,
email: str,
) -> dict[str, Any]:
"""Tenta FOSS + Odoo; regista resultado (mesmo parcial) em vm123_identity_map."""
if desk_role not in PROVISIONABLE_DESK_ROLES:
return {"skipped": True, "reason": f"role {desk_role} sem provisionamento automático"}
result: dict[str, Any] = {"desk_username": desk_username, "desk_role": desk_role, "steps": {}}
try:
result["steps"]["foss"] = foss_client.create_staff(
email=email, name=display_name or email, desk_role=desk_role
)
except Exception as exc:
log.warning("FOSS provision failed for %s: %s", email, exc)
result["steps"]["foss"] = {"error": str(exc)}
try:
result["steps"]["odoo"] = odoo_client.upsert_internal_user(
email=email, name=display_name or email, desk_role=desk_role
)
except Exception as exc:
log.warning("Odoo provision failed for %s: %s", email, exc)
result["steps"]["odoo"] = {"error": str(exc)}
if desk_role in ("sales_admin", "sales_support", "content_editor", "seo", "marketing"):
result["steps"]["openpanel"] = {
"note": "OpenPanel staff não provisionado no MVP — autologin cliente via bridge Fase 3+",
"bridge": openpanel_client.bridge_configured(),
}
foss_id = None
foss_step = result["steps"].get("foss") or {}
if foss_step.get("foss_staff_id"):
foss_id = str(foss_step["foss_staff_id"])
odoo_uid = None
odoo_step = result["steps"].get("odoo") or {}
if odoo_step.get("odoo_uid"):
odoo_uid = int(odoo_step["odoo_uid"])
provision_store.upsert_map(
conn,
desk_username=desk_username,
desk_role=desk_role,
foss_staff_id=foss_id,
odoo_uid=odoo_uid,
provision=result,
)
result["ok"] = not any(
isinstance(step, dict) and step.get("error") for step in result["steps"].values()
)
return result