From 1459655243e2b724056fda6b65d60f07be8970af Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Wed, 15 Apr 2026 10:39:50 -0300 Subject: [PATCH] feat(lifecycle): i18n keys for Jornada do Cliente UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds CAPTAIN_LIFECYCLE block (en + pt_BR) to captain.json with full key set for Rules, Wizard, Settings, History and sidebar entry. Also stages pre-existing uncommitted additions to captain.json from prior work (KPI, PILLS, QUICK_DATE, CARD, ACTIONS extras for CAPTAIN_RESERVATIONS) — those were already in the working tree and belong to the same feature branch. Co-Authored-By: Claude Sonnet 4.6 --- .../dashboard/i18n/locale/en/captain.json | 188 +++++++++++++++++- .../dashboard/i18n/locale/en/settings.json | 1 + .../dashboard/i18n/locale/pt_BR/captain.json | 188 +++++++++++++++++- .../dashboard/i18n/locale/pt_BR/settings.json | 1 + 4 files changed, 374 insertions(+), 4 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/en/captain.json b/app/javascript/dashboard/i18n/locale/en/captain.json index a90081d19..524e65137 100644 --- a/app/javascript/dashboard/i18n/locale/en/captain.json +++ b/app/javascript/dashboard/i18n/locale/en/captain.json @@ -41,7 +41,37 @@ "SORT_UPDATED": "Last update", "SORT_CREATED": "Created at", "APPLY": "Apply filters", - "CLEAR": "Clear filters" + "CLEAR": "Clear filters", + "HIDE": "Hide filters" + }, + "KPI": { + "TOTAL": "Total on page", + "PENDING_PIX": "Awaiting PIX", + "CHECKIN_TODAY": "Check-in today", + "REVENUE_TODAY": "Revenue today" + }, + "PILLS": { + "ALL": "All", + "DRAFT": "Draft", + "PENDING_PAYMENT": "Awaiting PIX", + "CONFIRMED": "Confirmed", + "CANCELLED": "Cancelled" + }, + "QUICK_DATE": { + "TODAY": "Today", + "TOMORROW": "Tomorrow", + "WEEK": "7 days", + "ALL": "All" + }, + "CARD": { + "CHECK_IN": "Check-in", + "AMOUNT": "Amount", + "TODAY": "Today", + "TOMORROW": "Tomorrow", + "YESTERDAY": "Yesterday", + "PIX_EXPIRED": "Expired", + "PIX_EXPIRES_IN_MIN": "Expires in {minutes}min", + "PIX_EXPIRES_IN_HR": "Expires in {hours}h" }, "TABLE": { "CUSTOMER": "Customer", @@ -64,7 +94,19 @@ }, "ACTIONS": { "OPEN_CONVERSATION": "Open conversation", - "COPY_PIX": "Copy Pix" + "COPY_PIX": "Copy Pix", + "MORE": "More", + "REGENERATE_PIX": "Resend PIX", + "MARK_AS_PAID": "Mark as paid", + "MARK_AS_PAID_CONFIRM": "Mark this reservation as manually paid?", + "MARKED_AS_PAID": "Reservation marked as paid.", + "MARK_AS_PAID_FAILED": "Failed to mark as paid.", + "CANCEL": "Cancel reservation", + "CANCEL_REASON_PROMPT": "Cancellation reason (optional):", + "CANCELLED": "Reservation cancelled.", + "CANCEL_FAILED": "Failed to cancel.", + "PIX_REGENERATED": "New PIX generated and sent.", + "PIX_REGENERATE_FAILED": "Failed to resend PIX." }, "KANBAN": { "EMPTY_COLUMN": "No reservations in this status." @@ -511,5 +553,147 @@ "SUCCESS": "FAQ created successfully!", "ERROR": "Error creating FAQ. Please try again." } + }, + "CAPTAIN_LIFECYCLE": { + "HEADER": "Customer Journey", + "SUBTITLE": "Automated WhatsApp messages along the reservation lifecycle", + "TABS": { + "RULES": "Rules", + "SETTINGS": "Settings", + "HISTORY": "History" + }, + "RULES": { + "EMPTY": "No rules configured yet.", + "CREATE": "New rule", + "TEMPLATES_TITLE": "Ready-made templates", + "COLUMNS": { + "NAME": "Name", + "EVENT": "Event", + "OFFSET": "Offset", + "FILTER": "Filter", + "STATUS": "Status", + "ACTIONS": "Actions" + }, + "STATUS": { + "ENABLED": "Active", + "DISABLED": "Disabled" + }, + "ACTIONS": { + "EDIT": "Edit", + "DUPLICATE": "Duplicate", + "TOGGLE": "Enable/Disable", + "DELETE": "Delete" + }, + "DELETE_CONFIRM": "Are you sure you want to delete this rule?", + "TOAST": { + "CREATED": "Rule created successfully.", + "UPDATED": "Rule updated.", + "DELETED": "Rule deleted." + }, + "WIZARD": { + "TITLE_CREATE": "New rule", + "TITLE_EDIT": "Edit rule", + "STEP_WHEN": "When?", + "STEP_WHO": "Who?", + "STEP_WHAT": "What?", + "STEP_REVIEW": "Review", + "NEXT": "Next", + "BACK": "Back", + "SAVE": "Save", + "FIELDS": { + "NAME": "Rule name", + "DESCRIPTION": "Description", + "EVENT": "Trigger event", + "OFFSET_VALUE": "Value", + "OFFSET_UNIT": "Unit", + "OFFSET_DIRECTION": "Direction", + "UNITS": "Units", + "CATEGORIAS": "Suite categories", + "PERMANENCIAS": "Stay types", + "MESSAGE_TYPE": "Message type", + "MESSAGE_BODY": "Message body", + "PRIORITY": "Priority", + "ENABLED": "Rule active" + }, + "OFFSET_UNITS": { + "MINUTES": "Minutes", + "HOURS": "Hours", + "DAYS": "Days" + }, + "OFFSET_DIRECTIONS": { + "BEFORE": "Before", + "AFTER": "After" + }, + "EVENTS": { + "RESERVATION_CONFIRMED": "Reservation confirmed (Pix paid)", + "CHECKIN_SCHEDULED_AT": "Check-in time", + "CHECKOUT_SCHEDULED_AT": "Check-out time", + "RESERVATION_CANCELLED": "Reservation cancelled", + "RESERVATION_NO_SHOW": "No-show" + }, + "MESSAGE_TYPES": { + "TEXT": "Plain text", + "BUTTONS": "Text with buttons", + "LIST": "List menu", + "URL_BUTTON": "Link button" + } + } + }, + "SETTINGS": { + "GUARDS_TITLE": "Anti-spam guards", + "QUIET_HOURS_ENABLED": "Enable quiet hours", + "QUIET_HOURS_FROM": "From", + "QUIET_HOURS_TO": "To", + "MIN_INTERVAL": "Minimum interval between messages (min)", + "MIN_INTERVAL_HELP": "0 disables", + "PAUSE_ON_REPLY": "Pause if customer replied", + "PAUSE_ON_REPLY_WINDOW": "Window (min)", + "OPT_OUT_LABEL": "Opt-out label", + "MAX_PER_RESERVATION_INFO": "Maximum of 5 messages per reservation (not configurable)", + "CONCIERGE_TITLE": "Concierge (Sofia) per Unit", + "CONCIERGE_INBOX": "WhatsApp Inbox", + "CONCIERGE_PERSONA": "Persona name", + "CONCIERGE_KNOWLEDGE": "Knowledge base (markdown)", + "CONCIERGE_VARIABLES": "Unit variables", + "CONCIERGE_VARIABLE_KEY": "Key", + "CONCIERGE_VARIABLE_VALUE": "Value", + "CONCIERGE_ADD_VARIABLE": "Add variable", + "SAVE": "Save changes", + "TOAST": { + "SAVED": "Settings saved.", + "CONCIERGE_SAVED": "Unit concierge updated." + } + }, + "HISTORY": { + "EMPTY": "No deliveries recorded.", + "COLUMNS": { + "RULE": "Rule", + "CUSTOMER": "Customer", + "RESERVATION": "Reservation", + "STATUS": "Status", + "FIRE_AT": "Fired at", + "REASON": "Reason", + "ACTIONS": "" + }, + "STATUS": { + "SCHEDULED": "Scheduled", + "SENT": "Sent", + "SKIPPED": "Skipped", + "FAILED": "Failed", + "CANCELLED": "Cancelled" + }, + "FILTERS": { + "STATUS": "Status", + "RULE": "Rule", + "FROM": "From", + "TO": "To", + "ALL": "All" + }, + "PREVIEW": "Preview", + "MODAL": { + "TITLE": "Message preview", + "CLOSE": "Close" + } + } } } diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index f49bd4a4c..a1a8db0d2 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -343,6 +343,7 @@ "CAPTAIN_PIX_UNITS": "Pix Units", "CAPTAIN_GALLERY": "Gallery", "CAPTAIN_RESERVATIONS": "Reservations", + "CAPTAIN_LIFECYCLE": "Customer Journey", "CAPTAIN_REPORTS": "AI Reports", "CAPTAIN_NOTIFICATIONS": "Automatic Notifications", "HOME": "Home", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json index b454f61cb..eb596de01 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json @@ -41,7 +41,37 @@ "SORT_UPDATED": "Última atualização", "SORT_CREATED": "Data de criação", "APPLY": "Aplicar filtros", - "CLEAR": "Limpar filtros" + "CLEAR": "Limpar filtros", + "HIDE": "Ocultar filtros" + }, + "KPI": { + "TOTAL": "Total na página", + "PENDING_PIX": "Aguardando PIX", + "CHECKIN_TODAY": "Check-in hoje", + "REVENUE_TODAY": "Receita hoje" + }, + "PILLS": { + "ALL": "Todas", + "DRAFT": "Rascunho", + "PENDING_PAYMENT": "Aguardando PIX", + "CONFIRMED": "Confirmadas", + "CANCELLED": "Canceladas" + }, + "QUICK_DATE": { + "TODAY": "Hoje", + "TOMORROW": "Amanhã", + "WEEK": "7 dias", + "ALL": "Tudo" + }, + "CARD": { + "CHECK_IN": "Check-in", + "AMOUNT": "Valor", + "TODAY": "Hoje", + "TOMORROW": "Amanhã", + "YESTERDAY": "Ontem", + "PIX_EXPIRED": "Expirado", + "PIX_EXPIRES_IN_MIN": "Expira em {minutes}min", + "PIX_EXPIRES_IN_HR": "Expira em {hours}h" }, "TABLE": { "CUSTOMER": "Cliente", @@ -64,7 +94,19 @@ }, "ACTIONS": { "OPEN_CONVERSATION": "Abrir conversa", - "COPY_PIX": "Copiar Pix" + "COPY_PIX": "Copiar Pix", + "MORE": "Mais", + "REGENERATE_PIX": "Reenviar PIX", + "MARK_AS_PAID": "Marcar como paga", + "MARK_AS_PAID_CONFIRM": "Marcar esta reserva como paga manualmente?", + "MARKED_AS_PAID": "Reserva marcada como paga.", + "MARK_AS_PAID_FAILED": "Falha ao marcar como paga.", + "CANCEL": "Cancelar reserva", + "CANCEL_REASON_PROMPT": "Motivo do cancelamento (opcional):", + "CANCELLED": "Reserva cancelada.", + "CANCEL_FAILED": "Falha ao cancelar.", + "PIX_REGENERATED": "Novo PIX gerado e enviado.", + "PIX_REGENERATE_FAILED": "Falha ao reenviar PIX." }, "KANBAN": { "EMPTY_COLUMN": "Nenhuma reserva neste status." @@ -513,5 +555,147 @@ "SUCCESS": "FAQ criado com sucesso!", "ERROR": "Erro ao criar FAQ. Tente novamente." } + }, + "CAPTAIN_LIFECYCLE": { + "HEADER": "Jornada do Cliente", + "SUBTITLE": "Automação de mensagens WhatsApp no ciclo de vida da reserva", + "TABS": { + "RULES": "Regras", + "SETTINGS": "Configurações", + "HISTORY": "Histórico" + }, + "RULES": { + "EMPTY": "Nenhuma regra configurada ainda.", + "CREATE": "Nova regra", + "TEMPLATES_TITLE": "Templates prontos", + "COLUMNS": { + "NAME": "Nome", + "EVENT": "Evento", + "OFFSET": "Offset", + "FILTER": "Filtro", + "STATUS": "Status", + "ACTIONS": "Ações" + }, + "STATUS": { + "ENABLED": "Ativo", + "DISABLED": "Desativado" + }, + "ACTIONS": { + "EDIT": "Editar", + "DUPLICATE": "Duplicar", + "TOGGLE": "Ativar/Desativar", + "DELETE": "Excluir" + }, + "DELETE_CONFIRM": "Tem certeza que deseja excluir esta regra?", + "TOAST": { + "CREATED": "Regra criada com sucesso.", + "UPDATED": "Regra atualizada.", + "DELETED": "Regra excluída." + }, + "WIZARD": { + "TITLE_CREATE": "Nova regra", + "TITLE_EDIT": "Editar regra", + "STEP_WHEN": "Quando?", + "STEP_WHO": "Pra quem?", + "STEP_WHAT": "O quê?", + "STEP_REVIEW": "Revisão", + "NEXT": "Próximo", + "BACK": "Voltar", + "SAVE": "Salvar", + "FIELDS": { + "NAME": "Nome da regra", + "DESCRIPTION": "Descrição", + "EVENT": "Evento gatilho", + "OFFSET_VALUE": "Valor", + "OFFSET_UNIT": "Unidade", + "OFFSET_DIRECTION": "Direção", + "UNITS": "Unidades", + "CATEGORIAS": "Categorias de suíte", + "PERMANENCIAS": "Tipos de permanência", + "MESSAGE_TYPE": "Tipo de mensagem", + "MESSAGE_BODY": "Texto da mensagem", + "PRIORITY": "Prioridade", + "ENABLED": "Regra ativa" + }, + "OFFSET_UNITS": { + "MINUTES": "Minutos", + "HOURS": "Horas", + "DAYS": "Dias" + }, + "OFFSET_DIRECTIONS": { + "BEFORE": "Antes", + "AFTER": "Depois" + }, + "EVENTS": { + "RESERVATION_CONFIRMED": "Reserva confirmada (Pix pago)", + "CHECKIN_SCHEDULED_AT": "Horário de check-in", + "CHECKOUT_SCHEDULED_AT": "Horário de check-out", + "RESERVATION_CANCELLED": "Reserva cancelada", + "RESERVATION_NO_SHOW": "No-show" + }, + "MESSAGE_TYPES": { + "TEXT": "Texto simples", + "BUTTONS": "Texto com botões", + "LIST": "Menu de lista", + "URL_BUTTON": "Botão de link" + } + } + }, + "SETTINGS": { + "GUARDS_TITLE": "Guards anti-spam", + "QUIET_HOURS_ENABLED": "Ativar quiet hours", + "QUIET_HOURS_FROM": "De", + "QUIET_HOURS_TO": "Até", + "MIN_INTERVAL": "Intervalo mínimo entre mensagens (min)", + "MIN_INTERVAL_HELP": "0 desativa", + "PAUSE_ON_REPLY": "Pausar se o cliente respondeu", + "PAUSE_ON_REPLY_WINDOW": "Janela (min)", + "OPT_OUT_LABEL": "Label de opt-out", + "MAX_PER_RESERVATION_INFO": "Máximo de 5 mensagens por reserva (não configurável)", + "CONCIERGE_TITLE": "Concierge (Sofia) por Unidade", + "CONCIERGE_INBOX": "Inbox WhatsApp", + "CONCIERGE_PERSONA": "Nome da persona", + "CONCIERGE_KNOWLEDGE": "Base de conhecimento (markdown)", + "CONCIERGE_VARIABLES": "Variáveis da unidade", + "CONCIERGE_VARIABLE_KEY": "Chave", + "CONCIERGE_VARIABLE_VALUE": "Valor", + "CONCIERGE_ADD_VARIABLE": "Adicionar variável", + "SAVE": "Salvar alterações", + "TOAST": { + "SAVED": "Configurações salvas.", + "CONCIERGE_SAVED": "Concierge da unidade atualizado." + } + }, + "HISTORY": { + "EMPTY": "Nenhuma entrega registrada.", + "COLUMNS": { + "RULE": "Regra", + "CUSTOMER": "Cliente", + "RESERVATION": "Reserva", + "STATUS": "Status", + "FIRE_AT": "Disparado em", + "REASON": "Motivo", + "ACTIONS": "" + }, + "STATUS": { + "SCHEDULED": "Agendada", + "SENT": "Enviada", + "SKIPPED": "Pulada", + "FAILED": "Falhou", + "CANCELLED": "Cancelada" + }, + "FILTERS": { + "STATUS": "Status", + "RULE": "Regra", + "FROM": "De", + "TO": "Até", + "ALL": "Todas" + }, + "PREVIEW": "Preview", + "MODAL": { + "TITLE": "Preview da mensagem", + "CLOSE": "Fechar" + } + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 06d0663bb..9784fe324 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -342,6 +342,7 @@ "CAPTAIN_PIX_UNITS": "Unidades Pix", "CAPTAIN_GALLERY": "Galeria", "CAPTAIN_RESERVATIONS": "Reservas", + "CAPTAIN_LIFECYCLE": "Jornada do Cliente", "CAPTAIN_REPORTS": "Relatórios IA", "CAPTAIN_NOTIFICATIONS": "Notificações Automáticas", "HOME": "Principal",