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.
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
|