🚀 Auto-deploy: TrackSteel APP atualizado em 25/09/2026 16:49:48
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user