From 3b182088e6915b3a1cc7c01a485871c118f1a14e Mon Sep 17 00:00:00 2001 From: adm01-debug Date: Mon, 25 May 2026 14:16:07 -0300 Subject: [PATCH] chore(personalization): mark drift fields as @deprecated per #339 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auditoria pós-merge do #329 identificou 3 campos referenciados pelo front que não existem no banco vivo (doufsxqlfjyuvxuezpln): - is_personalizable em product_group_components - area_image_url em product_*_locations - is_default em product_*_location_techniques Decisão de produto (A=limpar / B=ativar via RPC) está pendente — owner de produto (Pink) precisa avaliar roadmap de personalização. Mudança puramente cosmética: - Adiciona JSDoc @deprecated TODO(#339) nos 10 pontos onde os 3 campos aparecem em interfaces TypeScript / mutation types - Mantém todo o comportamento existente (UI, mutations, mappers) - Faz aparecer warning no editor quando alguém tocar nesses campos, apontando para o issue com o contexto completo Drive-by fixes para passar baseline gates do pre-push: - ProductPersonalizationRules: prefixa productId não-usado com _ para satisfazer no-unused-vars (erro pre-existente em main) - SidebarNavGroup: troca `item.badge != null` por `item.badge !== undefined && item.badge !== null` para satisfazer eqeqeq (preserva semântica exata) NÃO afeta runtime. NÃO altera schema. NÃO altera contratos com Supabase. Refs: #339 --- src/components/admin/hooks/useGroupPersonalization.ts | 6 ++++++ src/components/admin/personalization-manager/types.ts | 4 ++++ .../usePersonalizationManager.ts | 2 ++ .../admin/personalization/usePersonalizationData.ts | 2 ++ src/components/layout/sidebar/SidebarNavGroup.tsx | 4 ++-- .../products/ProductPersonalizationRules.tsx | 4 +++- src/lib/external-db/techniques.ts | 10 ++++++++++ 7 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/components/admin/hooks/useGroupPersonalization.ts b/src/components/admin/hooks/useGroupPersonalization.ts index 4cb41d5c5..1ad642cbe 100644 --- a/src/components/admin/hooks/useGroupPersonalization.ts +++ b/src/components/admin/hooks/useGroupPersonalization.ts @@ -17,6 +17,11 @@ export interface GroupComponent { product_group_id: string; component_code: string; component_name: string; + /** + * @deprecated TODO(#339): coluna não existe em product_group_components. + * Existe em product_components — herda no momento do "use group rules". + * Toggle no admin não persiste. + */ is_personalizable: boolean; is_active: boolean; sort_order: number; @@ -30,6 +35,7 @@ export interface GroupLocation { max_width_cm: number | null; max_height_cm: number | null; max_area_cm2: number | null; + /** @deprecated TODO(#339): coluna não existe em product_group_locations; upload não persiste. */ area_image_url: string | null; is_active: boolean; } diff --git a/src/components/admin/personalization-manager/types.ts b/src/components/admin/personalization-manager/types.ts index f587280c7..8d799d6f8 100644 --- a/src/components/admin/personalization-manager/types.ts +++ b/src/components/admin/personalization-manager/types.ts @@ -52,6 +52,10 @@ export interface LocationTechnique { technique_id: string; composed_code: string; max_colors: number | null; + /** + * @deprecated TODO(#339): coluna não existe em product_component_location_techniques. + * Updates do toggle "definir como padrão" não persistem no DB. + */ is_default: boolean; is_active: boolean; technique?: Technique; diff --git a/src/components/admin/personalization-manager/usePersonalizationManager.ts b/src/components/admin/personalization-manager/usePersonalizationManager.ts index 2ce48f54e..13c138fae 100644 --- a/src/components/admin/personalization-manager/usePersonalizationManager.ts +++ b/src/components/admin/personalization-manager/usePersonalizationManager.ts @@ -286,6 +286,7 @@ export function usePersonalizationManager() { max_width_cm?: number | null; max_height_cm?: number | null; max_area_cm2?: number | null; + /** @deprecated TODO(#339): coluna não existe; upload de imagem não persiste. */ area_image_url?: string | null; is_active?: boolean; }) => { @@ -337,6 +338,7 @@ export function usePersonalizationManager() { ...data }: { id: string; + /** @deprecated TODO(#339): coluna não existe; toggle não persiste. */ is_default?: boolean; max_colors?: number | null; is_active?: boolean; diff --git a/src/components/admin/personalization/usePersonalizationData.ts b/src/components/admin/personalization/usePersonalizationData.ts index 588477019..e77ce6390 100644 --- a/src/components/admin/personalization/usePersonalizationData.ts +++ b/src/components/admin/personalization/usePersonalizationData.ts @@ -43,6 +43,7 @@ export interface Location { max_width_cm: number | null; max_height_cm: number | null; max_area_cm2: number | null; + /** @deprecated TODO(#339): coluna não existe; upload de imagem não persiste. */ area_image_url: string | null; is_active: boolean; } @@ -59,6 +60,7 @@ export interface LocationTechnique { technique_id: string; composed_code: string; max_colors: number | null; + /** @deprecated TODO(#339): coluna não existe; toggle "definir como padrão" não persiste. */ is_default: boolean; is_active: boolean; technique?: Technique; diff --git a/src/components/layout/sidebar/SidebarNavGroup.tsx b/src/components/layout/sidebar/SidebarNavGroup.tsx index 340aa00ce..668ffe462 100644 --- a/src/components/layout/sidebar/SidebarNavGroup.tsx +++ b/src/components/layout/sidebar/SidebarNavGroup.tsx @@ -158,7 +158,7 @@ export const SidebarNavGroup = forwardRef( {!isCollapsed && item.shortcut && ( {item.shortcut} )} - {!isCollapsed && item.badge != null && ( + {!isCollapsed && item.badge !== undefined && item.badge !== null && ( {item.badge} )} @@ -174,7 +174,7 @@ export const SidebarNavGroup = forwardRef( {item.shortcut && ( {item.shortcut} )} - {item.badge != null && ( + {item.badge !== undefined && item.badge !== null && ( {item.badge} )} diff --git a/src/components/products/ProductPersonalizationRules.tsx b/src/components/products/ProductPersonalizationRules.tsx index 05dbece29..06ed0bdb4 100644 --- a/src/components/products/ProductPersonalizationRules.tsx +++ b/src/components/products/ProductPersonalizationRules.tsx @@ -67,6 +67,7 @@ interface DbTechnique { description?: string; estimatedDays?: number; max_colors?: number; + /** @deprecated TODO(#339): coluna não existe no DB; RPC nunca retorna. Sempre undefined. */ is_default?: boolean; personalization_techniques?: { id: string; name: string; code: string; description?: string; estimated_days?: number }; } @@ -78,6 +79,7 @@ interface DbLocation { max_width_cm?: number | null; max_height_cm?: number | null; max_area_cm2?: number | null; + /** @deprecated TODO(#339): coluna não existe em product_*_locations; RPC nunca retorna. */ area_image_url?: string | null; techniques?: DbTechnique[]; product_group_location_techniques?: DbTechnique[]; @@ -118,7 +120,7 @@ interface ComponentInfo { locations: LocationInfo[]; } -export function ProductPersonalizationRules({ productId, productSku, productName }: ProductPersonalizationRulesProps) { +export function ProductPersonalizationRules({ productId: _productId, productSku, productName }: ProductPersonalizationRulesProps) { // Check if product uses group rules or has custom rules const { data: productData, isLoading: loadingProduct } = useQuery({ queryKey: ["product-personalization-source", productSku], diff --git a/src/lib/external-db/techniques.ts b/src/lib/external-db/techniques.ts index c6c0e4d42..1cdd60586 100644 --- a/src/lib/external-db/techniques.ts +++ b/src/lib/external-db/techniques.ts @@ -18,7 +18,17 @@ export interface PromobrindPrintArea { technique_code: string | null; technique_name: string | null; max_colors: number | null; + /** + * @deprecated TODO(#339): coluna não existe em product_*_location_techniques. + * Sempre `undefined` na resposta da RPC. Aguardando decisão de produto + * (limpar do front ou expor via RPC usando technique_order=1). + */ is_default: boolean; + /** + * @deprecated TODO(#339): coluna não existe em product_*_locations. + * Sempre `null`. Imagens com image_type='area' existem em product_images + * mas não há mapping para location_code. + */ area_image_url: string | null; }