iachat/progresso/reserva_manual.md

3.8 KiB

Criação de Reservas Manuais

Objetivo: Permitir que as recepcionistas possam criar reservas manualmente (bypassando o comportamento automático da IA), incluindo a associação direta a uma caixa de entrada (inbox) e um contato, além de preencher dados como check-in, check-out e status.

Contexto: Antes, a rotina de criação de reservas ocorria exclusivamente de forma automatizada via AiReservationMessageWorker ou fluxos da IA. Havia necessidade de que, caso a IA não tenha executado a ação, a equipe pudesse criar a reserva pela própria UI.

Passos:

  1. Model & Endpoint (Backend):

    • Confirmado que o model já possuía inbox_id (belongs_to :inbox).
    • Criamos o método create no Api::V1::Accounts::Captain::ReservationsController para suportar POST, que além de tudo garante a criação de um ContactInbox na caixa de entrada fornecida se o contato não existisse ainda no pool da referida caixa. (Método privado create_params validando inputs usando Strong Parameters).
    • Adicionamento de post :create no config/routes.rb para a rota namespace captain/reservations.
  2. Store & API (Frontend):

    • No arquivo captain/reservations.js da API, introduzido método assíncrono genérico .create(...) postando ao endpoint.
    • Adicionado no Vuex Store (dashboard/store/captain/reservations.js) a action create que despacha a requisição e sinaliza mensagens de erro/sucesso.
  3. Componente de Modal & Tradução:

    • Adicionada as labels de tradução JSON de Reservas em PT e EN (Ex: CAPTAIN_RESERVATIONS.NEW_RESERVATION_MODAL).
    • Criado o arquivo NewReservationModal.vue usando componentes globais modulares (Dialog, Input, ComboBox e etc) e validando props de injeção direta de inbox-id e contact-id.
  4. Integração nas Telas (Views):

    • Index.vue (Reservas em Lista Geral): Renderiza o subcomponente modal em overlay disparado pelo Header Button "Nova Reserva", onde recarrega as reservas (fetchReservations(1)) após inserção de sucesso.
    • ReservationSummary.vue (Painel lateral das conversas): Disponibilizado um novo botão que repassa diretamente os identificadores do Contato Atual e a Inbox Atual para que o formulário da Reserva seja gerado já pré-povoado e associado devidamente, exibido caso !hasMarker.
  • Simplificação do Modal: O campo de seleção de 'Unidade' foi removido do modal de criação manual, pois o sistema vincula a unidade automaticamente com base na Caixa de Entrada (Inbox) selecionada. Isso evita erros de preenchimento e facilita a operação.
  • Traduções: Atualizadas as chaves de tradução para tornar os campos mais descritivos (ex: Identificador da Suíte).

Principais Códigos e Arquivos Alterados:

  • app/javascript/dashboard/routes/dashboard/captain/reservations/components/NewReservationModal.vue
  • app/javascript/dashboard/routes/dashboard/captain/reservations/Index.vue
  • app/javascript/dashboard/routes/dashboard/conversation/reservation/ReservationSummary.vue
  • app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
  • enterprise/app/controllers/api/v1/accounts/captain/reservations_controller.rb
  • config/routes.rb
  • Arquivos de tradução (pt_BR, en captain.json)
  • app/javascript/dashboard/store/captain/reservations.js
  • app/javascript/dashboard/api/captain/reservations.js

Como validar ou reverter:

  1. Validar: Acessar a página global das IA Reservations ou o painel lateral de uma conversa e tocar em "Nova Reserva". Crie preenchendo as informações, e se aparecer as mensagens de confirmação sem console log error, a UI consumiu o Backend corretamente.
  2. Reverter: Realizar um $ git revert desta feature ou dar Rollback / desfazer os commits. Nenhuma migração de database extra foi executada neste processo (portanto, safe revert).