71 lines
2.3 KiB
Python
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
|