🚀 Auto-deploy: TrackSteel APP atualizado em 25/09/2026 16:49:48

This commit is contained in:
2026-09-25 16:49:48 -03:00
parent 8e64ad6042
commit 36d5902836
6 changed files with 371 additions and 184 deletions
+12
View File
@@ -15,6 +15,7 @@ import { FichaTecnicaPreview } from '@/components/forms/FichaTecnicaPreview';
import { useThemeConfig } from '@/hooks/useThemeConfig';
import { useFichaTecnica, FichaTecnicaData } from '@/hooks/useFichaTecnica';
import { useUserManagement } from '@/hooks/useUserManagement';
import { usePermissions } from '@/hooks/usePermissions';
interface InfoCalculoEstrutural {
e: boolean;
@@ -179,6 +180,7 @@ const CadastroOF = () => {
const { themeConfig } = useThemeConfig();
const { buscarFichaTecnica, salvarFichaTecnica, loading: fichaTecnicaLoading } = useFichaTecnica();
const { users } = useUserManagement();
const { canRegra } = usePermissions();
const [formData, setFormData] = useState<FormData>(initialFormData);
const [isSaving, setIsSaving] = useState(false);
@@ -288,6 +290,16 @@ const CadastroOF = () => {
return;
}
if (!isEditing && !canRegra('eng_criar_of')) {
toast.error('Atenção: Você não possui permissão para cadastrar novas Ordens de Fabricação.');
return;
}
if (isEditing && !canRegra('eng_editar_of')) {
toast.error('Atenção: Você não possui permissão para alterar dados desta Ordem de Fabricação.');
return;
}
setIsSaving(true);
try {
+34 -11
View File
@@ -13,6 +13,8 @@ import { useState, useEffect } from 'react';
import { useDiarioProducao, type RecursoProducao, type ApontamentoDiarioRecurso, type LoteSoldaDiario } from '@/hooks/useDiarioProducao';
import { useUserProfile } from '@/hooks/useUserProfile';
import { useFichaTecnica } from '@/hooks/useFichaTecnica';
import { usePermissions } from '@/hooks/usePermissions';
import { toast } from 'sonner';
interface DiarioData {
id?: string;
@@ -28,6 +30,7 @@ interface DiarioData {
}
const DiarioProducao = () => {
const { canRegra } = usePermissions();
const [activeTab, setActiveTab] = useState('diario');
const [selectedOF, setSelectedOF] = useState('');
const [showOFModal, setShowOFModal] = useState(false);
@@ -131,6 +134,12 @@ const DiarioProducao = () => {
const salvarDiarioCompleto = async () => {
try {
const hoje = new Date().toISOString().split('T')[0];
if (currentDiario.data < hoje && !canRegra('pcp_retroativo_permitido')) {
toast.error('Atenção: Você não possui permissão para apontar produção com data retroativa.');
return;
}
// 1. Salvar o diário principal
const diarioSalvo = await salvarDiario.mutateAsync({
data: currentDiario.data,
@@ -608,17 +617,31 @@ const DiarioProducao = () => {
<Button variant="ghost" size="sm">
<Edit className="h-4 w-4" />
</Button>
<Button variant="ghost" size="sm">
<Printer className="h-4 w-4" />
</Button>
<Button
variant="ghost"
size="sm"
onClick={() => diario.id && deletarDiario.mutate(diario.id)}
disabled={deletarDiario.isPending}
>
<Trash2 className="h-4 w-4 text-destructive" />
</Button>
{canRegra('pcp_exportar_relatorios') && (
<Button
variant="ghost"
size="sm"
title="Exportar/Imprimir Diário"
onClick={() => window.print()}
>
<Printer className="h-4 w-4" />
</Button>
)}
{canRegra('pcp_excluir_apontamento') && (
<Button
variant="ghost"
size="sm"
title="Excluir Diário"
onClick={() => {
if (confirm('Tem certeza que deseja excluir este diário de produção?')) {
diario.id && deletarDiario.mutate(diario.id);
}
}}
disabled={deletarDiario.isPending}
>
<Trash2 className="h-4 w-4 text-destructive" />
</Button>
)}
</div>
</td>
</tr>
+14 -4
View File
@@ -29,8 +29,11 @@ import { useOFsAtivas } from '@/hooks/useOFsAtivas';
import { useMobileResponsive } from '@/hooks/useMobileResponsive';
import { RomaneioExpedicao } from '@/hooks/useRomaneios';
import { RelatoriosExpedicao } from '@/components/expedicao/RelatoriosExpedicao';
import { usePermissions } from '@/hooks/usePermissions';
import { toast } from 'sonner';
const Expedicao = () => {
const { canRegra } = usePermissions();
const { isMobile } = useMobileResponsive();
const { data: romaneios, isLoading, refetch } = useRomaneios();
const { data: ofsAtivas, isLoading: isLoadingOFs } = useOFsAtivas();
@@ -104,6 +107,11 @@ const Expedicao = () => {
};
const confirmDelete = async () => {
if (!canRegra('exp_cancelar_estornar')) {
toast.error('Atenção: Você não possui permissão para cancelar ou estornar romaneios de expedição.');
return;
}
if (romaneioToDelete) {
try {
await removerRomaneioMutation.mutateAsync(romaneioToDelete);
@@ -321,10 +329,12 @@ const Expedicao = () => {
</Sheet>
)}
<Button size={isMobile ? "sm" : "default"} onClick={() => setShowRomaneioForm(true)}>
<Plus className="w-4 h-4 mr-2" />
Novo Romaneio
</Button>
{canRegra('exp_criar_romaneio') && (
<Button size={isMobile ? "sm" : "default"} onClick={() => setShowRomaneioForm(true)}>
<Plus className="w-4 h-4 mr-2" />
Novo Romaneio
</Button>
)}
</div>
</div>