import React from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { X, Calendar, FileDown } from 'lucide-react'; import { format, differenceInDays, parseISO } from 'date-fns'; import { ptBR } from 'date-fns/locale'; import { CronogramaOf } from '@/types/cronograma'; interface CronogramaGanttProps { cronograma: CronogramaOf; onClose: () => void; onExportPDF?: () => void; } export const CronogramaGantt: React.FC = ({ cronograma, onClose, onExportPDF }) => { const cores = [ 'bg-blue-500 dark:bg-blue-600', 'bg-green-500 dark:bg-green-600', 'bg-yellow-500 dark:bg-yellow-600', 'bg-purple-500 dark:bg-purple-600', 'bg-red-500 dark:bg-red-600', 'bg-indigo-500 dark:bg-indigo-600', 'bg-pink-500 dark:bg-pink-600', 'bg-gray-500 dark:bg-gray-600' ]; // Calcular o período total do cronograma const todasAsDatas = cronograma.processos.flatMap(p => [p.data_inicio, p.data_fim]); const dataInicioTotal = new Date(Math.min(...todasAsDatas.map(d => new Date(d).getTime()))); const dataFimTotal = new Date(Math.max(...todasAsDatas.map(d => new Date(d).getTime()))); const duracaoTotal = differenceInDays(dataFimTotal, dataInicioTotal) + 1; const calcularPosicaoELargura = (dataInicio: string, dataFim: string) => { const inicio = parseISO(dataInicio); const fim = parseISO(dataFim); const diasDoInicio = differenceInDays(inicio, dataInicioTotal); const duracaoProcesso = differenceInDays(fim, inicio) + 1; const left = (diasDoInicio / duracaoTotal) * 100; const width = (duracaoProcesso / duracaoTotal) * 100; return { left: `${left}%`, width: `${width}%` }; }; const calcularDiasCorridos = (dataInicio: string, dataFim: string) => { return differenceInDays(parseISO(dataFim), parseISO(dataInicio)) + 1; }; return (
Cronograma da OF: {cronograma.ordem_fabricacao?.num_of} - Rev. {cronograma.revisao}
{onExportPDF && ( )}
Gestor Responsável: {cronograma.gestor_profile?.full_name}
{/* Tabela de Prazos */}

Prazos de Produção da OF

{cronograma.processos .sort((a, b) => (a.ordem || 0) - (b.ordem || 0)) .map((processo, index) => ( ))}
Processo Data de Início Data de Fim Dias Corridos
{processo.nome_processo} {format(parseISO(processo.data_inicio), 'dd/MM/yyyy', { locale: ptBR })} {format(parseISO(processo.data_fim), 'dd/MM/yyyy', { locale: ptBR })} {calcularDiasCorridos(processo.data_inicio, processo.data_fim)}
{/* Gráfico de Gantt */}

Linha do Tempo dos Processos

{/* Cabeçalho com datas */}
{format(dataInicioTotal, 'dd/MM/yyyy', { locale: ptBR })}
{format(dataFimTotal, 'dd/MM/yyyy', { locale: ptBR })}
{duracaoTotal} dias totais
{/* Barras dos processos */}
{cronograma.processos .sort((a, b) => (a.ordem || 0) - (b.ordem || 0)) .map((processo, index) => { const posicao = calcularPosicaoELargura(processo.data_inicio, processo.data_fim); const cor = cores[index % cores.length]; const diasCorridos = calcularDiasCorridos(processo.data_inicio, processo.data_fim); const dataInicioFormatada = format(parseISO(processo.data_inicio), 'dd/MM', { locale: ptBR }); const dataFimFormatada = format(parseISO(processo.data_fim), 'dd/MM', { locale: ptBR }); return (
{processo.nome_processo}
{dataInicioFormatada} {diasCorridos}d {dataFimFormatada}
); })}
{/* Legenda */}
Legenda:
{cronograma.processos .sort((a, b) => (a.ordem || 0) - (b.ordem || 0)) .map((processo, index) => { const cor = cores[index % cores.length]; return (
{processo.nome_processo}
); })}
); };