system-prompts-and-models-o.../dealix/auto_client_acquisition/platform_services/unified_inbox.py
Sami Assiri b13cb389cc feat(dealix): sync full Dealix package to repo
- API routers, ACA modules, integrations (draft operators)
- Docs, landing pages, scripts (launch readiness, scorecard)
- Tests and CI workflow updates for Dealix

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-01 21:01:17 +03:00

190 lines
9.1 KiB
Python

"""Event → Arabic inbox card (≤3 actions)."""
from __future__ import annotations
from typing import Any
from auto_client_acquisition.innovation.command_feed import build_demo_command_feed
from auto_client_acquisition.platform_services.event_bus import EventType
def _trim_actions(actions: list[dict[str, str]], max_n: int = 3) -> list[dict[str, str]]:
return actions[:max_n]
def event_to_inbox_card(event: dict[str, Any], *, merge_demo_hint: bool = False) -> dict[str, Any]:
"""Build ``title_ar``, ``summary_ar``, and up to three action buttons."""
et_raw = event.get("event_type")
try:
et = EventType(str(et_raw))
except (ValueError, TypeError):
return {
"title_ar": "حدث غير صالح",
"summary_ar": "تعذر بناء البطاقة — نوع الحدث غير معروف.",
"actions": _trim_actions([{"action_id": "dismiss", "label_ar": "إغلاق"}]),
}
actions: list[dict[str, str]] = []
title_ar = ""
summary_ar = ""
if et == EventType.LEAD_RECEIVED:
src = str(event.get("source") or "")
name = str(event.get("lead_name") or "جهة جديدة")
title_ar = "عميل محتمل جديد"
summary_ar = f"مصدر: {src}. الاسم: {name}."
actions = [
{"action_id": "qualify", "label_ar": "تأهيل سريع"},
{"action_id": "assign_owner", "label_ar": "تعيين مالك"},
{"action_id": "archive", "label_ar": "أرشفة"},
]
elif et == EventType.EXTERNAL_SEND_REQUESTED:
title_ar = "طلب إرسال خارجي"
summary_ar = f"القناة: {event.get('channel_id')}. الإجراء: {event.get('action')}."
actions = [
{"action_id": "approve_send", "label_ar": "موافقة مشروطة"},
{"action_id": "edit_draft", "label_ar": "تعديل المسودة"},
{"action_id": "reject", "label_ar": "رفض"},
]
elif et == EventType.PAYMENT_INTENT:
title_ar = "نية دفع"
summary_ar = f"المبلغ (هللات): {event.get('amount_halalas')} {event.get('currency', 'SAR')}."
actions = [
{"action_id": "confirm_payment", "label_ar": "تأكيد المشغّل"},
{"action_id": "adjust_amount", "label_ar": "تعديل المبلغ"},
{"action_id": "cancel", "label_ar": "إلغاء"},
]
elif et == EventType.WHATSAPP_MESSAGE_REQUESTED:
title_ar = "طلب رسالة واتساب"
summary_ar = f"النية: {event.get('intent')} — الجمهور: {event.get('audience')}."
actions = [
{"action_id": "preview_template", "label_ar": "معاينة القالب"},
{"action_id": "require_optin_proof", "label_ar": "طلب إثبات opt-in"},
{"action_id": "block", "label_ar": "إيقاف"},
]
elif et == EventType.REVIEW_REQUIRED:
title_ar = "مراجعة يدوية"
summary_ar = f"السبب: {event.get('reason_code')}."
actions = [
{"action_id": "open_queue", "label_ar": "فتح الطابور"},
{"action_id": "assign", "label_ar": "إسناد"},
{"action_id": "snooze", "label_ar": "تأجيل"},
]
elif et == EventType.EMAIL_RECEIVED:
title_ar = "إيميل شركة جديد"
summary_ar = f"الموضوع: {event.get('subject_ar')} — القناة: {event.get('channel_id')}."
actions = [
{"action_id": "gmail_draft_reply", "label_ar": "جهّز مسودة رد"},
{"action_id": "classify_lead", "label_ar": "صنّف كفرصة"},
{"action_id": "snooze_email", "label_ar": "تأجيل"},
]
elif et == EventType.CALENDAR_MEETING_SCHEDULED:
title_ar = "اجتماع في التقويم"
summary_ar = f"{event.get('title_ar')}{event.get('channel_id')}."
actions = [
{"action_id": "meeting_prep", "label_ar": "تحضير"},
{"action_id": "calendar_draft", "label_ar": "مسودة تعديل"},
{"action_id": "ignore_meeting", "label_ar": "تخطي"},
]
elif et == EventType.SOCIAL_COMMENT_RECEIVED:
title_ar = "تعليق على منشور"
summary_ar = str(event.get("snippet_ar") or "")[:200]
actions = [
{"action_id": "draft_reply", "label_ar": "رد مسودة"},
{"action_id": "escalate", "label_ar": "تصعيد"},
{"action_id": "dismiss_social", "label_ar": "تجاهل"},
]
elif et == EventType.SOCIAL_DM_RECEIVED:
title_ar = "رسالة خاصة (سوشيال)"
summary_ar = f"من: {event.get('sender_hint')}{event.get('channel_id')}."
actions = [
{"action_id": "policy_check", "label_ar": "فحص سياسة"},
{"action_id": "draft_dm", "label_ar": "مسودة رد"},
{"action_id": "block_channel", "label_ar": "إيقاف القناة"},
]
elif et == EventType.LEAD_FORM_SUBMITTED:
title_ar = "نموذج ليد جديد"
summary_ar = f"مصدر: {event.get('source')} — قناة: {event.get('channel_id')}."
actions = [
{"action_id": "qualify", "label_ar": "تأهيل"},
{"action_id": "import_crm", "label_ar": "مسودة CRM"},
{"action_id": "archive", "label_ar": "أرشفة"},
]
elif et == EventType.PAYMENT_PAID:
title_ar = "دفعة مؤكدة"
summary_ar = f"المبلغ (هللات): {event.get('amount_halalas')} {event.get('currency', 'SAR')}."
actions = [
{"action_id": "proof_ledger", "label_ar": "سجّل في Proof"},
{"action_id": "thank_you_draft", "label_ar": "شكر مسودة"},
{"action_id": "upsell_draft", "label_ar": "عرض ترقية"},
]
elif et == EventType.PAYMENT_FAILED:
title_ar = "دفعة فاشلة"
summary_ar = f"السبب: {event.get('reason_code')} — المبلغ: {event.get('amount_halalas')}."
actions = [
{"action_id": "retry_draft", "label_ar": "مسودة متابعة"},
{"action_id": "support_ticket", "label_ar": "تذكرة دعم"},
{"action_id": "close_payment", "label_ar": "إغلاق"},
]
elif et == EventType.REVIEW_CREATED:
title_ar = "تقييم جديد (سمعة محلية)"
summary_ar = f"التقييم: {event.get('rating')}{event.get('channel_id')}."
actions = [
{"action_id": "draft_review_reply", "label_ar": "رد مسودة"},
{"action_id": "escalate_mgr", "label_ar": "تصعيد مدير"},
{"action_id": "monitor", "label_ar": "مراقبة"},
]
elif et == EventType.PARTNER_SUGGESTED:
title_ar = "اقتراح شريك"
summary_ar = f"{event.get('partner_name_ar')} — قطاع {event.get('sector')}."
actions = [
{"action_id": "partner_draft", "label_ar": "رسالة شريك"},
{"action_id": "schedule_call", "label_ar": "مسودة اجتماع"},
{"action_id": "skip_partner", "label_ar": "تخطي"},
]
elif et == EventType.ACTION_APPROVED:
title_ar = "تمت الموافقة على إجراء"
summary_ar = f"{event.get('action_id')} — بواسطة {event.get('actor')}."
actions = [
{"action_id": "view_ledger", "label_ar": "عرض السجل"},
{"action_id": "notify_team", "label_ar": "إشعار داخلي"},
{"action_id": "done", "label_ar": "تم"},
]
elif et == EventType.ACTION_BLOCKED:
title_ar = "إجراء ممنوع"
summary_ar = f"{event.get('action_id')}{event.get('reason_code')}."
actions = [
{"action_id": "edit_policy", "label_ar": "مراجعة سياسة"},
{"action_id": "appeal", "label_ar": "طلب استثناء"},
{"action_id": "dismiss", "label_ar": "إغلاق"},
]
elif et == EventType.DRAFT_CREATED:
title_ar = "مسودة جاهزة"
summary_ar = f"النوع: {event.get('draft_kind')}."
actions = [
{"action_id": "open_draft", "label_ar": "فتح المسودة"},
{"action_id": "share", "label_ar": "مشاركة داخلية"},
{"action_id": "discard", "label_ar": "تجاهل"},
]
else:
title_ar = "حدث داخلي"
summary_ar = "نوع مسجّل لكن بدون قالب عرض — راجع الإعدادات."
actions = [
{"action_id": "dismiss", "label_ar": "إغلاق"},
{"action_id": "log", "label_ar": "تسجيل"},
{"action_id": "help", "label_ar": "مساعدة"},
]
card: dict[str, Any] = {
"title_ar": title_ar,
"summary_ar": summary_ar,
"actions": _trim_actions(actions),
"event_type": et.value,
}
if merge_demo_hint:
demo = build_demo_command_feed()
cards = demo.get("cards") if isinstance(demo.get("cards"), list) else []
if cards and isinstance(cards[0], dict):
card["demo_hint_ar"] = str(cards[0].get("title_ar") or "")
return card