diff --git a/src/components/conversores/AdvanceSteelConverter.tsx b/src/components/conversores/AdvanceSteelConverter.tsx index b0627ba..08e3eba 100644 --- a/src/components/conversores/AdvanceSteelConverter.tsx +++ b/src/components/conversores/AdvanceSteelConverter.tsx @@ -25,6 +25,7 @@ import { toast } from 'sonner'; import * as XLSX from 'xlsx'; import { useAppLabels } from '@/hooks/useAppLabels'; import { usePecas } from '@/hooks/usePecas'; +import { supabase } from '@/integrations/supabase/client'; export interface ComponentItem { marca: string; @@ -159,6 +160,29 @@ const AdvanceSteelConverterContent: React.FC = () => { }, 50); }; + const buscarTratamentoOF = async (ofCode: string): Promise<'pintura' | 'galvanizacao'> => { + if (!ofCode) return 'pintura'; + try { + const cleanOf = ofCode.trim(); + const { data } = await supabase + .from('ordens_fabricacao') + .select('num_of, tratamento_final') + .or(`num_of.eq.${cleanOf},num_of.ilike.%${cleanOf}%`) + .limit(1); + + if (data && data.length > 0 && data[0].tratamento_final) { + const trat = data[0].tratamento_final.toLowerCase(); + if (trat.includes('galv')) { + return 'galvanizacao'; + } + return 'pintura'; + } + } catch (err) { + console.warn('Aviso ao buscar tratamento da OF:', err); + } + return 'pintura'; + }; + const handleTratamentoChange = (novoTratamento: 'pintura' | 'galvanizacao') => { setTratamentoGlobal(novoTratamento); setExtractedData((prev) => @@ -169,12 +193,15 @@ const AdvanceSteelConverterContent: React.FC = () => { ); }; - const handleOfChange = (newOf: string) => { + const handleOfChange = async (newOf: string) => { setHeaderOf(newOf); + const trat = await buscarTratamentoOF(newOf); + setTratamentoGlobal(trat); setExtractedData((prev) => prev.map((item) => ({ ...item, - of: newOf + of: newOf, + tratamentoSuperficial: trat })) ); }; @@ -234,7 +261,7 @@ const AdvanceSteelConverterContent: React.FC = () => { return isNaN(num) ? 0 : num; }; - const processPdfLines = (items: PdfItem[]) => { + const processPdfLines = async (items: PdfItem[]) => { // 1. Agrupamento robusto de linhas por Clustering de Coordenada Y em cada página const pagesMap = new Map(); items.forEach((it) => { @@ -539,6 +566,11 @@ const AdvanceSteelConverterContent: React.FC = () => { addLog(`Total de Peças Principais extraídas: ${assemblies.length}`); + const targetOf = defaultOf || headerOf || (assemblies[0] ? assemblies[0].of : ''); + const detectedTratamento = await buscarTratamentoOF(targetOf); + setTratamentoGlobal(detectedTratamento); + addLog(`Tratamento superficial obtido automaticamente da OF ${targetOf}: ${detectedTratamento === 'galvanizacao' ? 'Galvanizado' : 'Pintura'}`); + const finalPieces: ExtractedPiece[] = assemblies.map((asm) => { const isComposed = asm.isComposed === 'SIM' && asm.components.length > 0; let perfilPrincipal = asm.descricao; @@ -609,7 +641,7 @@ const AdvanceSteelConverterContent: React.FC = () => { comprimentoMax: maxComp > 0 ? maxComp : '-', pesoUnit: pesoUnit > 0 ? pesoUnit.toFixed(2) : '-', pesoTotal: totalPeso > 0 ? totalPeso.toFixed(2) : '-', - tratamentoSuperficial: 'pintura', + tratamentoSuperficial: detectedTratamento, components: isComposed ? asm.components : [] }; }); @@ -663,7 +695,7 @@ const AdvanceSteelConverterContent: React.FC = () => { } addLog(`Total de elementos de texto extraídos: ${allItems.length}`); - processPdfLines(allItems); + await processPdfLines(allItems); } catch (err) { console.error(err); const errMsg = err instanceof Error ? err.message : 'Erro desconhecido'; @@ -878,37 +910,21 @@ const AdvanceSteelConverterContent: React.FC = () => { - {/* Configuração de Tratamento Superficial */} -
+ {/* Indicador Automático de Tratamento Superficial da OF */} +
Tratamento Superficial: - - Configuração Global + + Automático da OF
- - handleTratamentoChange(val as 'pintura' | 'galvanizacao')} - className="grid grid-cols-2 gap-2" - > -
- - -
- -
- - -
-
+
+ + {tratamentoGlobal === 'galvanizacao' ? 'Galvanizado (OF)' : 'Pintura (OF)'} +
diff --git a/src/components/of/EditOFModal.tsx b/src/components/of/EditOFModal.tsx index f93df3c..6aaf7cf 100644 --- a/src/components/of/EditOFModal.tsx +++ b/src/components/of/EditOFModal.tsx @@ -33,6 +33,8 @@ import { format } from 'date-fns'; import { ptBR } from 'date-fns/locale'; import { cn } from '@/lib/utils'; import { Textarea } from '@/components/ui/textarea'; +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; +import { Label } from '@/components/ui/label'; import { OrdemFabricacao } from '@/hooks/useOFs'; const editOFSchema = z.object({ @@ -360,10 +362,27 @@ export const EditOFModal: React.FC = ({ control={form.control} name="tratamento_final" render={({ field }) => ( - + Tratamento Final - + +
+ + +
+
+ + +
+
diff --git a/src/components/of/NovaOFModal.tsx b/src/components/of/NovaOFModal.tsx index bb05571..6b2eda4 100644 --- a/src/components/of/NovaOFModal.tsx +++ b/src/components/of/NovaOFModal.tsx @@ -34,13 +34,18 @@ import { ptBR } from 'date-fns/locale'; import { cn } from '@/lib/utils'; import { useNovaOF } from '@/hooks/useNovaOF'; import { Textarea } from '@/components/ui/textarea'; +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; +import { Label } from '@/components/ui/label'; const novaOFSchema = z.object({ ficha_tecnica_id: z.string().min(1, 'Ficha técnica é obrigatória'), data_abertura: z.string().optional(), data_prazo: z.string().optional(), - prioridade: z.string().default('Normal'), - nivel_qualidade: z.string().default('Normal'), + data_termino_prev: z.string().optional(), + peso_total: z.number().optional(), + gestor: z.string().optional(), + prioridade: z.string(), + nivel_qualidade: z.string(), criterio_qualidade: z.string().optional(), tratamento_final: z.string().optional(), local_uf: z.string().optional(), @@ -66,6 +71,7 @@ export const NovaOFModal: React.FC = ({ data_abertura: new Date().toISOString().split('T')[0], prioridade: 'Normal', nivel_qualidade: 'Normal', + tratamento_final: 'Pintura', }, }); @@ -323,10 +329,27 @@ export const NovaOFModal: React.FC = ({ control={form.control} name="tratamento_final" render={({ field }) => ( - + Tratamento Final - + +
+ + +
+
+ + +
+