🚀 Auto-deploy: TrackSteelAPP atualizado em 22/09/2026 02:17:06

This commit is contained in:
2026-09-22 02:17:06 +00:00
parent 2fa1f4b1a3
commit 26591012dd
3 changed files with 55 additions and 33 deletions
@@ -568,7 +568,6 @@ export const SmartConsultaRelatoriosFlow: React.FC<SmartConsultaRelatoriosFlowPr
p.quantidade.toString(), p.quantidade.toString(),
p.detalhamento.toString(), p.detalhamento.toString(),
p.corte.toString(), p.corte.toString(),
p.montagem.toString(),
p.solda.toString(), p.solda.toString(),
p.pintura.toString(), p.pintura.toString(),
p.expedido.toString(), p.expedido.toString(),
@@ -577,7 +576,7 @@ export const SmartConsultaRelatoriosFlow: React.FC<SmartConsultaRelatoriosFlowPr
autoTable(doc, { autoTable(doc, {
startY: 33, startY: 33,
head: [['Marca', 'Perfil / Peça', 'Fase', 'Total', 'Det.', 'Corte', 'Mont.', 'Solda', 'Pint.', 'Exp.', 'Obra']], head: [['Marca', 'Perfil / Peça', 'Fase', 'Total', 'Det.', 'Corte', 'Solda', 'Pint.', 'Exp.', 'Obra']],
body: tableRows, body: tableRows,
theme: 'plain', theme: 'plain',
headStyles: { headStyles: {
@@ -910,12 +909,11 @@ export const SmartConsultaRelatoriosFlow: React.FC<SmartConsultaRelatoriosFlowPr
</div> </div>
</div> </div>
{/* Linha do Tempo Visual com TODAS as Etapas Fabris */} {/* Linha do Tempo Visual com Etapas Fabris Corretas: Det → Corte → Solda → Pint → Emb → Obra */}
<div className="grid grid-cols-7 gap-1 mt-3 pt-2.5 border-t border-slate-100 dark:border-slate-700/80 text-center"> <div className="grid grid-cols-6 gap-1 mt-3 pt-2.5 border-t border-slate-100 dark:border-slate-700/80 text-center">
{[ {[
{ nome: 'Det.', valor: peca.detalhamento, isPula: false }, { nome: 'Det.', valor: peca.detalhamento, isPula: false },
{ nome: 'Corte', valor: peca.corte, isPula: false }, { nome: 'Corte', valor: peca.corte, isPula: false },
{ nome: 'Mont.', valor: peca.montagem, isPula: peca.tem_componentes === false },
{ nome: 'Solda', valor: peca.solda, isPula: peca.tem_componentes === false }, { nome: 'Solda', valor: peca.solda, isPula: peca.tem_componentes === false },
{ nome: 'Pint.', valor: peca.pintura, isPula: false }, { nome: 'Pint.', valor: peca.pintura, isPula: false },
{ nome: 'Emb.', valor: peca.expedido, isPula: false }, { nome: 'Emb.', valor: peca.expedido, isPula: false },
+41 -17
View File
@@ -65,13 +65,19 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<button <button
type="button" type="button"
onClick={() => handleAcao('producao')} onClick={() => handleAcao('producao')}
className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl bg-gradient-to-br from-amber-500 to-amber-600 dark:from-amber-600 dark:to-amber-700 hover:from-amber-400 hover:to-amber-500 text-white shadow-lg shadow-amber-900/20 dark:shadow-amber-950/40 border-2 border-amber-300/60 dark:border-amber-400/40 flex flex-col justify-between text-left transition-all active:scale-[0.97] group" className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl
bg-amber-50 hover:bg-amber-100 active:bg-amber-100
dark:bg-gradient-to-br dark:from-amber-600 dark:to-amber-700 dark:hover:from-amber-500 dark:hover:to-amber-600
border-2 border-amber-400 dark:border-amber-400/40
shadow-md shadow-amber-200/60 dark:shadow-amber-950/40
text-amber-800 dark:text-white
flex flex-col justify-between text-left transition-all active:scale-[0.97] group"
> >
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full">
<div className="p-2.5 rounded-2xl bg-white/20 dark:bg-white/15 text-white backdrop-blur-sm"> <div className="p-2.5 rounded-2xl bg-amber-400/25 dark:bg-white/15 text-amber-700 dark:text-white backdrop-blur-sm">
<Hammer className="h-7 w-7" /> <Hammer className="h-7 w-7" />
</div> </div>
<span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-black/20 dark:bg-black/25 text-amber-100"> <span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-amber-200 dark:bg-black/25 text-amber-800 dark:text-amber-100">
Passo 1 Passo 1
</span> </span>
</div> </div>
@@ -79,7 +85,7 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<div className="text-lg sm:text-xl font-black tracking-tight leading-tight"> <div className="text-lg sm:text-xl font-black tracking-tight leading-tight">
1. PRODUÇÃO 1. PRODUÇÃO
</div> </div>
<div className="text-xs text-amber-100 font-medium opacity-90 mt-0.5"> <div className="text-xs text-amber-600 dark:text-amber-100 font-medium opacity-90 mt-0.5">
Corte, Dobra, Solda, Pintura... Corte, Dobra, Solda, Pintura...
</div> </div>
</div> </div>
@@ -89,13 +95,19 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<button <button
type="button" type="button"
onClick={() => handleAcao('embarque')} onClick={() => handleAcao('embarque')}
className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl bg-gradient-to-br from-blue-600 to-blue-700 hover:from-blue-500 hover:to-blue-600 active:from-blue-700 active:to-blue-800 text-white shadow-lg shadow-blue-900/20 dark:shadow-blue-950/40 border-2 border-blue-300/60 dark:border-blue-400/40 flex flex-col justify-between text-left transition-all active:scale-[0.97] group" className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl
bg-blue-50 hover:bg-blue-100 active:bg-blue-100
dark:bg-gradient-to-br dark:from-blue-600 dark:to-blue-700 dark:hover:from-blue-500 dark:hover:to-blue-600
border-2 border-blue-500 dark:border-blue-400/40
shadow-md shadow-blue-200/60 dark:shadow-blue-950/40
text-blue-800 dark:text-white
flex flex-col justify-between text-left transition-all active:scale-[0.97] group"
> >
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full">
<div className="p-2.5 rounded-2xl bg-white/20 dark:bg-white/15 text-white backdrop-blur-sm"> <div className="p-2.5 rounded-2xl bg-blue-400/20 dark:bg-white/15 text-blue-700 dark:text-white backdrop-blur-sm">
<Truck className="h-7 w-7" /> <Truck className="h-7 w-7" />
</div> </div>
<span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-black/20 dark:bg-black/25 text-blue-100"> <span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-blue-200 dark:bg-black/25 text-blue-800 dark:text-blue-100">
Passo 2 Passo 2
</span> </span>
</div> </div>
@@ -103,7 +115,7 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<div className="text-lg sm:text-xl font-black tracking-tight leading-tight"> <div className="text-lg sm:text-xl font-black tracking-tight leading-tight">
2. EMBARQUE 2. EMBARQUE
</div> </div>
<div className="text-xs text-blue-100 font-medium opacity-90 mt-0.5"> <div className="text-xs text-blue-600 dark:text-blue-100 font-medium opacity-90 mt-0.5">
Romaneios e saída da fábrica Romaneios e saída da fábrica
</div> </div>
</div> </div>
@@ -113,13 +125,19 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<button <button
type="button" type="button"
onClick={() => handleAcao('montagem')} onClick={() => handleAcao('montagem')}
className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl bg-gradient-to-br from-emerald-600 to-emerald-700 hover:from-emerald-500 hover:to-emerald-600 active:from-emerald-700 active:to-emerald-800 text-white shadow-lg shadow-emerald-900/20 dark:shadow-emerald-950/40 border-2 border-emerald-300/60 dark:border-emerald-400/40 flex flex-col justify-between text-left transition-all active:scale-[0.97] group" className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl
bg-emerald-50 hover:bg-emerald-100 active:bg-emerald-100
dark:bg-gradient-to-br dark:from-emerald-600 dark:to-emerald-700 dark:hover:from-emerald-500 dark:hover:to-emerald-600
border-2 border-emerald-500 dark:border-emerald-400/40
shadow-md shadow-emerald-200/60 dark:shadow-emerald-950/40
text-emerald-800 dark:text-white
flex flex-col justify-between text-left transition-all active:scale-[0.97] group"
> >
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full">
<div className="p-2.5 rounded-2xl bg-white/20 dark:bg-white/15 text-white backdrop-blur-sm"> <div className="p-2.5 rounded-2xl bg-emerald-400/20 dark:bg-white/15 text-emerald-700 dark:text-white backdrop-blur-sm">
<PackageCheck className="h-7 w-7" /> <PackageCheck className="h-7 w-7" />
</div> </div>
<span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-black/20 dark:bg-black/25 text-emerald-100"> <span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-emerald-200 dark:bg-black/25 text-emerald-800 dark:text-emerald-100">
Passo 3 Passo 3
</span> </span>
</div> </div>
@@ -127,7 +145,7 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<div className="text-lg sm:text-xl font-black tracking-tight leading-tight"> <div className="text-lg sm:text-xl font-black tracking-tight leading-tight">
3. MONTAGEM 3. MONTAGEM
</div> </div>
<div className="text-xs text-emerald-100 font-medium opacity-90 mt-0.5"> <div className="text-xs text-emerald-600 dark:text-emerald-100 font-medium opacity-90 mt-0.5">
Conferência e avanço na obra Conferência e avanço na obra
</div> </div>
</div> </div>
@@ -137,21 +155,27 @@ export const SmartHub: React.FC<SmartHubProps> = ({
<button <button
type="button" type="button"
onClick={() => handleAcao('consulta')} onClick={() => handleAcao('consulta')}
className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl bg-gradient-to-br from-purple-600 to-purple-700 hover:from-purple-500 hover:to-purple-600 active:from-purple-700 active:to-purple-800 text-white shadow-lg shadow-purple-900/20 dark:shadow-purple-950/40 border-2 border-purple-300/60 dark:border-purple-400/40 flex flex-col justify-between text-left transition-all active:scale-[0.97] group" className="min-h-[110px] sm:min-h-[125px] p-4 rounded-3xl
bg-purple-50 hover:bg-purple-100 active:bg-purple-100
dark:bg-gradient-to-br dark:from-purple-600 dark:to-purple-700 dark:hover:from-purple-500 dark:hover:to-purple-600
border-2 border-purple-500 dark:border-purple-400/40
shadow-md shadow-purple-200/60 dark:shadow-purple-950/40
text-purple-800 dark:text-white
flex flex-col justify-between text-left transition-all active:scale-[0.97] group"
> >
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full">
<div className="p-2.5 rounded-2xl bg-white/20 dark:bg-white/15 text-white backdrop-blur-sm"> <div className="p-2.5 rounded-2xl bg-purple-400/20 dark:bg-white/15 text-purple-700 dark:text-white backdrop-blur-sm">
<Search className="h-7 w-7" /> <Search className="h-7 w-7" />
</div> </div>
<span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-black/20 dark:bg-black/25 text-purple-100"> <span className="text-[11px] font-black uppercase tracking-wider px-2 py-0.5 rounded-full bg-purple-200 dark:bg-black/25 text-purple-800 dark:text-purple-100">
Info Info
</span> </span>
</div> </div>
<div> <div>
<div className="text-lg sm:text-xl font-black tracking-tight leading-tight"> <div className="text-lg sm:text-xl font-black tracking-tight leading-tight">
4. PEÇAS & PDF 4. PEÇAS &amp; PDF
</div> </div>
<div className="text-xs text-purple-100 font-medium opacity-90 mt-0.5"> <div className="text-xs text-purple-600 dark:text-purple-100 font-medium opacity-90 mt-0.5">
Status da peça e relatórios Status da peça e relatórios
</div> </div>
</div> </div>
@@ -70,18 +70,19 @@ export const calcularSaldoProcessoPeca = (
let qtdDisponivelParaEntrar = Number(peca.quantidade) || 0; let qtdDisponivelParaEntrar = Number(peca.quantidade) || 0;
let motivoBloqueio: string | null = null; let motivoBloqueio: string | null = null;
// REGRA 1: Peças sem montagem (S/M) não passam por Montagem nem por Solda // REGRA 1: Peças sem montagem (S/M) não passam por Solda
if (ehSemMontagem && (ehSolda || ehMontagem)) { // (Não existe processo "Montagem" de fábrica - a montagem é apenas na obra)
if (ehSemMontagem && ehSolda) {
qtdDisponivelParaEntrar = 0; qtdDisponivelParaEntrar = 0;
motivoBloqueio = 'Peça S/M (Pula Montagem e Solda)'; motivoBloqueio = 'Peça S/M (Pula Solda - vai direto para Pintura)';
} else if (indexAtual > 0) { } else if (indexAtual > 0) {
// REGRA 2: Encontrar processo anterior válido // REGRA 2: Encontrar processo anterior válido
let procAnteriorValido: ProcessoFabricacao | null = null; let procAnteriorValido: ProcessoFabricacao | null = null;
for (let i = indexAtual - 1; i >= 0; i--) { for (let i = indexAtual - 1; i >= 0; i--) {
const proc = procsOrdenados[i]; const proc = procsOrdenados[i];
const nomeP = proc.nome.toLowerCase(); const nomeP = proc.nome.toLowerCase();
// Se a peça for S/M, pula solda e montagem na busca do anterior (ex: Corte -> Pintura) // Se a peça for S/M, pula solda na busca do anterior (ex: Corte -> Pintura)
if (ehSemMontagem && (nomeP.includes('solda') || nomeP.includes('montag'))) { if (ehSemMontagem && nomeP.includes('solda')) {
continue; continue;
} }
procAnteriorValido = proc; procAnteriorValido = proc;
@@ -341,14 +342,13 @@ export const SmartProducaoFlow: React.FC<SmartProducaoFlowProps> = ({
<span>Carregando etapas...</span> <span>Carregando etapas...</span>
</div> </div>
) : processos.length === 0 ? ( ) : processos.length === 0 ? (
// Fallback com processos industriais padrões caso a tabela esteja vazia // Fallback com processos industriais corretos (ordem real de produção)
[ [
{ id: '1', nome: 'Corte', ordem: 1 }, { id: '1', nome: 'Corte', ordem: 1 },
{ id: '2', nome: 'Dobra / Furação', ordem: 2 }, { id: '2', nome: 'Dobra / Furação', ordem: 2 },
{ id: '3', nome: 'Montagem', ordem: 3 }, { id: '3', nome: 'Solda', ordem: 3 },
{ id: '4', nome: 'Solda', ordem: 4 }, { id: '4', nome: 'Pintura', ordem: 4 },
{ id: '5', nome: 'Pintura', ordem: 5 }, { id: '5', nome: 'Galvanização', ordem: 5 },
{ id: '6', nome: 'Galvanização', ordem: 6 },
].map((p) => ( ].map((p) => (
<button <button
key={p.id} key={p.id}
@@ -561,7 +561,7 @@ export const SmartProducaoFlow: React.FC<SmartProducaoFlowProps> = ({
{item.tem_componentes === false && ( {item.tem_componentes === false && (
<span <span
className="text-[10px] px-2 py-0.5 rounded-md bg-purple-100 text-purple-800 border border-purple-300 dark:bg-purple-950/80 dark:text-purple-300 dark:border-purple-800/50 font-black" className="text-[10px] px-2 py-0.5 rounded-md bg-purple-100 text-purple-800 border border-purple-300 dark:bg-purple-950/80 dark:text-purple-300 dark:border-purple-800/50 font-black"
title="Peça Sem Montagem (Pula Solda e Montagem)" title="Peça Sem Montagem (Pula Solda - vai direto para Pintura)"
> >
S/M S/M
</span> </span>