Files

83 lines
3.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from functools import lru_cache
from pathlib import Path
from typing import Any
import yaml
ROOT = Path(__file__).resolve().parents[3]
PROFILE_ROOT = ROOT / "config" / "company_profiles"
@dataclass(frozen=True)
class CompanyWorkflowProfile:
company: str
name: str
version: str
defaults: dict[str, Any] = field(default_factory=dict)
documents: dict[str, Any] = field(default_factory=dict)
payment_terms: dict[str, str] = field(default_factory=dict)
delivery_terms: dict[str, str] = field(default_factory=dict)
commercial_stages: list[dict[str, str]] = field(default_factory=list)
actions: dict[str, Any] = field(default_factory=dict)
followups: dict[str, Any] = field(default_factory=dict)
ui: dict[str, Any] = field(default_factory=dict)
email_intents: dict[str, Any] = field(default_factory=dict)
def action_label(self, code: str, fallback: str | None = None) -> str:
raw = self.actions.get(str(code or ""), {})
if isinstance(raw, dict) and raw.get("label"):
return str(raw["label"])
return fallback or str(code or "Acompanhar")
def action_description(self, code: str, fallback: str = "") -> str:
raw = self.actions.get(str(code or ""), {})
if isinstance(raw, dict) and raw.get("description"):
return str(raw["description"])
return fallback
def _read_yaml(path: Path) -> dict[str, Any]:
if not path.exists():
return {}
data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
return data if isinstance(data, dict) else {}
@lru_cache(maxsize=16)
def load_company_profile(company: str = "blif") -> CompanyWorkflowProfile:
"""Load a workflow profile from config/company_profiles.
Missing optional files are allowed so a new company can start with only a
workflow.yaml and inherit conservative defaults.
"""
key = str(company or "blif").strip().lower() or "blif"
profile_dir = PROFILE_ROOT / key
if not profile_dir.exists():
profile_dir = PROFILE_ROOT / "default"
key = "default"
workflow = _read_yaml(profile_dir / "workflow.yaml")
labels = _read_yaml(profile_dir / "labels.yaml")
ui = _read_yaml(profile_dir / "ui.yaml")
email_intents = _read_yaml(profile_dir / "email_intents.yaml")
return CompanyWorkflowProfile(
company=str(workflow.get("company") or key),
name=str(workflow.get("profile_name") or labels.get("profile_name") or key.upper()),
version=str(workflow.get("version") or "workflow-profile-v1"),
defaults=dict(workflow.get("defaults") or {}),
documents=dict(workflow.get("documents") or {}),
payment_terms=dict(workflow.get("payment_terms") or {}),
delivery_terms=dict(workflow.get("delivery_terms") or {}),
commercial_stages=list(workflow.get("commercial_stages") or []),
actions=dict(labels.get("actions") or workflow.get("actions") or {}),
followups=dict(workflow.get("followups") or {}),
ui=dict(ui or workflow.get("ui") or {}),
email_intents=dict(email_intents.get("email_intents") or email_intents or {}),
)