[reserve] Form Página Dados

6JjzvJQqtlTxS1vX · FINALIZADO · ativo · 11 nós

Identidade

campovalor
nome[reserve] Form Página Dados
id6JjzvJQqtlTxS1vX
estado no n8nativo
empresareserve-temporada
pilarReservas
bossBoss Reservas
workplaceFINALIZADO
IANÃO
trigger3 webhooks independentes: /form/reserva-info · /form/reserva-submit · /form/estender
frequênciasob demanda — sempre que um hóspede abre ou envia a página
nós · conexões11 · 10
tagsaudit:revisado · workplace verificado · boss:reservas · empresa:reserve · pilar:reservas
abrir no n8nhttps://n8n.rbrtecnologia.com.br/workflow/6JjzvJQqtlTxS1vX

Papel

O BACKEND da página de reserva. Serve o estado da reserva para a página montar a tela, valida o formulário quando o hóspede envia, e recebe o toque no botão 'quero ficar mais dias'. É consumido pelo Worker do Cloudflare, que faz proxy same-origin para o n8n não ficar exposto.

começa quando

Quando o Worker chama um dos três endpoints /api/… em nome do navegador do hóspede.

termina quando

Ao responder o webhook. A telemetria roda DEPOIS do Respond, para não atrasar a página.

o que NÃO faz

posição na jornada

Entre o Worker (interface) e o Voucher I (gravação). É a terceira das quatro peças da jornada da página.

Mapa nó a nó — ordem real de execução

#tiporeceberegra / condiçãoescreve / efeitosaídapróximoem falha
1WH InfowebhookGET /form/reserva-info?rid=semprequery.ridqueryCode InfoHTTP 500
2Code Infocodequery do webhookrid tem que casar ^[A-Z0-9]{4,12}$; senão devolve rid_invalidoNotion data_source Hóspedes: todos os cards com aquela Reserva Stays · página do imóvel (Tipo de Resort, Dormitório)NADA no Notion — só lê{ok, rid, page_id, status, etapa, canal, resort, segmentos, dividida, capacidade, cap_confiavel, cap_motivo, capacidade_max, qtd_contratada, qtd_informada, vagas_livres, pode_incluir, pos_checkout, auth_method, prefill, titular (PII zerada), acompanhantes (sem CPF)}Respond Infoexceção na leitura do imóvel cai em cap_motivo='excecao:…' e a capacidade degrada para 5
3Respond InforespondToWebhooksaída do Code Infosempreresponde o hóspedeJSON para o WorkerCode · Telemetria
4WH SubmitwebhookPOST /form/reserva-submitsemprebodybodyCode SubmitHTTP 500
5Code Submitcodebody do formulário1) rid e nome do titular obrigatórios; 2) se não conseguiu LER os cards → recusa; 3) se o maior checkout já passou → recusa; 4) se informados > capacidade → recusaNotion: cards da reserva (capacidade, Check-out) · página do imóvelPOST no webhook do Voucher I com o payload em formato LABELS · PATCH Hospede N_CPF em TODOS os cards da reserva{ok, voucher1_status, cpf_patch, capacidade, informados, cap_confiavel} ou {ok:false, error}Respond Submitfalha do Notion vira recusa validacao_indisponivel — não grava às cegas
6Respond SubmitrespondToWebhooksaída do Code Submitsempreresponde o hóspedeJSONCode · Telemetria
7WH EstenderwebhookPOST /form/estendersemprebody.ridbodyCode EstenderHTTP 500
8Code Estendercodebody com ridrid válido e reserva existenteNotion: cards da reserva (nome, telefone, datas, canal, Hospede 2–8)WhatsApp ao Rafael pela sessão WAHA Reserve{ok, rid, msg_id}Respond Estenderok=false se o WAHA não devolver id
9Respond EstenderrespondToWebhooksaída do Code Estendersempreresponde o hóspedeJSONCode · Telemetria
10Code · Telemetriacodequalquer um dos três Respondtry/catch em toda leitura upstream: nó que não rodou lança em n8nsaída do ramo que executou{rota, rid, sucesso, resultado}HTTP · Execution Lognunca derruba — é o motivo do try/catch
11HTTP · Execution LoghttpRequestsaída da TelemetriasempreRPC cockpit_execution_log no Supabase Workplaceconfirmação com boss, pilar e uses_ai resolvidos pelo control planefimonError=continueRegularOutput — telemetria não derruba operação

Ramos

WH Info ──→ Code Info ──→ Respond Info ─────┐
WH Submit ─→ Code Submit ─→ Respond Submit ─┼─→ Code · Telemetria ─→ HTTP · Execution Log
WH Estender → Code Estender → Respond Estender ┘

Os três ramos são INDEPENDENTES: exatamente um roda por execução.

Dentro do Code Submit, as recusas em ordem:
├─ rid ou nome ausente → dados_incompletos
├─ não consegui LER os cards → validacao_indisponivel (fail-closed, 18/08)
├─ maior checkout já passou → pos_checkout (zero writes, 18/08)
├─ informados > capacidade → acima_capacidade (rejeita, não trunca)
└─ tudo ok → Voucher I + PATCH dos CPFs

Dados e autoridade

campoautoridadequem escrevequandoquem NÃO sobrescreve
nome · CPF · RG · nascimento · e-mail · telefone · endereçopágina / Voucher IVoucher I, a partir do que este workflow repassano submit do formulárioo Stays no reservation.modified NÃO sobrescreve
Hospede N_CPFeste workflowCode Submit, PATCH diretono submit — o Voucher I não carrega esses campos
capacidadematriz canônica por resort+tipologianinguém escreve — é derivada do imóvelcalculada a cada chamadao cliente não pode informar: o backend recalcula do zero
qtd_contratadaStays, via gqo5d5 no createdgqo5d5na criação do cardeste workflow só lê
check-in · check-out · canal · imóvel · valorStaysgqo5d5created/modifiedo formulário NÃO altera — são campos estruturais da reserva

Status

aspectodetalhe
status lidosStatus Autorização de Reserva de todos os cards da reserva
status escritosNENHUM — este workflow não movimenta a esteira
mapeamento de etapaReserva/Dados Recebidos → dados · Envio ao Proprietario/Pendente Assinatura/Enviado ao Resort/Problemas Disponibilidade → aguardando · Voucher Enviado Hospede/Aguardando Transferência/Repasse Autorizado/Concluido → pronto · Cancelado → cancelado
reserva divididaa etapa é o MÍNIMO entre as pernas vivas — a reserva só está pronta quando TODAS estão
status desconhecidofail-closed desde 18/08: vira aguardando, NUNCA dados. A reserva não retrocede.
pós-checkoutpos_checkout=true no Info; recusa de escrita no Submit

Comunicações

públicoidentidadecanalcondiçãodeduptexto validadoconteúdomaterialidade
RafaelReserve (sessão do hóspede)WhatsAppCode Estenderhóspede tocou em 'quero ficar mais dias'nenhuma — cada toque mandaNÃOreserva, hóspede, estadia atual, nº de hóspedes, canal e wa.me do hóspedematerial — é oportunidade comercial

Integrações

sistemapapel exato
Notionleitura dos cards e do imóvel; PATCH apenas dos CPFs de acompanhante
Voucher IPOST no webhook /voucher-parte1-dados-hospede com o payload em formato LABELS
WorkplaceRPC cockpit_execution_log — telemetria, credencial Supabase Workplace service_role
WAHA Reserveenvio ao Rafael no ramo Estender
Cloudflare Workerconsumidor dos três endpoints; faz proxy same-origin e mascara. É a peça EM ANÁLISE
Supabase RentalNÃO SE APLICA
TelegramNÃO SE APLICA
KumaNÃO SE APLICA
sub-workflowsnenhum

Reserva dividida

SIM, e em três lugares: o Info devolve o período GLOBAL (min check-in → max check-out) e a lista de segmentos; a etapa é o mínimo entre as pernas; e o Submit patcheia os CPFs de acompanhante em TODOS os cards da reserva, não só no da URL.

Idempotência e deduplicação

Tratamento de falhas

Alterações feitas na auditoria

datadefeito anteriorconsequênciacorreçãoevidênciatocou negócio?
17/08o webhook /form/reserva-info é público e sem auth e devolvia CPF, RG, nascimento, e-mail, telefone e endereço do titularo mascaramento do Worker era contornável: bastava chamar o n8n direto. rid enumerável, ~830 hóspedes com CPF e RGchaves preservadas, valores zerados + auth_method e prefill explícitostestado nos dois caminhos: PII preenchida = NENHUMAsim — mas o navegador já recebia vazio, então o hóspede não perdeu nada
17/08o Code Submit não repassava o sinal de remoção de acompanhanteo Voucher I sabia tratar remove_hospede_N desde 14/08 e nunca recebiarepassa remover_hospedes[] e remove_hospede_Ncadeia completa do webhook ao Notionsim
17/08sem telemetriaexecução não registrada no WorkplaceCode · Telemetria → HTTP · Execution Log, depois dos Respondexecução 882121 · log id=502 · boss=Boss Reservasnão
18/08'Enviado ao Resort' e 'Problemas Disponibilidade' não estavam no mapa de etapacaíam em 'dados': a página mandava o hóspede preencher tudo de novo numa reserva já no resort. Em reserva dividida, UMA perna desconhecida puxava a reserva inteiramapeados + default fail-closed (só status iniciais valem 'dados')OI01J: dados → aguardando; NM03J e MJ06J seguem pronto; OQ11J segue dadossim
18/08a API não expunha qtd_contratadaa página não tinha como separar contratada de informada de capacidade — daí 'Ocupação: 2 de 5'expostos qtd_contratada, qtd_informada, capacidade_max, vagas_livres, pode_incluirNR02J: 5/1/5, vagas 0, pode_incluir falsesim
18/08submit gravava mesmo pós-checkout; e falha do Notion era engolidareserva encerrada aceitava alteração; e uma queda do Notion pularia o próprio guardrecusa pos_checkout e validacao_indisponivel, com a data vinda do CARDoffline com o JS do PROD: NG01J recusa, NR02J segue, Notion fora recusa — zero escritasim

Prova

EXECUÇÃO REAL

itemvalor
execução882121 · 18/08
rotainfo · rid=MJ06J
resultado registradoetapa=pronto cap=6 cap_confiavel=true dividida=false auth=publico
efeito verificadocockpit_execution_log id=502 · boss='Boss Reservas' · pilar='Reservas' · uses_ai=false
ownershipnão afirmado por mim — veio da resposta do Workplace
testes ao vivo depois dos fixesNR02J 5/1/5 pode_incluir=false · OI01J 4/4/5 pode_incluir=true · NG01J pos_checkout=true

Limites — o que NÃO é defeito deste workflow

itemcamadaestado
admin abrir sem CPFWorkernão implementado — o Worker não repassa o IP do cliente
exibir os três númerosWorkerbackend pronto desde 18/08; falta consumir
redirect pós-checkoutWorkernão implementado — GET /NG01J devolve 200 e renderiza
botão 'Remover acompanhante'Workerbackend pronto; front não emite o sinal
reconciliar worker.js repo ↔ deployWorkerBLOQUEIO EXTERNO — sem credencial Cloudflare
3 tokens do Notion + 1 chave WAHA literaishardening transversalPENDENTE

Veredito

FINALIZADO — O backend faz o que promete e os P0/P1 encontrados foram fechados e testados; o que falta é tudo da borda Worker, que é peça própria e está EM ANÁLISE.

Fonte: estrutura-workflows.json (definição viva do n8n PROD, sanitizada) + fichas-detalhe.json · gerado por scripts/gerar-fichas.py. Nenhum token, senha ou PII nesta página.