diff --git a/src/pages/ProductionOrders.tsx b/src/pages/ProductionOrders.tsx index 6a11154..bdcfe5f 100644 --- a/src/pages/ProductionOrders.tsx +++ b/src/pages/ProductionOrders.tsx @@ -98,6 +98,21 @@ const getNextStage = (status: ProductionOrderStatus): { status: Exclude; label: string; description: string } | null => { + switch (status) { + case 'cutting': return { status: 'open', label: 'Voltar para em aberto', description: 'Use quando a produção ainda não foi iniciada.' }; + case 'sewing': return { status: 'cutting', label: 'Voltar para corte', description: 'Use quando esta OP precisa retornar à etapa de corte.' }; + case 'review': return { status: 'sewing', label: 'Voltar para costura', description: 'Use quando a revisão identificar um ajuste na montagem.' }; + case 'finished': return { status: 'review', label: 'Reabrir em revisão', description: 'Use para corrigir uma OP finalizada antes de encerrá-la novamente.' }; + default: return null; + } +}; + +const canReturnToCutPlan = (order: ProductionOrderItem) => ( + !['finished', 'canceled'].includes(order.status) + && (order.integrationStatus || '').toLowerCase() === 'local' +); + const ProductionOrdersSkeleton = () => (
@@ -229,7 +244,8 @@ const ProductionOrders = () => { const finishedQuantity = summary.orders.filter(order => order.status === 'finished').reduce((total, order) => total + (order.finishedQuantity ?? order.quantity), 0); const selectedOrder = summary.orders.find(order => order.id === selectedOrderId) || null; const selectedOrderNextStage = selectedOrder ? getNextStage(selectedOrder.status) : null; - const selectedOrderCanReturnToCutPlan = Boolean(selectedOrder && selectedOrder.status === 'open' && (selectedOrder.integrationStatus || '').toLowerCase() === 'local'); + const selectedOrderPreviousStage = selectedOrder ? getPreviousStage(selectedOrder.status) : null; + const selectedOrderCanReturnToCutPlan = Boolean(selectedOrder && canReturnToCutPlan(selectedOrder)); const handleManualRefresh = () => { void loadProductionOrders({ force: true }); @@ -254,7 +270,7 @@ const ProductionOrders = () => { }; const returnOrderToCutPlan = async (order: ProductionOrderItem) => { - if (order.status !== 'open' || (order.integrationStatus || '').toLowerCase() !== 'local') return; + if (!canReturnToCutPlan(order)) return; const orderNumber = order.number || `#${order.id}`; if (!window.confirm(`Devolver a OP ${orderNumber} ao Plano de Corte?\n\nA OP será cancelada, preservando o histórico. A necessidade voltará para o Plano de Corte e poderá ser gerada novamente quando você decidir.`)) return; @@ -744,7 +760,7 @@ const ProductionOrders = () => {
{statusMessage &&
{statusMessage}
} - {selectedOrderNextStage ?

Próxima ação

{selectedOrderNextStage.label}

{selectedOrderNextStage.description}

:
{selectedOrder.status === 'finished' ? 'Esta OP foi finalizada. Os registros abaixo permanecem disponíveis para consulta.' : 'Esta OP foi cancelada e não possui próxima etapa operacional.'}
} + {selectedOrderNextStage || selectedOrderPreviousStage ?

Fluxo de produção

{selectedOrderNextStage?.label || selectedOrderPreviousStage?.label}

{selectedOrderNextStage?.description || selectedOrderPreviousStage?.description}

{selectedOrderNextStage && }
:
Esta OP foi cancelada e não possui próxima etapa operacional.
}
{renderOrderDetails(selectedOrder)}