99 lines
3.1 KiB
Markdown
99 lines
3.1 KiB
Markdown
# Solução de Erros na Criação de Reservas (12/01/2026)
|
|
|
|
Este documento registra os problemas encontrados e as soluções aplicadas durante a confirmação de reservas no fluxo público (`/public/accounts/:id/reservas`).
|
|
|
|
## 1. Erro 500: `undefined local variable or method 'reservation_params'`
|
|
|
|
**Sintoma:**
|
|
Ao enviar o formulário de reserva, a API retornava erro 500.
|
|
|
|
**Causa:**
|
|
O controlador `Public::Api::V1::Captain::ReservationsController` estava tentando usar métodos auxiliares (`reservation_params` e `unit`) que não estavam definidos nessa classe (provavelmente foram copiados/referenciados da versão administrativa, mas não implementados).
|
|
|
|
**Solução:**
|
|
Foram adicionados os métodos privados necessários no controlador:
|
|
|
|
```ruby
|
|
def unit
|
|
@unit ||= ::Captain::Unit.find(params[:unit_id])
|
|
end
|
|
|
|
def reservation_params
|
|
params.permit(
|
|
:brand_id, :unit_id, :contact_name, :phone_number, :email, :cpf,
|
|
:check_in_at, :check_out_at, :total_amount, :duration_minutes,
|
|
metadata: {}
|
|
)
|
|
end
|
|
```
|
|
|
|
## 2. Erro de Validação: `Validation failed: Conversation must exist`
|
|
|
|
**Sintoma:**
|
|
Erro 422: `Validation failed: Conversation must exist`.
|
|
|
|
**Causa:**
|
|
O modelo `Captain::Reservation` possui uma validação de presença (`belongs_to`) para `conversation`. No entanto, o fluxo inicial criava apenas o Contato, mas não iniciava uma conversa, falhando a validação ao tentar salvar a reserva.
|
|
|
|
**Solução:**
|
|
Adicionada a criação de uma `::Conversation` antes de criar a reserva no controlador:
|
|
|
|
```ruby
|
|
# A. Find or Create Contact
|
|
contact = find_or_create_contact(reservation_params)
|
|
|
|
# A.1 Find or Create Conversation
|
|
inbox_id = unit.account.inboxes.first&.id
|
|
conversation = ::Conversation.create!(
|
|
account_id: unit.account_id,
|
|
inbox_id: inbox_id,
|
|
contact_id: contact.id,
|
|
contact_inbox_id: ::ContactInbox.find_by(contact_id: contact.id, inbox_id: inbox_id)&.id,
|
|
status: :open
|
|
)
|
|
|
|
# ... ao criar a reserva, passamos conversation.id
|
|
```
|
|
|
|
## 3. Erro na Geração do Pix: `can't convert nil into Float`
|
|
|
|
**Sintoma:**
|
|
Erro interno no `InterService` ao tentar gerar o Pix: `can't convert nil into Float`.
|
|
|
|
**Causa:**
|
|
Discrepância nos parâmetros passados entre o Controlador e o Serviço.
|
|
|
|
- O Controlador enviava: `{ total_amount: 40.0, contact_name: "Fulano" }`
|
|
- O Serviço (`InterService`) esperava: `{ amount: 40.0, name: "Fulano" }`
|
|
|
|
O serviço tentava acessar `reservation[:amount]`, que retornava `nil`, causando o erro ao formatar para float.
|
|
|
|
**Solução:**
|
|
O `InterService` foi ajustado para usar as chaves enviadas pelo controlador:
|
|
|
|
```ruby
|
|
devedor: {
|
|
nome: reservation[:contact_name] # Antes: reservation[:name]
|
|
},
|
|
valor: {
|
|
original: format('%.2f', reservation[:total_amount].to_f) # Antes: reservation[:amount]
|
|
}
|
|
```
|
|
|
|
## 4. Sanitização de Dados (Frontend)
|
|
|
|
**Solicitação:**
|
|
Enviar CPF e Telefone sem formatação (apenas números).
|
|
|
|
**Solução:**
|
|
No `App.vue`, os dados são limpos antes do envio da requisição:
|
|
|
|
```javascript
|
|
const payload = {
|
|
// ...
|
|
phone_number: formData.telefone.replace(/\D/g, ''), // Remove ( ) -
|
|
cpf: formData.cpf.replace(/\D/g, ''), // Remove . -
|
|
// ...
|
|
};
|
|
```
|