Skip to content

fix(BUG-02,BUG-05): contactId errado e dep fantasma em useQuoteBuilderState#431

Merged
adm01-debug merged 1 commit into
mainfrom
fix/quote-builder-state-bug02-bug05
May 26, 2026
Merged

fix(BUG-02,BUG-05): contactId errado e dep fantasma em useQuoteBuilderState#431
adm01-debug merged 1 commit into
mainfrom
fix/quote-builder-state-bug02-bug05

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 26, 2026

🐛 Correção de BUG-02 e BUG-05 em useQuoteBuilderState.ts

Estes dois bugs foram identificados na auditoria de hooks (PR #427) mas o arquivo useQuoteBuilderState.ts não foi incluído naquele PR por omissão. Este PR corrige o pendente.


BUG-02 — contactId preenchido com ID da empresa (P0)

Arquivo: src/hooks/quotes/useQuoteBuilderState.ts

// ANTES (bugado):
setContactId(quote.client_id || '');  // ID da empresa!

// DEPOIS:
setContactId((quote as Record<string, unknown>).contact_id as string || '');

Impacto: No modo edição de cotação, contactId ficava com o ID da empresa em vez do ID do contato. A validação do step 'client' passava incorretamente porque clientId e contactId eram iguais (ambos o ID da empresa), gerando dados semanticamente errados ao salvar.


BUG-05 — Dependência fantasma productSearch em filteredProducts (P2)

// ANTES (bugado):
const filteredProducts = useMemo(() => {
  return products || [];
}, [products, productSearch]); // productSearch nunca usado no corpo!

// DEPOIS:
const filteredProducts = useMemo(() => {
  return products || [];
}, [products]);

Impacto: Re-computações desnecessárias a cada keystroke na busca de produto.


Relacionado ao PR #427 (auditoria de hooks maio/2026).


Summary by cubic

Fixes BUG-02 and BUG-05 in useQuoteBuilderState to load the correct contactId and stop unnecessary recomputes in product filtering. This corrects client/contact validation on edit and improves search responsiveness.

  • Bug Fixes
    • Set contactId from quote.contact_id instead of quote.client_id when loading a quote (BUG-02).
    • Removed unused productSearch from useMemo deps in filteredProducts to avoid recomputation on each keystroke (BUG-05).

Written for commit 7b0da62. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Notas de Lançamento

  • Correções de Erros

    • Corrigido o carregamento incorreto do ID de contato em orçamentos existentes.
  • Melhorias de Desempenho

    • Otimizado o cálculo de produtos filtrados para evitar recomputações desnecessárias.

Review Change Stack

…rState

BUG-02: setContactId usava quote.client_id (ID da empresa) em vez de
quote.contact_id (ID do contato). Validação do step 'client' passava
incorretamente com dados semanticamente errados no modo edição.

BUG-05: productSearch estava nas deps do useMemo de filteredProducts
mas nunca era usado no corpo do cálculo — causava re-computações
desnecessárias a cada keystroke na busca de produto.
Copilot AI review requested due to automatic review settings May 26, 2026 10:36
@vercel
Copy link
Copy Markdown

vercel Bot commented May 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
we-dream-big Ready Ready Preview, Comment May 26, 2026 10:38am

@supabase
Copy link
Copy Markdown

supabase Bot commented May 26, 2026

This pull request has been ignored for the connected project doufsxqlfjyuvxuezpln because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 26, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c2a071f4-9e5f-4532-80f8-727f92fef54e

📥 Commits

Reviewing files that changed from the base of the PR and between 3c74e28 and 7b0da62.

📒 Files selected for processing (1)
  • src/hooks/quotes/useQuoteBuilderState.ts

Walkthrough

O PR corrige um bug crítico onde contactId era atribuído a partir do campo inexistente quote.client_id em vez de quote.contact_id, afetando o carregamento de orçamentos existentes em modo edição. Também remove productSearch das dependências do useMemo de filteredProducts, eliminando uma dependência fantasma que causava recomputações desnecessárias.

Changes

Ajustes no hook de carregamento de orçamento

Layer / File(s) Summary
Correção de bug no carregamento de contactId
src/hooks/quotes/useQuoteBuilderState.ts (linhas 451–462)
Efeito de carregamento em isEditMode corrige atribuição de contactId para usar quote.contact_id em vez de quote.client_id, com comentário explicando o bug.
Otimização de dependência em useMemo
src/hooks/quotes/useQuoteBuilderState.ts (linhas 707–718)
useMemo que computa filteredProducts remove productSearch das dependências, reduzindo recomputações desnecessárias.

🎯 2 (Simple) | ⏱️ ~8 minutos

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/quote-builder-state-bug02-bug05

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7b0da62c99

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

* contactId != ''), mas semanticamente errada — contactId deveria ser o ID
* da pessoa de contato, não da empresa.
*/
setContactId((quote as Record<string, unknown>).contact_id as string || '');
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Load contactId from a field that actually exists

fetchQuote returns a Quote, but this code now reads quote.contact_id via a cast even though the current quote model/schema does not expose that field (see Quote in src/hooks/quotes/quoteTypes.ts and quotes.Row in src/integrations/supabase/types.ts), so contactId resolves to '' for edited quotes. Because the client step is only considered complete when both clientId and contactId are set (useQuoteBuilderState.ts line 221), edit flows lose their preselected contact and can be blocked from completing/saving unless the user manually reselects a contact (or cannot proceed at all when no contacts are available).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR corrige dois problemas no hook useQuoteBuilderState relacionado ao modo edição de orçamentos e a recomputações desnecessárias na lista de produtos.

Changes:

  • Ajusta o carregamento de contactId ao abrir um orçamento em modo edição (BUG-02).
  • Remove uma dependência não utilizada (productSearch) do useMemo de filteredProducts para evitar recomputações (BUG-05).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +455 to +462
* BUG-02 FIX: usar contact_id (ID do contato) em vez de client_id (ID da empresa).
*
* PROBLEMA ORIGINAL: setContactId recebia quote.client_id, ou seja, o ID da
* empresa. Isso fazia a validação do step 'client' passar (ambos clientId e
* contactId != ''), mas semanticamente errada — contactId deveria ser o ID
* da pessoa de contato, não da empresa.
*/
setContactId((quote as Record<string, unknown>).contact_id as string || '');
Comment on lines 448 to 463
useEffect(() => {
if (!isEditMode || !quoteId) return;
setLoadingQuote(true);
fetchQuote(quoteId).then((quote) => {
if (quote) {
setClientId(quote.client_id || '');
setContactId(quote.client_id || '');
/**
* BUG-02 FIX: usar contact_id (ID do contato) em vez de client_id (ID da empresa).
*
* PROBLEMA ORIGINAL: setContactId recebia quote.client_id, ou seja, o ID da
* empresa. Isso fazia a validação do step 'client' passar (ambos clientId e
* contactId != ''), mas semanticamente errada — contactId deveria ser o ID
* da pessoa de contato, não da empresa.
*/
setContactId((quote as Record<string, unknown>).contact_id as string || '');
setValidUntil(quote.valid_until || format(addDays(new Date(), 30), 'yyyy-MM-dd'));
@adm01-debug adm01-debug merged commit 72ae1ed into main May 26, 2026
43 of 48 checks passed
@adm01-debug adm01-debug deleted the fix/quote-builder-state-bug02-bug05 branch May 26, 2026 10:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants