# Como corrigir o JetBooking que não processa reservas

Quando o JetBooking não processa a reserva, o formulário de booking é enviado mas nenhuma reserva é gravada na tabela e as datas não ficam bloqueadas. A causa quase sempre é a instância de booking mal configurada, a tabela do plugin não instalada, ou o pedido WooCommerce que nunca chega a um status pago.

## O que é o JetBooking que não processa a reserva?

O JetBooking gera a funcionalidade de reservas conectando um formulário de booking a uma instância de reserva, que grava cada reserva numa tabela própria do plugin e bloqueia as datas ocupadas no calendário. Quando ele não processa a reserva, o visitante preenche o formulário e clica em reservar, mas a reserva não aparece em JetBooking -> Bookings, as datas continuam livres e, no modo WooCommerce, nenhum pedido é criado. O JetBooking depende do JetEngine ativo: ele usa o tipo de conteúdo do JetEngine para as unidades reserváveis e registra a reserva via uma ação do formulário. Se a instância, a tabela ou o fluxo de pagamento estiverem desalinhados, o envio acontece mas a reserva é descartada em silêncio.

## Como identificar

- O formulário mostra a mensagem de sucesso, mas a reserva não aparece em JetBooking -> Bookings.
- As datas reservadas continuam disponíveis no calendário, permitindo reserva dupla na mesma unidade.
- No modo WooCommerce, o cliente reserva mas nenhum pedido é criado em WooCommerce -> Pedidos.
- O console do navegador mostra erro 400 ou 500 na chamada admin-ajax.php ou na REST do formulário ao enviar.
- Aviso do tipo Booking instance not found ou No available units ao submeter, mesmo com datas livres.

**Antes de começar:** Antes de recriar a tabela de reservas ou rodar comandos de banco, faça um backup completo do banco de dados. Reinstalar a base do JetBooking sobre reservas existentes pode apagar registros se a tabela estiver corrompida.

## Como prevenir

- Mantenha JetEngine e JetBooking atualizados juntos e teste o formulário em staging antes de publicar mudanças na instância
- Após qualquer restore de banco, confirme que a tabela de reservas do plugin ainda existe antes de reabrir as reservas
- Faça uma reserva de teste ponta a ponta, incluindo o pagamento, sempre que trocar o gateway ou o status que confirma o booking

Erros relacionados

- [Como corrigir o JetBooking que não envia notificações por e-mail](https://full.services/wp-fixer/corrigir-jetbooking-nao-envia-email/)
- [Como corrigir o erro de licença da Crocoblock e reativar](https://full.services/wp-fixer/corrigir-erro-licenca-crocoblock/)
- [Como corrigir o JetEngine Relations que não conecta posts](https://full.services/wp-fixer/corrigir-jetengine-relations-nao-conecta/)

## Causa

- A instância de booking em JetBooking -> Settings -> Booking aponta para um tipo de post ou coluna de preço diferente da unidade usada no formulário, então a reserva não casa com nenhuma unidade.
- A tabela de reservas do plugin não foi criada, porque a instalação não rodou ou foi apagada num restore de banco, e o JetBooking não tem onde gravar a reserva.
- O campo de check-in ou check-out do formulário não está mapeado para o campo de datas da instância, então o intervalo chega vazio e a reserva é rejeitada.
- No modo WooCommerce, o pedido fica em status pendente ou cancelado porque o gateway de pagamento não conclui, e o JetBooking só grava a reserva quando o pedido vira processando ou concluído.
- Uma regra de WAF ou mod_security bloqueia a requisição POST de envio do formulário para admin-ajax.php, cortando a ação que cria a reserva.
- O JetEngine está desatualizado ou inativo e a ação Apply Booking do formulário não é registrada, deixando o envio sem efeito.

## Como resolver

1. Confirme JetEngine ativo e atualizado: o JetBooking não funciona sem o JetEngine na versão compatível. Atualize os dois pela tela de plugins e confirme que a instância de booking carrega sem aviso.

```
Plugins -> Plugins instalados -> atualizar JetEngine e JetBooking
wp plugin list --status=active | grep -i jet
```

2. Reinstale a tabela de reservas: verifique se a tabela do plugin existe e recrie-a pela própria tela do JetBooking, que tem o botão de instalar a base de dados. Sem a tabela, nenhuma reserva é gravada.

```
JetBooking -> Settings -> Database -> Install booking database tables
wp db query "SHOW TABLES LIKE '%jet_apartment_bookings%';"
```

3. Realinhe a instância de booking: em JetBooking -> Settings -> Booking, garanta que o tipo de post da unidade, a coluna de preço e os campos de status batem exatamente com a unidade usada no formulário.

```
JetBooking -> Settings -> Booking -> Related Post Type
JetBooking -> Settings -> Booking -> Price Field / Status Field
```

4. Mapeie os campos de data no formulário: no formulário, confirme que os campos de check-in e check-out estão ligados à ação de booking e que a unidade reservável é passada corretamente para a ação.

```
Editar formulário -> ação Apply Booking -> Fields Map -> check-in / check-out / unit
```

5. Acerte o fluxo WooCommerce: se a instância usa WooCommerce, teste um pedido até o fim e confirme que ao virar processando ou concluído a reserva é gravada. Ajuste o status que dispara a reserva se o seu gateway usa outro fluxo.

```
WooCommerce -> Pedidos -> mudar status para Processando
JetBooking -> Settings -> WooCommerce -> Order status to confirm booking
```

6. Descarte WAF e cheque o log: abra o console do navegador ao enviar e veja o status da requisição. Erro 403 indica WAF cortando o POST do formulário, e nesse caso peça ao host uma exceção para a rota de envio.

```
DevTools -> Network -> filtrar admin-ajax.php ao enviar o formulário
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true );
```


## Código

```php
<?php
// Loga no debug.log o disparo da reserva do JetBooking, p/ provar se a acao roda.
// Cole em functions.php do tema-filho. Veja o resultado em wp-content/debug.log.
add_action( 'jet-booking/db/after-insert-booking', function ( $booking_id, $booking ) {
	error_log( '[JetBooking] reserva gravada id=' . $booking_id
		. ' unidade=' . ( $booking['apartment_id'] ?? 'n/d' )
		. ' check-in=' . ( $booking['check_in_date'] ?? 'n/d' )
		. ' check-out=' . ( $booking['check_out_date'] ?? 'n/d' ) );
}, 10, 2 );
```

## Perguntas frequentes

### Por que o formulário diz sucesso mas a reserva não aparece?

A ação de booking não casou a submissão com uma unidade reservável. Em geral a instância aponta para um tipo de post diferente do usado no formulário, ou os campos de check-in e check-out não estão mapeados. Realinhe a instância e o mapeamento de campos.

### O JetBooking funciona sem o JetEngine?

Não. O JetBooking depende do JetEngine ativo e atualizado, porque usa o tipo de conteúdo do JetEngine para as unidades reserváveis e registra a ação Apply Booking do formulário. Com o JetEngine inativo, o envio do formulário não cria reserva.

### As datas não ficam bloqueadas após reservar. Por quê?

A reserva não foi gravada na tabela do plugin, então o calendário não vê o intervalo como ocupado. Verifique se a tabela de reservas existe e se a reserva aparece em JetBooking -> Bookings. Sem o registro, o sistema permite reserva dupla.

### No modo WooCommerce a reserva não é criada. O que falta?

No modo WooCommerce a reserva só é confirmada quando o pedido atinge o status configurado, normalmente processando ou concluído. Se o gateway deixa o pedido pendente, a reserva não grava. Ajuste o status que confirma o booking nas configurações.

### Como sei se a tabela de reservas existe no banco?

Em JetBooking -> Settings há a opção de instalar as tabelas de banco do plugin, que recria a estrutura se ela sumiu. Você também pode listar a tabela no banco pelo nome que contém jet_apartment_bookings para confirmar que ela está presente.

### Um firewall pode impedir o JetBooking de reservar?

Pode. Uma regra de WAF ou mod_security às vezes interpreta o POST do formulário como ataque e retorna 403 na chamada admin-ajax.php, cortando a ação que cria a reserva. Confirme no console do navegador e peça ao host uma exceção para a rota de envio.

### O que muda entre o modo manual e o modo WooCommerce?

No modo manual o JetBooking grava a reserva direto ao enviar o formulário. No modo WooCommerce ele cria um pedido e só confirma a reserva quando o pedido chega ao status pago. Diagnósticos diferentes: no manual olhe a instância e a tabela, no WooCommerce olhe o status do pedido.

**Fonte:** [Crocoblock — JetBooking: How to Create a Booking Functionality](https://crocoblock.com/knowledge-base/jetbooking/how-to-create-a-booking-functionality-on-your-wordpress-website/)
