43 lines
3.8 KiB
Markdown
43 lines
3.8 KiB
Markdown
# 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).
|