feat(db): Onda 19 — precisão explícita em 21 colunas numeric (item 5.4)#214
Conversation
Padroniza colunas numeric sem precisão: - 8 percentuais → numeric(5,2) (3,2 para confidence) - 8 dinheiro → numeric(10,2) ou numeric(12,2) (kits/favoritos) - 5 dimensões → numeric(8,2) Banco pré-prod (~0 linhas afetadas, exceto 3 em quotes.real_subtotal escala=2). Zero drift detectado em varredura pré-aplicação. Resolve dependências (DROP + ALTER + RECREATE no mesmo migration): - VIEW v_audit_paradoxos_gravacao (referencia markup_percent) - TRIGGER trg_quotes_calc_real_values (UPDATE OF negotiation_markup_percent) - TRIGGER trg_kit_print_area_normalizar_eixos (UPDATE OF max_width, max_height) CHECKs existentes validados — todos cabem nos novos tipos. Refs: AUDITORIA-PROFUNDA-PROMOGIFTS-PRE-PROD.md item 5.4 Decisão A do PO: markup_percent até 999,99%
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughMigration que padroniza tipos ChangesPadronização de Precisão Numérica
Possibly related PRs
Estimated code review effort🎯 2 (Simple) | ⏱️ ~15 minutos 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Pull request overview
Padroniza a precisão de 21 colunas numeric (audit gap 5.4) para evitar “drift” de escala/precisão em percentuais, valores monetários e dimensões, além de reconstruir dependências (view + triggers) que bloqueiam ALTER COLUMN TYPE.
Changes:
- Define precisão explícita para 21 colunas
numeric(percentuais, dinheiro e dimensões) em múltiplas tabelas. - Drop + recreate de 2 triggers para
quotesekit_component_print_areasapós osALTER TABLE. - Drop + recreate da view
public.v_audit_paradoxos_gravacaopara compatibilizar com o novo tipo demarkup_percent.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| -- 0. DROP dependências bloqueadoras | ||
| DROP VIEW IF EXISTS public.v_audit_paradoxos_gravacao; | ||
| DROP TRIGGER IF EXISTS trg_quotes_calc_real_values ON public.quotes; | ||
| DROP TRIGGER IF EXISTS trg_kit_print_area_normalizar_eixos ON public.kit_component_print_areas; |
| EXECUTE FUNCTION public.fn_kit_print_area_normalizar_eixos(); | ||
|
|
||
| -- 5. RECREATE view (definição idêntica à original — só rebuild para usar novo tipo) | ||
| CREATE OR REPLACE VIEW public.v_audit_paradoxos_gravacao AS |
| ALTER COLUMN discount_percent TYPE numeric(5,2), | ||
| ALTER COLUMN negotiation_markup_percent TYPE numeric(5,2), | ||
| ALTER COLUMN real_discount_percent TYPE numeric(5,2); | ||
|
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 36d50f294f
ℹ️ 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".
| BEFORE INSERT OR UPDATE OF subtotal, discount_amount, negotiation_markup_percent | ||
| ON public.quotes | ||
| FOR EACH ROW | ||
| EXECUTE FUNCTION public.fn_quotes_calc_real_values(); |
There was a problem hiding this comment.
Restore the checked-in quote trigger function
When this migration is applied from a clean database built from the repository migrations, public.fn_quotes_calc_real_values() is never created (repo-wide search of supabase/migrations and recovery only finds this call), so PostgreSQL will fail at CREATE TRIGGER ... EXECUTE FUNCTION and roll back the migration before any later steps run. Either recreate the trigger against the existing checked-in function (validate_quote_real_discount) or add/commit the missing function before this trigger is created.
Useful? React with 👍 / 👎.
| BEFORE INSERT OR UPDATE OF max_width, max_height | ||
| ON public.kit_component_print_areas | ||
| FOR EACH ROW | ||
| EXECUTE FUNCTION public.fn_kit_print_area_normalizar_eixos(); |
There was a problem hiding this comment.
Restore the checked-in kit trigger function
The same clean-migration path fails here because public.fn_kit_print_area_normalizar_eixos() is not defined anywhere in the checked-in migrations or recovery SQL; CREATE TRIGGER requires the referenced trigger function to already exist. This makes supabase db reset/new environment provisioning depend on untracked production drift instead of the repository state.
Useful? React with 👍 / 👎.
| EXECUTE FUNCTION public.fn_kit_print_area_normalizar_eixos(); | ||
|
|
||
| -- 5. RECREATE view (definição idêntica à original — só rebuild para usar novo tipo) | ||
| CREATE OR REPLACE VIEW public.v_audit_paradoxos_gravacao AS |
There was a problem hiding this comment.
Preserve the audit view hardening
docs/redeploy/REDEPLOY-FASE2-EXECUTION-LOG.md classifies v_audit_paradoxos_gravacao as internal/service-role-only and says those views were hardened with security_invoker=true plus role revokes; dropping and recreating it here does not restore either setting. In environments with the same exposed-schema/default grants, this silently reverts the view to owner-rights semantics and can expose the underlying pricing audit rows without the intended RLS/role boundary, so the migration should reapply the ALTER VIEW ... SET (security_invoker = true) and grants/revokes after creation.
Useful? React with 👍 / 👎.
…icts Conflito em 3 arquivos entre PR #216 e commits #217/#218/#214 no main: - vitest.config.ts: mantém comentário explicativo do PR sobre exclusão de tests/e2e/** (não estava em main), restante idêntico. - src/hooks/__tests__/useCatalogState.unit.test.tsx: usa versão do main (bloco TODO detalhado no topo do arquivo é superior ao comentário redundante antes do describe.skip que estava no PR). - tests/components/SimulationPriceSourceBadge.test.tsx: resolvido automaticamente (mudança idêntica nas duas branches). https://claude.ai/code/session_017f7HQxDreJKyNDJM3R7qf6
…rança da view (#219) Fecha os 6 review comments não resolvidos do PR #214: P1 (CodeRabbit): fn_quotes_calc_real_values e fn_kit_print_area_normalizar_eixos existiam apenas como drift de PROD — supabase db reset falharia ao recriar os triggers (function does not exist). Adicionadas as definições exatas extraídas de PROD via CREATE OR REPLACE (idempotente, sem efeito em PROD). P1/P2 (Copilot + CodeRabbit): DROP+RECREATE da view na Onda 19 resetou security_invoker e grants — anon/authenticated receberam acesso total (confirmado via pg_class.relacl). View é service_role-only (REDEPLOY-FASE2-EXECUTION-LOG.md). Restaurado: ALTER VIEW SET (security_invoker=true) + REVOKE de anon/authenticated. Validação pós-aplicação em PROD (doufsxqlfjyuvxuezpln): - 2 funções com search_path seguro (pg_catalog, public) ✅ - reloptions=[security_invoker=true] ✅ - relacl={postgres, service_role} — anon/authenticated removidos ✅ https://claude.ai/code/session_01NahCsAw7oJWnd78egBJt8p Co-authored-by: Claude <noreply@anthropic.com>
🎯 Onda 19 — Padronização de precisão
numeric(audit gap 5.4)Contexto
Auditoria de 10/mai/2026 (item 5.4) mapeou 21 colunas
numericsem precisão em PROD. Escala ilimitada permite drift silencioso: frontend exibe 2 casas, mas DB pode guardar 1234.567899; comparações de igualdade ficam frágeis.Estado pré-prod confirmado: zero drift detectado, ~0 linhas afetadas (exceto
quotes.real_subtotalcom 3 linhas, escala correta).📦 Mudanças
1. Percentuais (8 colunas)
quotes.{discount_percent, negotiation_markup_percent, real_discount_percent}numeric(5,2)seller_discount_limits.{max_discount_percent, approval_required_above}numeric(5,2)tabela_preco_gravacao_oficial.markup_percentnumeric(5,2)(até 999,99% — decisão A do PO)supplier_technique_mappings.confidencenumeric(3,2)variant_supplier_sources.supplier_ipi_ratenumeric(5,2)2. Dinheiro (8 colunas)
quotes.real_subtotalnumeric(10,2)quote_item_personalizations.{unit,setup,total}_costnumeric(10,2)kit_variants.total_pricenumeric(12,2)seller_cart_items.product_pricenumeric(10,2)collection_items.price_at_savenumeric(12,2)collection_items_trash.price_at_savenumeric(12,2)3. Dimensões (5 colunas)
quote_item_personalizations.{area_cm2,height_cm,width_cm}numeric(8,2)kit_component_print_areas.{max_height,max_width}numeric(8,2)🛠️ Dependências resolvidas (DROP+ALTER+RECREATE atômico)
v_audit_paradoxos_gravacao(referenciamarkup_percent) — recriada com definição idêntica, validada pós-aplicação retornando 532 linhastrg_quotes_calc_real_values(UPDATE OF negotiation_markup_percent) — recriado com definição idênticatrg_kit_print_area_normalizar_eixos(UPDATE OF max_width, max_height) — recriado com definição idêntica🚫 NÃO mexido (decisões pré-flight)
orders.total—GENERATED ALWAYS AS total_amount(herda precisão)app_vitals.metric_value— telemetria livre_asia_api_staging.peso,color_analysis_staging.match_distance— stagingtabela_preco_gravacao_oficial.{preco_max,preco_min}_unitario— placeholder uso futuro✅ Validação em PROD
Aplicado em
doufsxqlfjyuvxuezplnantes do commit:🔍 Pré-flight checks
check-no-db-push.mjspassacheck-security-definer-hardening.mjspassacheck-seller-scope.mjspassa📋 Arquivo
supabase/migrations/20260515030000_onda19_numeric_precision.sql(156 linhas)Refs
AUDITORIA-PROFUNDA-PROMOGIFTS-PRE-PROD.mditem 5.4markup_percentaté 999,99%Summary by cubic
Define precisão explícita em 21 colunas
numericpara evitar drift de escala e fechar o gap da auditoria 5.4. Recria 1 view e 2 triggers sem mudar comportamento.Migration
numeric(5,2);numeric(3,2)para confiança;markup_percentaté 999,99%.numeric(10,2)(custos/preços) enumeric(12,2)(totais grandes).numeric(8,2)para campos em cm/cm².Dependencies
v_audit_paradoxos_gravacaorecriada (referenciamarkup_percent).trg_quotes_calc_real_valuesetrg_kit_print_area_normalizar_eixosrecriadas com definições idênticas.Written for commit 36d50f2. Summary will update on new commits.
Summary by CodeRabbit