From db1ffd9e8701208cac3360e23f168533eadeebed Mon Sep 17 00:00:00 2001 From: Marcos Reifonas Date: Fri, 21 Aug 2026 10:48:00 +0000 Subject: [PATCH] feat: reformular relatorio da Ficha Tecnica da OF no layout SGI-FM-05 REV.4 com integracao de cronograma --- src/components/forms/FichaTecnicaPreview.tsx | 1297 +++++++++++------ .../pdf/FichaTecnicaPDFTemplate.tsx | 994 +++++++------ 2 files changed, 1369 insertions(+), 922 deletions(-) diff --git a/src/components/forms/FichaTecnicaPreview.tsx b/src/components/forms/FichaTecnicaPreview.tsx index d4cfb0a..e952ecd 100644 --- a/src/components/forms/FichaTecnicaPreview.tsx +++ b/src/components/forms/FichaTecnicaPreview.tsx @@ -1,9 +1,9 @@ - -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Printer, Download } from 'lucide-react'; import { FichaTecnicaData } from '@/hooks/useFichaTecnica'; +import { supabase } from '@/integrations/supabase/client'; import jsPDF from 'jspdf'; import html2canvas from 'html2canvas'; @@ -13,523 +13,886 @@ interface FichaTecnicaPreviewProps { data: FichaTecnicaData; } +interface ProcessoCronogramaItem { + nome: string; + weeks: boolean[]; +} + export function FichaTecnicaPreview({ isOpen, onClose, data }: FichaTecnicaPreviewProps) { + const [cronogramaEtapas, setCronogramaEtapas] = useState([]); + const [prazosCronograma, setPrazosCronograma] = useState<{ + fabricacaoPintura?: string; + montagem?: string; + qualidade?: string; + }>({}); + const [loadingCronograma, setLoadingCronograma] = useState(false); + + // Processa dados JSON caso venham como string + const parseInfo = (field: any) => { + if (!field) return { e: false, c: false, na: false, info: '' }; + if (typeof field === 'string') { + try { + return JSON.parse(field); + } catch { + return { e: false, c: false, na: false, info: field }; + } + } + return field; + }; + + const getFornIndicator = (infoRaw: any) => { + const parsed = parseInfo(infoRaw); + if (parsed.e) return '✓'; + if (parsed.c) return '✓'; + if (parsed.na) return 'NA'; + return ''; + }; + + const getInfoText = (infoRaw: any) => { + const parsed = parseInfo(infoRaw); + return parsed.info && parsed.info.trim() ? parsed.info.trim() : '-'; + }; + + const formatDateBR = (dateStr?: string) => { + if (!dateStr) return '-'; + if (dateStr.includes('-')) { + const parts = dateStr.split('T')[0].split('-'); + if (parts.length === 3) { + return `${parts[2]}/${parts[1]}/${parts[0]}`; + } + } + return dateStr; + }; + + // Carregar dados reais do menu Cronograma + useEffect(() => { + async function loadCronograma() { + if (!isOpen || !data?.of_number) return; + setLoadingCronograma(true); + + try { + // 1. Busca id da OF pelo num_of + const { data: ofData } = await supabase + .from('ordens_fabricacao') + .select('id, num_of, descritivo') + .ilike('num_of', data.of_number.trim()) + .maybeSingle(); + + let processosEncontrados: any[] = []; + + if (ofData?.id) { + const { data: cronoData } = await supabase + .from('cronogramas_of') + .select('id, revisao') + .eq('of_id', ofData.id) + .maybeSingle(); + + if (cronoData?.id) { + const { data: processos } = await supabase + .from('processos_cronograma') + .select('*') + .eq('cronograma_id', cronoData.id) + .order('ordem', { ascending: true }); + + if (processos && processos.length > 0) { + processosEncontrados = processos; + } + } + } + + if (processosEncontrados.length > 0) { + // Filtrar processos com datas válidas + const validDates = processosEncontrados + .flatMap(p => [p.data_inicio, p.data_fim]) + .filter(Boolean) + .map(d => new Date(d + 'T00:00:00').getTime()) + .filter(t => !isNaN(t)); + + const hasValidDates = validDates.length > 0; + const minTime = hasValidDates ? Math.min(...validDates) : 0; + const msPerWeek = 7 * 24 * 60 * 60 * 1000; + + const etapas = processosEncontrados.map((p, index) => { + const pStart = p.data_inicio ? new Date(p.data_inicio + 'T00:00:00').getTime() : null; + const pEnd = p.data_fim ? new Date(p.data_fim + 'T23:59:59').getTime() : null; + const weeksActive = [false, false, false, false, false, false, false, false]; + + if (hasValidDates && pStart && pEnd) { + for (let k = 0; k < 8; k++) { + const wStart = minTime + k * msPerWeek; + const wEnd = minTime + (k + 1) * msPerWeek; + if (pStart <= wEnd && pEnd >= wStart) { + weeksActive[k] = true; + } + } + } + + return { + nome: `${index + 1}. ${p.nome_processo}`, + weeks: weeksActive + }; + }); + + setCronogramaEtapas(etapas); + + // Extrai prazos + const procFab = processosEncontrados.find(p => /fabri|pint|produ/i.test(p.nome_processo)); + const procMont = processosEncontrados.find(p => /monta|insta/i.test(p.nome_processo)); + const procQual = processosEncontrados.find(p => /qualid|inspe|aceite/i.test(p.nome_processo)); + + setPrazosCronograma({ + fabricacaoPintura: procFab && procFab.data_inicio && procFab.data_fim + ? `${formatDateBR(procFab.data_inicio)} a ${formatDateBR(procFab.data_fim)}` + : undefined, + montagem: procMont && procMont.data_inicio && procMont.data_fim + ? `${formatDateBR(procMont.data_inicio)} a ${formatDateBR(procMont.data_fim)}` + : undefined, + qualidade: procQual && procQual.data_inicio && procQual.data_fim + ? `${formatDateBR(procQual.data_inicio)} a ${formatDateBR(procQual.data_fim)}` + : undefined, + }); + } else { + // Caso não tenha dados no menu cronograma preenchidos, etapas vêm em branco + const defaultEtapas = [ + { nome: '1. Detalhamento', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '2. Suprimentos/MP', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '3. Fabricação', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '4. Tratamento/Pintura', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '5. Expedição/Entrega', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '6. Montagem Obra', weeks: [false, false, false, false, false, false, false, false] }, + ]; + setCronogramaEtapas(defaultEtapas); + setPrazosCronograma({}); + } + } catch (e) { + console.error('Erro ao buscar cronograma:', e); + } finally { + setLoadingCronograma(false); + } + } + + loadCronograma(); + }, [isOpen, data?.of_number]); + + const itemsEscopo = [ + { label: 'CÁLCULO ESTRUTURAL', field: data.info_calculo_estrutural }, + { label: 'PROJETO BÁSICO', field: data.info_projeto_basico }, + { label: 'DETALHAMENTO', field: data.info_detalhamento }, + { label: 'MATÉRIA-PRIMA', field: data.info_materia_prima }, + { label: 'FABRICAÇÃO', field: data.info_fabricacao }, + { label: 'GRADES DE PISO / DEGRAUS', field: data.info_grades_piso }, + { label: 'JATEAMENTO', field: data.info_jateamento }, + { label: 'PINTURA BASE / FUNDO', field: data.info_pintura_base }, + { label: 'PINTURA INTERMEDIÁRIA', field: data.info_pintura_inter }, + { label: 'PINTURA DE ACABAMENTO', field: data.info_pintura_acabamento }, + { label: 'GALVANIZAÇÃO', field: data.info_galvanizacao }, + { label: 'EMBALAGEM ESPECIAL', field: data.info_embalagem }, + { label: 'TRANSPORTE', field: data.info_transporte }, + { label: 'INSPEÇÃO QUALIFICADA', field: data.info_inspecao }, + { label: 'ENSAIOS DE LABORATÓRIO', field: data.info_ensaios_lab }, + { label: 'DATABOOK', field: data.info_databook }, + { label: 'PRÉ-MONTAGEM', field: data.info_pre_montagem }, + { label: 'PLACA DE OBRA', field: data.info_placa_engenetal }, + { label: 'PARAFUSOS / PORCAS / ARRUELAS', field: data.info_parafusos }, + { label: 'CHUMBADORES / QUÍMICO', field: data.info_chumbadores }, + { label: 'STUD BOLT', field: data.info_stud_bolt }, + { label: 'FORNECIMENTO DE TELHAS', field: data.info_fornec_telhas }, + { label: 'MONTAGEM DE TELHAS', field: data.info_montagem_telhas }, + { label: 'FORN. / MONTAGEM CALHAS E RUFOS', field: data.info_forn_calhas || data.info_mont_calhas }, + { label: 'STEEL DECK E ACESSÓRIOS', field: data.info_steel_deck }, + { label: 'FORNECIMENTO / MONTAGEM WALL', field: data.info_fornec_wall || data.info_mont_wall }, + { label: 'OUTROS MATERIAIS / SERVIÇOS', field: data.info_outros_materiais }, + ]; + + // Monta endereço da obra + const enderecoObraCompleto = [ + data.endereco_obra || '', + data.bairro_obra ? `Bairro: ${data.bairro_obra}` : '', + (data.cidade_obra || data.estado_obra) ? `Cidade: ${data.cidade_obra || ''}${data.cidade_obra && data.estado_obra ? ' / ' : ''}${data.estado_obra || ''}` : '', + data.cep_obra ? `CEP: ${data.cep_obra}` : '' + ].filter(Boolean).join(' - ') || '-'; + + // Monta responsáveis + const contatosResumo = [ + data.eng_responsavel ? `${data.eng_responsavel} (Eng. Responsável)` : '', + data.telefone_obra ? `Tel: ${data.telefone_obra}` : '', + data.email_obra_responsavel || '', + data.projetista ? `Projetista: ${data.projetista}` : '' + ].filter(Boolean).join(' | ') || (data.projetista ? `Projetista: ${data.projetista}` : '-'); + + // Prazos calculados + const prazoFabPintura = prazosCronograma.fabricacaoPintura || + ((data.data_inicio || data.data_termino_prev) + ? `${formatDateBR(data.data_inicio)} a ${formatDateBR(data.data_termino_prev)}` + : 'A Definir / PCP'); + + const prazoMontagem = prazosCronograma.montagem || + (data.horarios_trabalho || data.condicoes_acesso + ? `${data.condicoes_acesso || ''} ${data.horarios_trabalho ? `(${data.horarios_trabalho})` : ''}`.trim() + : 'Conforme Liberação de Obra'); + + const prazoQualidade = prazosCronograma.qualidade || + (data.info_inspecao?.info ? data.info_inspecao.info : 'Inspeção Dimensional e Solda'); + + // HTML e Estilos Completos para Impressão + const getFullPrintHTML = () => { + const content = document.getElementById('ficha-tecnica-printable-area'); + if (!content) return ''; + + return ` + + + +Ficha Técnica de Contrato - ${data.of_number || ''} + + + + ${content.innerHTML} + +`; + }; + const handlePrint = () => { - const printContent = document.getElementById('ficha-preview-content'); - if (!printContent) return; + const fullHtml = getFullPrintHTML(); + if (!fullHtml) return; const printWindow = window.open('', '_blank'); if (!printWindow) return; - printWindow.document.write(` - - - Ficha Técnica de Contrato - ${data.of_number} - - - - - - - `); - + printWindow.document.write(fullHtml); printWindow.document.close(); printWindow.focus(); - + setTimeout(() => { printWindow.print(); printWindow.close(); - }, 250); + }, 300); }; const handlePDF = async () => { - const element = document.getElementById('ficha-preview-content'); + const element = document.getElementById('ficha-tecnica-printable-area'); if (!element) return; try { const canvas = await html2canvas(element, { - scale: 2, + scale: 2.5, useCORS: true, - logging: false + logging: false, + backgroundColor: '#ffffff' }); - + const imgData = canvas.toDataURL('image/png'); - const pdf = new jsPDF('p', 'mm', 'a4'); - - const imgWidth = 210; - const pageHeight = 297; - const imgHeight = (canvas.height * imgWidth) / canvas.width; - - let heightLeft = imgHeight; - let position = 0; + const pdf = new jsPDF({ + orientation: 'p', + unit: 'mm', + format: 'a4', + compress: true + }); - pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); - heightLeft -= pageHeight; + const pdfWidth = 210; + const pdfHeight = 297; + const margin = 0; + const imgWidth = pdfWidth; + const imgHeight = (canvas.height * pdfWidth) / canvas.width; - while (heightLeft >= 0) { - position = heightLeft - imgHeight; - pdf.addPage(); - pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); - heightLeft -= pageHeight; - } - - pdf.save(`ficha-tecnica-${data.of_number}.pdf`); + pdf.addImage(imgData, 'PNG', margin, 0, imgWidth, Math.min(imgHeight, pdfHeight)); + pdf.save(`Ficha_Tecnica_OF_${data.of_number || 'Sem_Numero'}.pdf`); } catch (error) { console.error('Erro ao gerar PDF:', error); + // Fallback para impressão direta + handlePrint(); } }; - const renderTechnicalInfo = (label: string, info: any) => { - if (!info) return null; - - const hasChecks = info.e || info.c || info.na; - const hasInfo = info.info && info.info.trim(); - - if (!hasChecks && !hasInfo) return null; - - return ( - - {label} - {info.e ? '✓' : ''} - {info.c ? '✓' : ''} - {info.na ? '✓' : ''} - {info.info || ''} - - ); - }; - return ( - - - - Ficha Técnica de Contrato - Preview + + + + Ficha Técnica de Contrato - Visualização & Impressão
- -
- -
- {/* Header */} -
-

FICHA TÉCNICA DE CONTRATO

-
- - {/* Informações Gerais */} -
-
INFORMAÇÕES GERAIS
- - - - - - - - - - - - - - - - - - - -
OF Nº:{data.of_number}GESTOR:{data.gestor || ''}REVISÃO:{data.revisao || '0'}
QTD (t):{data.quantidade || ''}PROJETISTA:{data.projetista || ''}DATA:{data.data_criacao || new Date().toLocaleDateString('pt-BR')}
-
- {/* Dados do Cliente */} -
-
DADOS DO CLIENTE
- + {/* Visualizador de Folha A4 */} +
+
+ {/* TABELA PRINCIPAL INTEGRADA */} +
+ {/* 1. HEADER */} - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {/* 2. DADOS GERAIS E CLIENTE */} + + + + + + {/* 3. DADOS DO PROJETO / OBRA */} + + + + + {/* 4. TIPO DE PROJETO & DOCUMENTOS FORNECIDOS */} + + + + + {/* 5. CORPO PRINCIPAL: ESCOPO (ESQUERDA) + CRONOGRAMA/CONTROLE (DIREITA) */} + + + + + {/* 6. VISTOS E APROVAÇÕES (RODAPÉ) */} + +
CLIENTE:{data.cliente || ''}CNPJ:{data.cnpj || ''}
IE:{data.ie || ''}CEP:{data.cep || ''}ESTADO:{data.estado || ''}
ENDEREÇO:{data.endereco || ''}CIDADE:{data.cidade || ''}
CONTRATO -
{data.contato_contrato || ''}
-
{data.fone_contrato || ''}
-
{data.email_contrato || ''}
+
+
+ TrackSteel +
+
+ ESTRUTURAS METÁLICAS +
OBRA -
{data.contato_obra || ''}
-
{data.fone_obra || ''}
-
{data.email_obra || ''}
+
+
+ FICHA TÉCNICA DE CONTRATO +
QUALIDADE -
{data.contato_qualid || ''}
-
{data.fone_qualid || ''}
-
{data.email_qualid || ''}
+
+ + + + + + + + + + + + + + + +
OF:{data.of_number || '-'}
GESTOR:{data.gestor || '-'}
REVISÃO:{data.revisao !== undefined ? data.revisao : '0'}
+
+
+ DADOS DO CLIENTE +
+ + + + + + + + + + + + + + + +
+ CLIENTE: {data.cliente || '-'} + + CNPJ: {data.cnpj || '-'} +
+ ENDEREÇO: {data.endereco || '-'} + + I.E.: {data.ie || '-'} +
+ CIDADE: {data.cidade || '-'} + + ESTADO: {data.estado || '-'}      CEP: {data.cep || '-'} +
+
+
+ QUANTIDADE / DATA +
+
+
+ QUANTIDADE (t): {data.quantidade != null && data.quantidade !== '' ? data.quantidade : '-'} +
+
+ DATA: {formatDateBR(data.data_criacao) !== '-' ? formatDateBR(data.data_criacao) : new Date().toLocaleDateString('pt-BR')} +
+
+
+
+ DADOS DO PROJETO / OBRA +
+ + + + + + + + + + + + + + + +
+ DESCRIÇÃO RESUMIDA DA OBRA/PRODUTO: + + {data.descricao_resumida || '-'} +
+ ENDEREÇO DA OBRA: + + {enderecoObraCompleto} +
+ RESPONSÁVEIS / CONTATOS: + + {contatosResumo} +
+
+ + + + {/* TIPO DE PROJETO */} + + + {/* DOCUMENTOS FORNECIDOS */} + + + +
+
+ TIPO DE PROJETO +
+
+ + + + + + + + + + + + + + + + + +
+ + {data.tipo_estrutural ? '✓' : ''} + ESTRUTURAL + + + {data.tipo_espacial ? '✓' : ''} + ESPACIAL + + + {data.tipo_grades ? '✓' : ''} + GRADES / ESCADAS +
+ + {data.tipo_residencial ? '✓' : ''} + RESIDENCIAL + + + {data.tipo_comercial ? '✓' : ''} + COMERCIAL + + + {data.tipo_industrial ? '✓' : ''} + INDUSTRIAL +
+ + {data.tipo_cobertura ? '✓' : ''} + COBERTURA + + + {data.tipo_com_montagem ? '✓' : ''} + COM MONTAGEM +
+
+
+
+ DOCUMENTOS FORNECIDOS PELO CLIENTE +
+
+ + + + + + + + + + + + + + + + +
+ + {data.doc_calculo ? '✓' : ''} + CÁLCULO + + + {data.doc_projeto ? '✓' : ''} + PROJETO + + + {data.doc_detalhamento ? '✓' : ''} + DETALHAMENTO +
+ + {data.doc_normas ? '✓' : ''} + NORMAS + + + {data.doc_especif_tecnicas ? '✓' : ''} + ESPECIF. TÉC. + + + {data.doc_catalogo || data.doc_fotos ? '✓' : ''} + CATÁLOGO / FOTOS +
+ + {data.doc_cronograma ? '✓' : ''} + CRONOGRAMA +
+
+
+
+ + + + {/* TABELA DE ESCOPO / MATERIAIS (LADO ESQUERDO 60%) */} + + + {/* CRONOGRAMA & CONTROLE OPERACIONAL (LADO DIREITO 40%) */} + + + +
+
+ INFORMAÇÕES DO PROJETO / ESCOPO DE FORNECIMENTO +
+ + + + + + + + + + {itemsEscopo.map((item, idx) => ( + + + + + + ))} + +
ITEM / DESCRIÇÃOFORN.ESPECIFICAÇÃO / OBSERVAÇÕES
+ {item.label} + + {getFornIndicator(item.field)} + + {getInfoText(item.field)} +
+
+
+ CRONOGRAMA & CONTROLE OPERACIONAL +
+ + {/* PRAZOS E REQUISITOS */} +
+
REQUISITOS / PRAZOS DE EXECUÇÃO:
+ + + + + + + + + + + + + + + +
FABRICAÇÃO E PINTURA:{prazoFabPintura}
MONTAGEM:{prazoMontagem}
QUALIDADE / INSPEÇÃO:{prazoQualidade}
+
+ + {/* TABELA SEMANAL SIMPLIFICADA (ESTILO B.116) */} +
+
+ PLANEJAMENTO DE ETAPAS (SEMANAS) +
+ + + + + + + + + + + + + + + + {cronogramaEtapas.map((etapa, eIdx) => ( + + + {etapa.weeks.map((isActive, wIdx) => ( + + ))} + +
EVENTOS1S2S3S4S5S6S7S8
+ {etapa.nome} + + ))} +
+
+ + {/* ALTERAÇÕES DE CONTRATO */} +
+
+ ALTERAÇÃO NO CONTRATO / PROJETO (Rev. {data.revisao !== undefined ? data.revisao : '0'}) +
+
+ + {data.alteracao_descritivo || (data.revisao && data.revisao !== '0' ? (data.alteracao_motivo || `Revisão ${data.revisao}`) : 'Emissão Inicial - Nenhuma alteração registrada.')} + +
+
+ Impacto Custo: ({data.alteracao_custo && Number(data.alteracao_custo) > 0 ? 'X' : ' '}) Sim ({!data.alteracao_custo || Number(data.alteracao_custo) === 0 ? 'X' : ' '}) Não     + Impacto Prazo: ({data.alteracao_cronograma ? 'X' : ' '}) Sim ({!data.alteracao_cronograma ? 'X' : ' '}) Não +
+
+ + {/* CONTROLE DE QUALIDADE / LIBERAÇÃO */} +
+
CONTROLE DE QUALIDADE & EXPEDIÇÃO
+ + + + + + + + + + + +
PEÇAS PRONTAS: [ {data.alteracao_pecas_prontas ? '✓' : ' '} ] OKPINTURA: [ {data.info_pintura_base?.e || data.info_pintura_acabamento?.e ? '✓' : ' '} ] OK
EMBALAGEM: [ {data.info_embalagem?.e ? '✓' : ' '} ] OKLIB. EXPEDIÇÃO: [ {data.visto_exp ? '✓' : ' '} ] OK
+
+ +
+
+
+ VISTOS E APROVAÇÕES DOS RESPONSÁVEIS +
+ + + + + + + + + + + + + + + + + + + + + +
GESTORPCPENG / PROJETOFABRICAÇÃOEXPEDIÇÃOQUALIDADE
+ + {data.visto_gestor ? `✓ ${data.visto_gestor}` : (data.gestor ? `✓ ${data.gestor}` : '')} + + + + {data.visto_pcp ? `✓ ${data.visto_pcp}` : ''} + + + + {data.visto_eng ? `✓ ${data.visto_eng}` : (data.eng_responsavel ? `✓ ${data.eng_responsavel}` : '')} + + + + {data.visto_fab ? `✓ ${data.visto_fab}` : ''} + + + + {data.visto_exp ? `✓ ${data.visto_exp}` : ''} + + + + {data.visto_qual ? `✓ ${data.visto_qual}` : ''} + +
-
- {/* Dados da Obra */} -
-
DADOS DA OBRA
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
ENG. RESPONSÁVEL:{data.eng_responsavel || ''}TELEFONE:{data.telefone_obra || ''}E-MAIL:{data.email_obra_responsavel || ''}
ENDEREÇO OBRA:{data.endereco_obra || ''}CEP:{data.cep_obra || ''}BAIRRO:{data.bairro_obra || ''}
CIDADE:{data.cidade_obra || ''}UF:{data.estado_obra || ''}OBSERVAÇÕES:{data.observacoes_obra || ''}
-
- - {/* Dados do Projeto */} -
-
DADOS DO PROJETO
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
DESCRIÇÃO:{data.descricao_resumida || ''}
ENDEREÇO:{data.endereco_projeto || ''}CIDADE:{data.cidade_projeto || ''}UF:{data.estado_projeto || ''}
BAIRRO:{data.bairro_projeto || ''}CEP:{data.cep_projeto || ''}HORÁRIOS:{data.horarios_trabalho || ''}
CONDIÇÕES ACESSO:{data.condicoes_acesso || ''}
-
- - {/* Tipo de Projeto */} -
-
TIPO DE PROJETO
-
-
-
- - ESTRUTURAL -
-
- - RESIDENCIAL -
-
- - ESPACIAL -
-
- - COMERCIAL -
-
- - GRADES -
-
- - INDUSTRIAL -
-
- - COBERTURA -
-
- - COM MONTAGEM -
-
+ {/* NOTA DE RODAPÉ */} +
+ SGI-FM-05 REV.4 - FICHA TÉCNICA DE CONTRATO INTEGRADA
- - {/* Documentos Fornecidos */} -
-
DOCUMENTOS FORNECIDOS
-
-
-
- - CÁLCULO -
-
- - PROJETO -
-
- - DETALHAMENTO -
-
- - CRONOGRAMA -
-
- - NORMAS -
-
- - ESPECIF. TÉC. -
-
- - CATÁLOGO -
-
- - FOTOS -
-
-
-
- - {/* Informações do Projeto */} -
-
INFORMAÇÕES DO PROJETO
- - - - - - - - - - - - {renderTechnicalInfo('CÁLCULO ESTRUTURAL', data.info_calculo_estrutural)} - {renderTechnicalInfo('PROJETO BÁSICO', data.info_projeto_basico)} - {renderTechnicalInfo('DETALHAMENTO', data.info_detalhamento)} - {renderTechnicalInfo('MATÉRIA-PRIMA', data.info_materia_prima)} - {renderTechnicalInfo('FABRICAÇÃO', data.info_fabricacao)} - {renderTechnicalInfo('GRADES DE PISO', data.info_grades_piso)} - {renderTechnicalInfo('JATEAMENTO', data.info_jateamento)} - {renderTechnicalInfo('PINTURA BASE/FUNDO', data.info_pintura_base)} - {renderTechnicalInfo('PINTURA INTERMEDIÁRIA', data.info_pintura_inter)} - {renderTechnicalInfo('PINTURA DE ACABAMENTO', data.info_pintura_acabamento)} - {renderTechnicalInfo('GALVANIZAÇÃO', data.info_galvanizacao)} - {renderTechnicalInfo('EMBALAGEM ESPECIAL', data.info_embalagem)} - {renderTechnicalInfo('TRANSPORTE', data.info_transporte)} - {renderTechnicalInfo('INSPEÇÃO QUALIFICADA', data.info_inspecao)} - {renderTechnicalInfo('ENSAIOS DE LABORATÓRIO', data.info_ensaios_lab)} - {renderTechnicalInfo('DATABOOK', data.info_databook)} - {renderTechnicalInfo('PRÉ-MONTAGEM', data.info_pre_montagem)} - {renderTechnicalInfo('PLACA ENGENETAL', data.info_placa_engenetal)} - {renderTechnicalInfo('PARAFUSOS', data.info_parafusos)} - {renderTechnicalInfo('CHUMBADORES', data.info_chumbadores)} - {renderTechnicalInfo('STUD BOLT', data.info_stud_bolt)} - {renderTechnicalInfo('FORNECIMENTO TELHAS', data.info_fornec_telhas)} - {renderTechnicalInfo('MONTAGEM TELHAS', data.info_montagem_telhas)} - {renderTechnicalInfo('FORNECIMENTO CALHAS', data.info_forn_calhas)} - {renderTechnicalInfo('MONTAGEM CALHAS', data.info_mont_calhas)} - {renderTechnicalInfo('STEEL DECK', data.info_steel_deck)} - {renderTechnicalInfo('FORNECIMENTO WALL', data.info_fornec_wall)} - {renderTechnicalInfo('MONTAGEM WALL', data.info_mont_wall)} - {renderTechnicalInfo('OUTROS MATERIAIS', data.info_outros_materiais)} - -
ITEMECNAINFO
-
- - {/* Vistos e Aprovações */} -
-
VISTOS E APROVAÇÕES
- - - - - - - - - - - - - - - - - - - -
GESTOR:{data.visto_gestor || ''}PCP:{data.visto_pcp || ''}ENG:{data.visto_eng || ''}
FABRICAÇÃO:{data.visto_fab || ''}EXPEDIÇÃO:{data.visto_exp || ''}QUALIDADE:{data.visto_qual || ''}
-
diff --git a/src/components/pdf/FichaTecnicaPDFTemplate.tsx b/src/components/pdf/FichaTecnicaPDFTemplate.tsx index 5a31b38..59a3921 100644 --- a/src/components/pdf/FichaTecnicaPDFTemplate.tsx +++ b/src/components/pdf/FichaTecnicaPDFTemplate.tsx @@ -1,4 +1,3 @@ - import React from 'react'; import { FichaTecnicaData } from '@/hooks/useFichaTecnica'; import { useBrandSettings } from '@/hooks/useBrandSettings'; @@ -10,475 +9,560 @@ interface FichaTecnicaPDFTemplateProps { export const FichaTecnicaPDFTemplate: React.FC = ({ data }) => { const { brandSettings } = useBrandSettings(); - const infoItems = [ - { key: 'info_calculo_estrutural', label: 'CÁLCULO ESTRUTURAL' }, - { key: 'info_projeto_basico', label: 'PROJETO BÁSICO' }, - { key: 'info_detalhamento', label: 'DETALHAMENTO' }, - { key: 'info_materia_prima', label: 'MATÉRIA-PRIMA' }, - { key: 'info_fabricacao', label: 'FABRICAÇÃO' }, - { key: 'info_grades_piso', label: 'GRADES DE PISO' }, - { key: 'info_jateamento', label: 'JATEAMENTO' }, - { key: 'info_pintura_base', label: 'PINTURA BASE/FUNDO' }, - { key: 'info_pintura_inter', label: 'PINTURA INTERMEDIÁRIA' }, - { key: 'info_pintura_acabamento', label: 'PINTURA DE ACABAMENTO' }, - { key: 'info_galvanizacao', label: 'GALVANIZAÇÃO' }, - { key: 'info_embalagem', label: 'EMBALAGEM ESPECIAL' }, - { key: 'info_transporte', label: 'TRANSPORTE' }, - { key: 'info_inspecao', label: 'INSPEÇÃO QUALIFICADA' }, - { key: 'info_ensaios_lab', label: 'ENSAIOS DE LABORATÓRIO' }, - { key: 'info_databook', label: 'DATABOOK' }, - { key: 'info_pre_montagem', label: 'PRÉ-MONTAGEM' }, - { key: 'info_placa_engenetal', label: 'PLACA "ENGEMETAL" NA OBRA' }, - { key: 'info_parafusos', label: 'PARAFUSOS/PORCAS/ARR' }, - { key: 'info_chumbadores', label: 'CHUMBADORES' }, - { key: 'info_stud_bolt', label: 'STUD BOLT' }, - { key: 'info_fornec_telhas', label: 'FORNECIMENTO DE TELHAS' }, - { key: 'info_montagem_telhas', label: 'MONTAGEM DE TELHAS' }, - { key: 'info_forn_calhas', label: 'FORN. CALHAS E RUFOS' }, - { key: 'info_mont_calhas', label: 'MONTAG. CALHAS E RUFOS' }, - { key: 'info_steel_deck', label: 'STEEL DECK E ACESSOR.' }, - { key: 'info_fornec_wall', label: 'FORNECIMENTO WALL' }, - { key: 'info_mont_wall', label: 'MONTAGEM WALL' }, - { key: 'info_outros_materiais', label: 'OUTROS MATERIAIS OU SERV. ADICIONAIS' } + const parseInfo = (field: any) => { + if (!field) return { e: false, c: false, na: false, info: '' }; + if (typeof field === 'string') { + try { + return JSON.parse(field); + } catch { + return { e: false, c: false, na: false, info: field }; + } + } + return field; + }; + + const getFornIndicator = (infoRaw: any) => { + const parsed = parseInfo(infoRaw); + if (parsed.e) return '✓'; + if (parsed.c) return '✓'; + if (parsed.na) return 'NA'; + return ''; + }; + + const getInfoText = (infoRaw: any) => { + const parsed = parseInfo(infoRaw); + return parsed.info && parsed.info.trim() ? parsed.info.trim() : '-'; + }; + + const formatDateBR = (dateStr?: string) => { + if (!dateStr) return '-'; + if (dateStr.includes('-')) { + const parts = dateStr.split('T')[0].split('-'); + if (parts.length === 3) { + return `${parts[2]}/${parts[1]}/${parts[0]}`; + } + } + return dateStr; + }; + + const itemsEscopo = [ + { label: 'CÁLCULO ESTRUTURAL', field: data.info_calculo_estrutural }, + { label: 'PROJETO BÁSICO', field: data.info_projeto_basico }, + { label: 'DETALHAMENTO', field: data.info_detalhamento }, + { label: 'MATÉRIA-PRIMA', field: data.info_materia_prima }, + { label: 'FABRICAÇÃO', field: data.info_fabricacao }, + { label: 'GRADES DE PISO / DEGRAUS', field: data.info_grades_piso }, + { label: 'JATEAMENTO', field: data.info_jateamento }, + { label: 'PINTURA BASE / FUNDO', field: data.info_pintura_base }, + { label: 'PINTURA INTERMEDIÁRIA', field: data.info_pintura_inter }, + { label: 'PINTURA DE ACABAMENTO', field: data.info_pintura_acabamento }, + { label: 'GALVANIZAÇÃO', field: data.info_galvanizacao }, + { label: 'EMBALAGEM ESPECIAL', field: data.info_embalagem }, + { label: 'TRANSPORTE', field: data.info_transporte }, + { label: 'INSPEÇÃO QUALIFICADA', field: data.info_inspecao }, + { label: 'ENSAIOS DE LABORATÓRIO', field: data.info_ensaios_lab }, + { label: 'DATABOOK', field: data.info_databook }, + { label: 'PRÉ-MONTAGEM', field: data.info_pre_montagem }, + { label: 'PLACA DE OBRA', field: data.info_placa_engenetal }, + { label: 'PARAFUSOS / PORCAS / ARRUELAS', field: data.info_parafusos }, + { label: 'CHUMBADORES / QUÍMICO', field: data.info_chumbadores }, + { label: 'STUD BOLT', field: data.info_stud_bolt }, + { label: 'FORNECIMENTO DE TELHAS', field: data.info_fornec_telhas }, + { label: 'MONTAGEM DE TELHAS', field: data.info_montagem_telhas }, + { label: 'FORN. / MONTAGEM CALHAS E RUFOS', field: data.info_forn_calhas || data.info_mont_calhas }, + { label: 'STEEL DECK E ACESSÓRIOS', field: data.info_steel_deck }, + { label: 'FORNECIMENTO / MONTAGEM WALL', field: data.info_fornec_wall || data.info_mont_wall }, + { label: 'OUTROS MATERIAIS / SERVIÇOS', field: data.info_outros_materiais }, ]; - const getInfoValue = (field: keyof FichaTecnicaData, type: 'e' | 'c' | 'na' | 'info') => { - const info = data[field] as any; - return info?.[type] || (type === 'info' ? '' : false); - }; + const enderecoObraCompleto = [ + data.endereco_obra || '', + data.bairro_obra ? `Bairro: ${data.bairro_obra}` : '', + (data.cidade_obra || data.estado_obra) ? `Cidade: ${data.cidade_obra || ''}${data.cidade_obra && data.estado_obra ? ' / ' : ''}${data.estado_obra || ''}` : '', + data.cep_obra ? `CEP: ${data.cep_obra}` : '' + ].filter(Boolean).join(' - ') || '-'; - const pdfStyles = { - container: { - fontFamily: 'Arial, sans-serif', - fontSize: '9px', - lineHeight: '1.2', - color: '#000', - width: '210mm', - minHeight: '297mm', - margin: '0 auto', - background: '#fff', - padding: '8mm', - boxSizing: 'border-box' as const - }, - header: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - border: '2px solid #000', - padding: '6px 10px', - marginBottom: '8px', - background: '#e8e8e8' - }, - logo: { - fontSize: '14px', - fontWeight: 'bold', - color: '#333' - }, - title: { - fontSize: '12px', - fontWeight: 'bold', - textAlign: 'center' as const, - flex: 1, - margin: '0 15px' - }, - section: { - marginBottom: '6px', - border: '1px solid #000' - }, - sectionHeader: { - background: '#d0d0d0', - padding: '3px 6px', - borderBottom: '1px solid #000', - fontWeight: 'bold', - fontSize: '8px', - textAlign: 'center' as const - }, - sectionContent: { - padding: '4px 6px' - }, - grid: { - display: 'grid', - gridTemplateColumns: 'repeat(5, 1fr)', - gap: '4px', - margin: '2px 0' - }, - field: { - display: 'flex', - flexDirection: 'column' as const - }, - fieldLabel: { - fontWeight: 'bold', - fontSize: '7px', - marginBottom: '1px', - color: '#444' - }, - fieldValue: { - borderBottom: '1px solid #666', - minHeight: '12px', - padding: '1px 2px', - fontSize: '8px', - background: '#f8f8f8' - }, - checkbox: { - display: 'inline-flex', - alignItems: 'center', - marginRight: '8px', - marginBottom: '2px' - }, - checkboxBox: { - width: '8px', - height: '8px', - border: '1px solid #000', - marginRight: '3px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - fontSize: '6px', - background: '#fff' - }, - contactSection: { - display: 'grid', - gridTemplateColumns: 'repeat(3, 1fr)', - gap: '6px', - margin: '4px 0' - }, - contactGroup: { - border: '1px solid #666', - padding: '3px' - }, - contactTitle: { - fontWeight: 'bold', - textAlign: 'center' as const, - marginBottom: '3px', - background: '#e0e0e0', - padding: '2px', - margin: '-3px -3px 3px -3px', - fontSize: '7px' - }, - table: { - width: '100%', - borderCollapse: 'collapse' as const, - fontSize: '7px' - }, - tableHeader: { - background: '#d0d0d0', - padding: '3px 2px', - textAlign: 'center' as const, - fontWeight: 'bold', - border: '1px solid #000', - fontSize: '7px' - }, - tableCell: { - padding: '2px 3px', - verticalAlign: 'middle' as const, - border: '1px solid #666' - }, - infoItem: { - fontWeight: 'bold', - background: '#f0f0f0', - fontSize: '7px' - }, - infoCheckbox: { - textAlign: 'center' as const, - width: '15px' - }, - infoText: { - minWidth: '120px', - fontSize: '7px' - }, - compactGrid: { - display: 'grid', - gridTemplateColumns: 'repeat(4, 1fr)', - gap: '3px', - margin: '2px 0' - }, - twoColumnGrid: { - display: 'grid', - gridTemplateColumns: '2fr 1fr 1fr', - gap: '4px', - margin: '2px 0' - }, - fullWidth: { - gridColumn: 'span 4' - } - }; + const contatosResumo = [ + data.eng_responsavel ? `${data.eng_responsavel} (Eng. Responsável)` : '', + data.telefone_obra ? `Tel: ${data.telefone_obra}` : '', + data.email_obra_responsavel || '', + data.projetista ? `Projetista: ${data.projetista}` : '' + ].filter(Boolean).join(' | ') || (data.projetista ? `Projetista: ${data.projetista}` : '-'); + + const defaultEtapas = [ + { nome: '1. Detalhamento', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '2. Suprimentos/MP', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '3. Fabricação', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '4. Tratamento/Pintura', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '5. Expedição/Entrega', weeks: [false, false, false, false, false, false, false, false] }, + { nome: '6. Montagem Obra', weeks: [false, false, false, false, false, false, false, false] }, + ]; return ( -
- {/* Cabeçalho */} -
-
- {brandSettings.logo_url ? ( - Logo - ) : ( - brandSettings.company_name || 'EMPRESA' - )} -
-
FICHA TÉCNICA DE CONTRATO
-
-
- - {/* Informações da OF */} -
-
INFORMAÇÕES GERAIS
-
-
-
-
OF Nº:
-
{data.of_number || ''}
-
-
-
GESTOR:
-
{data.gestor || ''}
-
-
-
REVISÃO:
-
{data.revisao || ''}
-
-
-
QTD (t):
-
{data.quantidade || ''}
-
-
-
DATA:
-
{data.data_criacao || ''}
-
-
-
-
- - {/* Dados do Cliente */} -
-
DADOS DO CLIENTE
-
-
-
-
CLIENTE:
-
{data.cliente || ''}
-
-
-
CNPJ:
-
{data.cnpj || ''}
-
-
-
IE:
-
{data.ie || ''}
-
-
-
-
-
ENDEREÇO:
-
{data.endereco || ''}
-
-
-
CIDADE:
-
{data.cidade || ''}
-
-
-
ESTADO:
-
{data.estado || ''}
-
-
- - {/* Contatos compactos */} -
-
-
CONTRATO
-
-
{data.contato_contrato || ''}
-
{data.fone_contrato || ''} | {data.cel_contrato || ''}
-
{data.email_contrato || ''}
+
+ + + {/* HEADER */} + + + + + - {/* Dados do Projeto */} -
-
DADOS DO PROJETO
-
-
-
DESCRIÇÃO:
-
{data.descricao_resumida || ''}
-
-
-
-
ENDEREÇO:
-
{data.endereco_projeto || ''}
-
-
-
CIDADE:
-
{data.cidade_projeto || ''}
-
-
-
ESTADO:
-
{data.estado_projeto || ''}
-
-
-
-
- - {/* Tipo de Projeto */} -
-
TIPO DE PROJETO
-
-
- {[ - { key: 'tipo_estrutural', label: 'ESTRUTURAL' }, - { key: 'tipo_residencial', label: 'RESIDENCIAL' }, - { key: 'tipo_espacial', label: 'ESPACIAL' }, - { key: 'tipo_comercial', label: 'COMERCIAL' }, - { key: 'tipo_grades', label: 'GRADES' }, - { key: 'tipo_industrial', label: 'INDUSTRIAL' }, - { key: 'tipo_cobertura', label: 'COBERTURA' }, - { key: 'tipo_com_montagem', label: 'COM MONTAGEM' } - ].map(({ key, label }) => ( -
-
- {data[key as keyof FichaTecnicaData] ? '✓' : ''} + {/* DADOS DO CLIENTE */} +
+ + + - {/* Informações do Projeto - Tabela compacta */} -
-
INFORMAÇÕES DO PROJETO
-
-
+
+ {brandSettings.company_name || 'TrackSteel'}
- -
-
OBRA
-
-
{data.contato_obra || ''}
-
{data.fone_obra || ''} | {data.cel_obra || ''}
-
{data.email_obra || ''}
+
+ ESTRUTURAS METÁLICAS
-
-
-
QUALIDADE
-
-
{data.contato_qualid || ''}
-
{data.fone_qualid || ''} | {data.cel_qualid || ''}
-
{data.email_qualid || ''}
+
+
+ FICHA TÉCNICA DE CONTRATO
- - - - +
+ + + + + + + + + + + + + + + +
OF:{data.of_number || '-'}
GESTOR:{data.gestor || '-'}
REVISÃO:{data.revisao !== undefined ? data.revisao : '0'}
+
+
+ DADOS DO CLIENTE +
+ + + + + + + + + + + + + + + +
+ CLIENTE: {data.cliente || '-'} + + CNPJ: {data.cnpj || '-'} +
+ ENDEREÇO: {data.endereco || '-'} + + I.E.: {data.ie || '-'} +
+ CIDADE: {data.cidade || '-'} + + ESTADO: {data.estado || '-'}      CEP: {data.cep || '-'} +
+
+
+ QUANTIDADE / DATA +
+
+
+ QUANTIDADE (t): {data.quantidade != null && data.quantidade !== '' ? data.quantidade : '-'}
- {label} -
- ))} - - - - - {/* Documentos Fornecidos */} -
-
DOCUMENTOS FORNECIDOS
-
-
- {[ - { key: 'doc_calculo', label: 'CÁLCULO' }, - { key: 'doc_projeto', label: 'PROJETO' }, - { key: 'doc_detalhamento', label: 'DETALHAMENTO' }, - { key: 'doc_cronograma', label: 'CRONOGRAMA' }, - { key: 'doc_normas', label: 'NORMAS' }, - { key: 'doc_especif_tecnicas', label: 'ESPECIF. TÉC.' }, - { key: 'doc_catalogo', label: 'CATÁLOGO' }, - { key: 'doc_fotos', label: 'FOTOS' } - ].map(({ key, label }) => ( -
-
- {data[key as keyof FichaTecnicaData] ? '✓' : ''} +
+ DATA: {formatDateBR(data.data_criacao) !== '-' ? formatDateBR(data.data_criacao) : new Date().toLocaleDateString('pt-BR')}
- {label}
- ))} -
-
-
+
- - - - - - - - - - - {infoItems.slice(0, 15).map(({ key, label }) => ( - - - - - - - - ))} - -
ITEMECNAINFO
{label} - {getInfoValue(key as keyof FichaTecnicaData, 'e') ? '✓' : ''} - - {getInfoValue(key as keyof FichaTecnicaData, 'c') ? '✓' : ''} - - {getInfoValue(key as keyof FichaTecnicaData, 'na') ? '✓' : ''} - - {getInfoValue(key as keyof FichaTecnicaData, 'info')} -
-
-
- - {/* Validação */} -
-
VALIDAÇÃO
-
-
- NECESSITA VALIDAÇÃO PÓS DETALHAMENTO? -
-
- {data.necessita_validacao_pos_detalh ? '✓' : ''} + {/* DADOS DO PROJETO / OBRA */} + + +
+ DADOS DO PROJETO / OBRA
- SIM -
-
-
- {!data.necessita_validacao_pos_detalh ? '✓' : ''} -
- NÃO -
-
-
-
+ + + + + + + + + + + + + + + +
+ DESCRIÇÃO RESUMIDA DA OBRA/PRODUTO: + + {data.descricao_resumida || '-'} +
+ ENDEREÇO DA OBRA: + + {enderecoObraCompleto} +
+ RESPONSÁVEIS / CONTATOS: + + {contatosResumo} +
+ + - {/* Assinaturas compactas */} -
-
VISTOS E APROVAÇÕES
-
-
-
-
GESTOR:
-
{data.visto_gestor || ''}
-
-
-
PCP:
-
{data.visto_pcp || ''}
-
-
-
ENG:
-
{data.visto_eng || ''}
-
-
-
-
-
FABRICAÇÃO:
-
{data.visto_fab || ''}
-
-
-
EXPEDIÇÃO:
-
{data.visto_exp || ''}
-
-
-
QUALIDADE:
-
{data.visto_qual || ''}
-
-
-
+ {/* TIPO DE PROJETO & DOCUMENTOS */} + + + + + + + + + + +
+
+ TIPO DE PROJETO +
+
+ + + + + + + + + + + + + + + + + +
+ + {data.tipo_estrutural ? '✓' : ''} + ESTRUTURAL + + + {data.tipo_espacial ? '✓' : ''} + ESPACIAL + + + {data.tipo_grades ? '✓' : ''} + GRADES / ESCADAS +
+ + {data.tipo_residencial ? '✓' : ''} + RESIDENCIAL + + + {data.tipo_comercial ? '✓' : ''} + COMERCIAL + + + {data.tipo_industrial ? '✓' : ''} + INDUSTRIAL +
+ + {data.tipo_cobertura ? '✓' : ''} + COBERTURA + + + {data.tipo_com_montagem ? '✓' : ''} + COM MONTAGEM +
+
+
+
+ DOCUMENTOS FORNECIDOS PELO CLIENTE +
+
+ + + + + + + + + + + + + + + + +
+ + {data.doc_calculo ? '✓' : ''} + CÁLCULO + + + {data.doc_projeto ? '✓' : ''} + PROJETO + + + {data.doc_detalhamento ? '✓' : ''} + DETALHAMENTO +
+ + {data.doc_normas ? '✓' : ''} + NORMAS + + + {data.doc_especif_tecnicas ? '✓' : ''} + ESPECIF. TÉC. + + + {data.doc_catalogo || data.doc_fotos ? '✓' : ''} + CATÁLOGO / FOTOS +
+ + {data.doc_cronograma ? '✓' : ''} + CRONOGRAMA +
+
+
+ + + + {/* CORPO: ESCOPO + CRONOGRAMA */} + + + + + + {/* ESCOPO (60%) */} + + + {/* CRONOGRAMA & CONTROLE (40%) */} + + + +
+
+ INFORMAÇÕES DO PROJETO / ESCOPO DE FORNECIMENTO +
+ + + + + + + + + + {itemsEscopo.map((item, idx) => ( + + + + + + ))} + +
ITEM / DESCRIÇÃOFORN.ESPECIFICAÇÃO / OBSERVAÇÕES
+ {item.label} + + {getFornIndicator(item.field)} + + {getInfoText(item.field)} +
+
+
+ CRONOGRAMA & CONTROLE OPERACIONAL +
+ +
+
REQUISITOS / PRAZOS DE EXECUÇÃO:
+ + + + + + + + + + + + + + + +
FABRICAÇÃO E PINTURA: + {(data.data_inicio || data.data_termino_prev) ? `${formatDateBR(data.data_inicio)} a ${formatDateBR(data.data_termino_prev)}` : 'A Definir / PCP'} +
MONTAGEM:Conforme Liberação de Obra
QUALIDADE / INSPEÇÃO:Inspeção Dimensional e Solda
+
+ +
+
+ PLANEJAMENTO DE ETAPAS (SEMANAS) +
+ + + + + + + + + + + + + + + + {defaultEtapas.map((etapa, eIdx) => ( + + + {etapa.weeks.map((isActive, wIdx) => ( + + ))} + +
EVENTOS1S2S3S4S5S6S7S8
+ {etapa.nome} + + ))} +
+
+ +
+
+ ALTERAÇÃO NO CONTRATO / PROJETO (Rev. {data.revisao !== undefined ? data.revisao : '0'}) +
+
+ {data.alteracao_descritivo || 'Emissão Inicial - Nenhuma alteração registrada.'} +
+
+ Impacto Custo: ({data.alteracao_custo && Number(data.alteracao_custo) > 0 ? 'X' : ' '}) Sim ({!data.alteracao_custo || Number(data.alteracao_custo) === 0 ? 'X' : ' '}) Não     + Impacto Prazo: ({data.alteracao_cronograma ? 'X' : ' '}) Sim ({!data.alteracao_cronograma ? 'X' : ' '}) Não +
+
+ +
+
CONTROLE DE QUALIDADE & EXPEDIÇÃO
+ + + + + + + + + + + +
PEÇAS PRONTAS: [ {data.alteracao_pecas_prontas ? '✓' : ' '} ] OKPINTURA: [ {data.info_pintura_base?.e || data.info_pintura_acabamento?.e ? '✓' : ' '} ] OK
EMBALAGEM: [ {data.info_embalagem?.e ? '✓' : ' '} ] OKLIB. EXPEDIÇÃO: [ {data.visto_exp ? '✓' : ' '} ] OK
+
+ +
+ + + + {/* VISTOS E APROVAÇÕES */} + + +
+ VISTOS E APROVAÇÕES DOS RESPONSÁVEIS +
+ + + + + + + + + + + + + + + + + + + + + +
GESTORPCPENG / PROJETOFABRICAÇÃOEXPEDIÇÃOQUALIDADE
+ + {data.visto_gestor ? `✓ ${data.visto_gestor}` : (data.gestor ? `✓ ${data.gestor}` : '')} + + + + {data.visto_pcp ? `✓ ${data.visto_pcp}` : ''} + + + + {data.visto_eng ? `✓ ${data.visto_eng}` : (data.eng_responsavel ? `✓ ${data.eng_responsavel}` : '')} + + + + {data.visto_fab ? `✓ ${data.visto_fab}` : ''} + + + + {data.visto_exp ? `✓ ${data.visto_exp}` : ''} + + + + {data.visto_qual ? `✓ ${data.visto_qual}` : ''} + +
+ + + + + +
+ SGI-FM-05 REV.4 - FICHA TÉCNICA DE CONTRATO INTEGRADA
);