diff --git a/src/pages/ProductionPlans.tsx b/src/pages/ProductionPlans.tsx
index 7e16049..db47446 100644
--- a/src/pages/ProductionPlans.tsx
+++ b/src/pages/ProductionPlans.tsx
@@ -75,6 +75,7 @@ const ProductionPlans = () => {
const activePlans = useMemo(() => plans.filter(plan => !['finished', 'canceled'].includes(plan.status)), [plans]);
const totalOpenQuantity = useMemo(() => activePlans.reduce((total, plan) => total + plan.totalQuantity, 0), [activePlans]);
+ const reviewingPlan = useMemo(() => plans.find(plan => plan.id === reviewingPlanId) || null, [plans, reviewingPlanId]);
const refreshPlans = async () => {
setIsRefreshing(true);
@@ -235,17 +236,30 @@ const ProductionPlans = () => {
Escopo
{plan.orderCount} {plan.orderCount === 1 ? 'OP' : 'OPs'} · {formatNumber(plan.totalQuantity)} un.
Corte previsto pelo plano
Andamento
Cortado {formatNumber(plan.actualCutQuantity)} · final {formatNumber(plan.finishedQuantity)}
{statusOptions.filter(option => Number(plan.statusCounts[option.value] || 0) > 0).map(option => {plan.statusCounts[option.value]} {option.label.toLowerCase()})}
-
-
Responsável
{plan.contractor || 'Sem facção definida'}
+
Prazo de conclusão
void changeExpectedDate(plan, event.target.value)} className="mt-3 h-10 w-full rounded-lg border border-dark-border bg-dark-card px-3 text-sm font-bold text-dark-text outline-none transition-colors focus:border-brand-primary disabled:cursor-not-allowed disabled:opacity-60 cursor-pointer" aria-label={`Prazo de conclusão do plano ${plan.number}`} />
Início{formatDate(plan.plannedStartDate)}
+
Responsável
{plan.contractor || 'Sem facção definida'}
{responsiblePickerPlanId === plan.id &&
Usuários ativos do Graphs
{isLoadingOperationalUsers ?
Carregando usuários...
: operationalUsers.length ? operationalUsers.map(user =>
) :
Nenhum usuário ativo encontrado.
}
{plan.responsibleName &&
}
}
Ações do plano
Revise a liberação antes de avançar a operação.
- {responsiblePickerPlanId === plan.id && Atribuir responsável
Selecione um usuário ativo do Graphs para acompanhar este plano.
{isLoadingOperationalUsers ?
Carregando usuários...
: operationalUsers.map(user =>
)}{!isLoadingOperationalUsers && !operationalUsers.length &&
Nenhum usuário ativo encontrado. Cadastre ou reative um usuário para atribuir o plano.
}
{plan.responsibleName &&
}
}
- {reviewingPlanId === plan.id && Liberação operacional
Registre a decisão antes de avançar o plano. Este registro não muda o estoque nem substitui o recebimento.
{[{ key: 'materialsReserved', label: 'Materiais reservados' }, { key: 'cutSpecificationReady', label: 'Ficha e corte definidos' }, { key: 'sizeAndColorReviewed', label: 'Tamanhos e cores revisados' }, { key: 'responsibleAndDateDefined', label: 'Responsável e data definidos' }].map(item => )}
}
))}
) : Nenhum plano confirmado
Gere OPs a partir do Plano de Corte para criar o primeiro plano PCP.
}
+
+ {reviewingPlan && busyPlanId !== reviewingPlan.id && setReviewingPlanId(null)}>
+
event.stopPropagation()}>
+
+
+
Revise os pontos de liberação antes de avançar a operação. Este registro não movimenta estoque nem substitui o recebimento físico.
+
+
+
+
+
+
}
);
};