import React, { useState } from 'react'; import { StandardPageLayout } from '@/components/layout/StandardPageLayout'; import { StandardCard } from '@/components/layout/StandardCard'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Plus, Printer, Edit, Trash2, Eye, RefreshCw, Check, ShoppingCart } from 'lucide-react'; import { useSolicitacoesCompra, SolicitacaoCompra, ItemSolicitacao } from '@/hooks/useSolicitacoesCompra'; import { useUserFunction } from '@/hooks/useUserFunction'; import { SolicitacaoComprasModal } from '@/components/solicitacao-compras/SolicitacaoComprasModal'; import { SolicitacaoComprasPreviewModal } from '@/components/solicitacao-compras/SolicitacaoComprasPreviewModal'; import { UserAvatar } from '@/components/ui/user-avatar'; import { format } from 'date-fns'; import { ptBR } from 'date-fns/locale'; const statusColors = { 'Em planejamento': 'bg-yellow-500', 'Revisado': 'bg-orange-500', 'Solicitado': 'bg-blue-500', 'Comprado': 'bg-blue-600', 'Recebido': 'bg-lime-500', 'Arquivado': 'bg-red-500', }; export default function SolicitacaoCompras() { const [isModalOpen, setIsModalOpen] = useState(false); const [isPreviewOpen, setIsPreviewOpen] = useState(false); const [selectedSolicitacao, setSelectedSolicitacao] = useState(null); const { isComprador } = useUserFunction(); const { solicitacoes, isLoading, canEdit, canDelete, deleteSolicitacao, updateStatus, revisar, aceitar, comprar, comprarDireto, isRevisando, isAceitando, isComprando, isComprandoDireto } = useSolicitacoesCompra(); const handlePrint = (solicitacao: SolicitacaoCompra) => { try { const printContent = ` Solicitação de Compra - ${solicitacao.numero_sc} `; const printWindow = window.open('', '_blank'); if (printWindow) { printWindow.document.write(printContent); printWindow.document.close(); // Aguardar o carregamento antes de focar e imprimir printWindow.onload = function() { printWindow.focus(); setTimeout(() => { printWindow.print(); }, 250); }; // Fallback caso onload não funcione setTimeout(() => { if (printWindow && !printWindow.closed) { printWindow.focus(); printWindow.print(); } }, 1000); } } catch (error) { console.error('Erro ao imprimir:', error); alert('Erro ao imprimir. Tente novamente.'); } }; const handleEdit = (solicitacao: SolicitacaoCompra) => { if (!canEdit(solicitacao)) { alert('Você só pode editar suas próprias solicitações.'); return; } setSelectedSolicitacao(solicitacao); setIsModalOpen(true); }; const handlePreview = (solicitacao: SolicitacaoCompra) => { setSelectedSolicitacao(solicitacao); setIsPreviewOpen(true); }; const handleDelete = (solicitacao: SolicitacaoCompra) => { if (!canDelete(solicitacao)) { if (solicitacao.status !== 'Em planejamento') { alert('⚠️ PERMISSÃO NEGADA\n\nSolicitações com status diferente de "Em planejamento" só podem ser excluídas por compradores.'); } else { alert('⚠️ PERMISSÃO NEGADA\n\nVocê só pode excluir suas próprias solicitações.'); } return; } if (window.confirm('⚠️ CONFIRMAÇÃO DE EXCLUSÃO\n\nTem certeza que deseja excluir esta solicitação de compra?\n\nEsta ação não pode ser desfeita!')) { deleteSolicitacao(solicitacao.id); } }; const handleRevisar = (solicitacao: SolicitacaoCompra) => { if (window.confirm(`Tem certeza que deseja enviar a solicitação ${solicitacao.numero_sc} para revisão?`)) { revisar({ id: solicitacao.id, created_by: solicitacao.created_by }); } }; const handleAceitar = (solicitacao: SolicitacaoCompra) => { if (window.confirm(`Tem certeza que deseja aceitar a solicitação ${solicitacao.numero_sc}?`)) { aceitar({ id: solicitacao.id, created_by: solicitacao.created_by }); } }; const handleComprar = (solicitacao: SolicitacaoCompra) => { if (window.confirm(`Tem certeza que deseja marcar a solicitação ${solicitacao.numero_sc} como comprada?`)) { comprar({ id: solicitacao.id, created_by: solicitacao.created_by }); } }; const handleComprarDireto = (solicitacao: SolicitacaoCompra) => { if (window.confirm(`Você deseja passar o status dessa SC ${solicitacao.numero_sc} para "Comprado"?`)) { comprarDireto({ id: solicitacao.id, created_by: solicitacao.created_by }); } }; return (
{isLoading ? (
Carregando solicitações...
) : (
{solicitacoes.map((solicitacao) => ( ))}
Número SC Usuário Data OF/Objetivo Status Revisão Itens Ações
{solicitacao.numero_sc}
{solicitacao.creator?.full_name || 'Usuário não encontrado'}
{format(new Date(solicitacao.data_solicitacao), 'dd/MM/yyyy', { locale: ptBR })}
{solicitacao.of_number || solicitacao.objetivo}
{ e.preventDefault(); e.stopPropagation(); handleComprarDireto(solicitacao); } : undefined } title={ isComprador && solicitacao.status === 'Em planejamento' ? 'Duplo clique para marcar como "Comprado"' : undefined } > {solicitacao.status}
{solicitacao.revisao}
{solicitacao.itens?.length || 0}
{/* Ações básicas - sempre visíveis */} {/* Ações condicionais baseadas em permissões */} {/* Ações exclusivas para compradores */} {isComprador && ( <> {/* Botão Revisar - só para status 'Em planejamento' */} {solicitacao.status === 'Em planejamento' && ( )} {/* Botão Aceitar - para status 'Em planejamento' e 'Revisado' */} {(solicitacao.status === 'Em planejamento' || solicitacao.status === 'Revisado') && ( )} {/* Botão Comprar - só para status 'Solicitado' */} {solicitacao.status === 'Solicitado' && ( )} )}
)}
{ setIsModalOpen(false); setSelectedSolicitacao(null); }} solicitacao={selectedSolicitacao} /> { setIsPreviewOpen(false); setSelectedSolicitacao(null); }} solicitacao={selectedSolicitacao} />
); }