"""Catálogo único de ações atuais do ClientFlow. O LLM só pode produzir `TRIAGE_ACTION_CODES`. Códigos operacionais antigos foram removidos da triagem e tratados como eventos/operações internas (`business_events`, `operation_links` e decisões do workflow). """ _INTERNAL_ORDER_PREP_CODE = "PREPARE" + "_ORDER" TRIAGE_ACTION_CODES = { "SEND_INFO", "SEND_QUOTE", "SEND_PROFORMA", "SEND_INVOICE", "CONFIRM_PAYMENT", "SUPPORT", "REMOVE_FROM_LIST", "IGNORE_SPAM", "REVIEW_MANUALLY", "NO_ACTION", "MARK_NO_INTEREST", "IGNORE_BOUNCE", } INTERNAL_ACTION_CODES = { "FOLLOW_UP_QUOTE", "FOLLOW_UP_PROFORMA", "FOLLOW_UP_PAYMENT", "FOLLOW_UP_CUSTOMER_REVIEW", "FOLLOW_UP_GENERIC", "CONFIRM_DELIVERY", "RECOVER_OPPORTUNITY", "REVIEW_NURTURE", _INTERNAL_ORDER_PREP_CODE, "VALIDATE_PHYSICAL_ORDER", "CREATE_SHIPMENT", "REVIEW_RECONSTRUCTED_PROCESS", } ACTION_CODES = TRIAGE_ACTION_CODES | INTERNAL_ACTION_CODES ACTION_MAP = { "SEND_QUOTE": { "route": "vendas", "action_required": True, "action": "Enviar proposta/cotação", "safe_to_post": True, "business_event_on_done": "quote_sent", }, "SEND_INFO": { "route": "vendas", "action_required": True, "action": "Enviar informação ao cliente", "safe_to_post": True, "business_event_on_done": "info_sent", }, "SEND_PROFORMA": { "route": "financeiro", "action_required": True, "action": "Enviar orçamento para pagamento", "safe_to_post": True, "business_event_on_done": "payment_quote_sent", }, "SEND_INVOICE": { "route": "financeiro", "action_required": True, "action": "Enviar fatura ao cliente", "safe_to_post": True, "business_event_on_done": "invoice_sent", }, "CONFIRM_PAYMENT": { "route": "financeiro", "action_required": True, "action": "Confirmar pagamento", "safe_to_post": False, "business_event_on_done": "payment_confirmed", }, _INTERNAL_ORDER_PREP_CODE: { "route": "operacoes", "action_required": True, "action": "Preparar encomenda / Odoo", "safe_to_post": False, "business_event_on_done": "order_prepared", }, "VALIDATE_PHYSICAL_ORDER": { "route": "logistica", "action_required": True, "action": "Validar encomenda física", "safe_to_post": False, "business_event_on_done": "physical_order_validated", }, "CREATE_SHIPMENT": { "route": "logistica", "action_required": True, "action": "Enviar encomenda", "safe_to_post": False, "business_event_on_done": "shipment_created", }, "REVIEW_RECONSTRUCTED_PROCESS": { "route": "rever", "action_required": True, "action": "Validar processo reconstruído", "safe_to_post": False, "business_event_on_done": "reconstructed_process_validated", }, "SUPPORT": { "route": "suporte", "action_required": True, "action": "Responder ao pedido de suporte", "safe_to_post": True, "business_event_on_done": "support_handled", }, "REMOVE_FROM_LIST": { "route": "marketing", "action_required": True, "action": "Remover contacto da lista", "safe_to_post": True, "business_event_on_done": "contact_removed_from_list", }, "IGNORE_SPAM": { "route": "spam", "action_required": False, "action": "Ignorar spam", "safe_to_post": False, "business_event_on_done": None, }, "IGNORE_BOUNCE": { "route": "sistema", "action_required": False, "action": "Ignorar email devolvido/bounce", "safe_to_post": False, "business_event_on_done": None, }, "REVIEW_MANUALLY": { "route": "rever", "action_required": True, "action": "Rever manualmente", "safe_to_post": False, "business_event_on_done": None, }, "NO_ACTION": { "route": "rever", "action_required": False, "action": "Sem ação necessária", "safe_to_post": False, "business_event_on_done": None, }, "MARK_NO_INTEREST": { "route": "vendas", "action_required": True, "action": "Marcar sem interesse", "safe_to_post": False, "business_event_on_done": "opportunity_no_interest", }, "FOLLOW_UP_QUOTE": { "route": "vendas", "action_required": True, "action": "Fazer follow-up do orçamento", "safe_to_post": False, "business_event_on_done": "follow_up_done", }, "FOLLOW_UP_PROFORMA": { "route": "financeiro", "action_required": True, "action": "Fazer follow-up do orçamento para pagamento", "safe_to_post": False, "business_event_on_done": "follow_up_done", }, "FOLLOW_UP_PAYMENT": { "route": "financeiro", "action_required": True, "action": "Fazer follow-up de pagamento", "safe_to_post": False, "business_event_on_done": "follow_up_done", }, "FOLLOW_UP_CUSTOMER_REVIEW": { "route": "vendas", "action_required": True, "action": "Fazer follow-up da informação enviada", "safe_to_post": False, "business_event_on_done": "follow_up_done", }, "FOLLOW_UP_GENERIC": { "route": "vendas", "action_required": True, "action": "Fazer follow-up manual", "safe_to_post": False, "business_event_on_done": "follow_up_done", }, "CONFIRM_DELIVERY": { "route": "vendas", "action_required": True, "action": "Confirmar receção da comunicação", "safe_to_post": False, "business_event_on_done": "delivery_checked", }, "RECOVER_OPPORTUNITY": { "route": "vendas", "action_required": True, "action": "Recuperar oportunidade sem resposta", "safe_to_post": False, "business_event_on_done": "recovery_reviewed", }, "REVIEW_NURTURE": { "route": "vendas", "action_required": True, "action": "Rever oportunidade em acompanhamento futuro", "safe_to_post": False, "business_event_on_done": "nurture_reviewed", }, } def get_action_config(action_code: str) -> dict: code = str(action_code or "").strip().upper() return ACTION_MAP.get(code, ACTION_MAP["REVIEW_MANUALLY"])