fix(lints): resolve all ESLint warnings and any type errors in SeletorItensOtimizado and hooks
This commit is contained in:
@@ -28,6 +28,25 @@ interface ItemDisponivel {
|
|||||||
processo_atual_permitido: number;
|
processo_atual_permitido: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ComponenteItemData {
|
||||||
|
id: string;
|
||||||
|
marca_componente: string;
|
||||||
|
perfil?: string;
|
||||||
|
peso_unitario?: number;
|
||||||
|
quantidade_por_peca?: number;
|
||||||
|
descricao?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ApontamentoPecaRecord {
|
||||||
|
id: string;
|
||||||
|
quantidade_produzida: number;
|
||||||
|
data_apontamento?: string;
|
||||||
|
created_at: string;
|
||||||
|
usuario_id?: string;
|
||||||
|
processo?: { nome?: string; ordem?: number } | null;
|
||||||
|
peca?: { marca?: string; of_number?: string } | null;
|
||||||
|
}
|
||||||
|
|
||||||
interface SeletorItensOtimizadoProps {
|
interface SeletorItensOtimizadoProps {
|
||||||
pecasDisponiveis?: ItemDisponivel[];
|
pecasDisponiveis?: ItemDisponivel[];
|
||||||
componentesDisponiveis?: ItemDisponivel[];
|
componentesDisponiveis?: ItemDisponivel[];
|
||||||
@@ -36,12 +55,13 @@ interface SeletorItensOtimizadoProps {
|
|||||||
onBatchSelect?: (items: ItemDisponivel[], tipo: 'peca' | 'componente') => Promise<void>;
|
onBatchSelect?: (items: ItemDisponivel[], tipo: 'peca' | 'componente') => Promise<void>;
|
||||||
loading?: boolean;
|
loading?: boolean;
|
||||||
onSelectPeca?: (peca: PecaWithComponents) => void;
|
onSelectPeca?: (peca: PecaWithComponents) => void;
|
||||||
onSelectComponente?: (componente: any) => void;
|
onSelectComponente?: (componente: ComponenteItemData) => void;
|
||||||
pecaId?: string | null;
|
pecaId?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PecaWithComponents extends Peca {
|
interface PecaWithComponents extends Peca {
|
||||||
componentes?: any[];
|
componentes?: ComponenteItemData[];
|
||||||
|
processo_atual_permitido?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
||||||
@@ -61,14 +81,14 @@ export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
|||||||
const [pecasFiltradas, setPecasFiltradas] = useState<PecaWithComponents[]>([]);
|
const [pecasFiltradas, setPecasFiltradas] = useState<PecaWithComponents[]>([]);
|
||||||
const [loadingPecas, setLoadingPecas] = useState(false);
|
const [loadingPecas, setLoadingPecas] = useState(false);
|
||||||
const [loadingComponentes, setLoadingComponentes] = useState(false);
|
const [loadingComponentes, setLoadingComponentes] = useState(false);
|
||||||
const [componentes, setComponentes] = useState<any[]>([]);
|
const [componentes, setComponentes] = useState<ComponenteItemData[]>([]);
|
||||||
const [showComponentes, setShowComponentes] = useState(false);
|
const [showComponentes, setShowComponentes] = useState(false);
|
||||||
const inputRef = useRef<HTMLInputElement>(null);
|
const inputRef = useRef<HTMLInputElement>(null);
|
||||||
|
|
||||||
// Estados para funcionalidade administrativa
|
// Estados para funcionalidade administrativa
|
||||||
const [showAdminModal, setShowAdminModal] = useState(false);
|
const [showAdminModal, setShowAdminModal] = useState(false);
|
||||||
const [selectedPecaForAdmin, setSelectedPecaForAdmin] = useState<ItemDisponivel | null>(null);
|
const [selectedPecaForAdmin, setSelectedPecaForAdmin] = useState<ItemDisponivel | null>(null);
|
||||||
const [apontamentosPeca, setApontamentosPeca] = useState<any[]>([]);
|
const [apontamentosPeca, setApontamentosPeca] = useState<ApontamentoPecaRecord[]>([]);
|
||||||
const [loadingApontamentos, setLoadingApontamentos] = useState(false);
|
const [loadingApontamentos, setLoadingApontamentos] = useState(false);
|
||||||
|
|
||||||
const { isAdmin } = useUserRole();
|
const { isAdmin } = useUserRole();
|
||||||
@@ -158,18 +178,6 @@ export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
|||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (onSelectPeca) {
|
|
||||||
fetchPecas(debouncedSearchTerm);
|
|
||||||
}
|
|
||||||
}, [debouncedSearchTerm, fetchPecas, onSelectPeca]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (pecaId && onSelectComponente) {
|
|
||||||
loadComponentes(pecaId);
|
|
||||||
}
|
|
||||||
}, [pecaId, onSelectComponente]);
|
|
||||||
|
|
||||||
const loadComponentes = useCallback(async (pecaId: string) => {
|
const loadComponentes = useCallback(async (pecaId: string) => {
|
||||||
try {
|
try {
|
||||||
setLoadingComponentes(true);
|
setLoadingComponentes(true);
|
||||||
@@ -184,6 +192,18 @@ export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
|||||||
}
|
}
|
||||||
}, [fetchComponentesPeca]);
|
}, [fetchComponentesPeca]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (onSelectPeca) {
|
||||||
|
fetchPecas(debouncedSearchTerm);
|
||||||
|
}
|
||||||
|
}, [debouncedSearchTerm, fetchPecas, onSelectPeca]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (pecaId && onSelectComponente) {
|
||||||
|
loadComponentes(pecaId);
|
||||||
|
}
|
||||||
|
}, [pecaId, onSelectComponente, loadComponentes]);
|
||||||
|
|
||||||
const handlePecaSelect = useCallback((peca: PecaWithComponents) => {
|
const handlePecaSelect = useCallback((peca: PecaWithComponents) => {
|
||||||
if (onSelectPeca) {
|
if (onSelectPeca) {
|
||||||
onSelectPeca(peca);
|
onSelectPeca(peca);
|
||||||
@@ -194,13 +214,13 @@ export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
|||||||
descricao: peca.descricao || '',
|
descricao: peca.descricao || '',
|
||||||
tipo: 'peca',
|
tipo: 'peca',
|
||||||
quantidade_disponivel: peca.quantidadeDisponivel || 0,
|
quantidade_disponivel: peca.quantidadeDisponivel || 0,
|
||||||
processo_atual_permitido: (peca as any).processo_atual_permitido || 0
|
processo_atual_permitido: peca.processo_atual_permitido || 0
|
||||||
};
|
};
|
||||||
onItemSelect(itemDisponivel);
|
onItemSelect(itemDisponivel);
|
||||||
}
|
}
|
||||||
}, [onSelectPeca, onItemSelect]);
|
}, [onSelectPeca, onItemSelect]);
|
||||||
|
|
||||||
const handleComponenteSelect = useCallback((componente: any) => {
|
const handleComponenteSelect = useCallback((componente: ComponenteItemData) => {
|
||||||
if (onSelectComponente) {
|
if (onSelectComponente) {
|
||||||
onSelectComponente(componente);
|
onSelectComponente(componente);
|
||||||
}
|
}
|
||||||
@@ -601,7 +621,7 @@ export const SeletorItensOtimizado: React.FC<SeletorItensOtimizadoProps> = ({
|
|||||||
{apontamentosPeca.map((apontamento, index) => (
|
{apontamentosPeca.map((apontamento, index) => (
|
||||||
<div key={apontamento.id || index} className="bg-slate-800 p-3 rounded border border-slate-600">
|
<div key={apontamento.id || index} className="bg-slate-800 p-3 rounded border border-slate-600">
|
||||||
<div className="grid grid-cols-2 gap-2 text-sm">
|
<div className="grid grid-cols-2 gap-2 text-sm">
|
||||||
<div><span className="text-slate-400">Processo:</span> <span className="text-blue-300">{apontamento.processos?.nome || 'N/A'}</span></div>
|
<div><span className="text-slate-400">Processo:</span> <span className="text-blue-300">{apontamento.processo?.nome || 'N/A'}</span></div>
|
||||||
<div><span className="text-slate-400">Quantidade:</span> <span className="text-green-400">{apontamento.quantidade_produzida}</span></div>
|
<div><span className="text-slate-400">Quantidade:</span> <span className="text-green-400">{apontamento.quantidade_produzida}</span></div>
|
||||||
<div><span className="text-slate-400">Data:</span> <span className="text-slate-300">{new Date(apontamento.created_at).toLocaleString('pt-BR')}</span></div>
|
<div><span className="text-slate-400">Data:</span> <span className="text-slate-300">{new Date(apontamento.created_at).toLocaleString('pt-BR')}</span></div>
|
||||||
<div><span className="text-slate-400">Usuário:</span> <span className="text-slate-300">{apontamento.usuario_id}</span></div>
|
<div><span className="text-slate-400">Usuário:</span> <span className="text-slate-300">{apontamento.usuario_id}</span></div>
|
||||||
|
|||||||
@@ -216,6 +216,7 @@ export const useApontamentoDiarioChart = (periodo: PeriodoType) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchData();
|
fetchData();
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [periodo]);
|
}, [periodo]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ export const useDashboardProducao = (ofNumber: string) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchDashboardData();
|
fetchDashboardData();
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [ofNumber]);
|
}, [ofNumber]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ export const useRelatorioDiario = (selectedDate: string) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchApontamentos();
|
fetchApontamentos();
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [selectedDate]);
|
}, [selectedDate]);
|
||||||
|
|
||||||
// Calcular resumo por processo
|
// Calcular resumo por processo
|
||||||
|
|||||||
@@ -163,15 +163,33 @@ export const useValidacaoSequencialProcessos = () => {
|
|||||||
return { valido: true };
|
return { valido: true };
|
||||||
}, [historico, processos]);
|
}, [historico, processos]);
|
||||||
|
|
||||||
|
// Função auxiliar para calcular quantidade disponível do processo anterior
|
||||||
|
const calcularQuantidadeDisponivelProcessoAnterior = useCallback(async (
|
||||||
|
marcaItem: string,
|
||||||
|
ordemProcessoAnterior: number,
|
||||||
|
ofNumber: string,
|
||||||
|
tipoItem: 'peca' | 'componente'
|
||||||
|
): Promise<number> => {
|
||||||
|
const processoAnterior = processos.find(p => p.ordem === ordemProcessoAnterior);
|
||||||
|
if (!processoAnterior) return 0;
|
||||||
|
|
||||||
|
return await buscarQuantidadeProcessada(
|
||||||
|
marcaItem,
|
||||||
|
processoAnterior.id,
|
||||||
|
ofNumber,
|
||||||
|
tipoItem
|
||||||
|
);
|
||||||
|
}, [processos, buscarQuantidadeProcessada]);
|
||||||
|
|
||||||
// Calcular itens disponíveis para um processo específico
|
// Calcular itens disponíveis para um processo específico
|
||||||
const calcularItensDisponiveis = useCallback(async (
|
const calcularItensDisponiveis = useCallback(async (
|
||||||
ofNumber: string,
|
ofNumber: string,
|
||||||
processoId: string,
|
processoId: string,
|
||||||
pecas: any[],
|
pecas: Record<string, unknown>[],
|
||||||
componentes: any[]
|
componentes: Record<string, unknown>[]
|
||||||
): Promise<{
|
): Promise<{
|
||||||
pecasDisponiveis: any[];
|
pecasDisponiveis: Record<string, unknown>[];
|
||||||
componentesDisponiveis: any[];
|
componentesDisponiveis: Record<string, unknown>[];
|
||||||
}> => {
|
}> => {
|
||||||
const processoAtual = processos.find(p => p.id === processoId);
|
const processoAtual = processos.find(p => p.id === processoId);
|
||||||
if (!processoAtual) {
|
if (!processoAtual) {
|
||||||
@@ -179,28 +197,31 @@ export const useValidacaoSequencialProcessos = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ordemAtual = processoAtual.ordem;
|
const ordemAtual = processoAtual.ordem;
|
||||||
const pecasDisponiveis: any[] = [];
|
const pecasDisponiveis: Record<string, unknown>[] = [];
|
||||||
const componentesDisponiveis: any[] = [];
|
const componentesDisponiveis: Record<string, unknown>[] = [];
|
||||||
|
|
||||||
// Processar peças
|
// Processar peças
|
||||||
for (const peca of pecas) {
|
for (const peca of pecas) {
|
||||||
|
const marcaPeca = String(peca.marca || '');
|
||||||
|
const qtdPeca = Number(peca.quantidade || 0);
|
||||||
|
|
||||||
if (ordemAtual === 1) {
|
if (ordemAtual === 1) {
|
||||||
// Primeiro processo: todas as peças estão disponíveis
|
// Primeiro processo: todas as peças estão disponíveis
|
||||||
pecasDisponiveis.push({
|
pecasDisponiveis.push({
|
||||||
...peca,
|
...peca,
|
||||||
quantidade_disponivel: peca.quantidade || 0
|
quantidade_disponivel: qtdPeca
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Calcular quantidade disponível baseada no processo anterior
|
// Calcular quantidade disponível baseada no processo anterior
|
||||||
const quantidadeProcessadaAnterior = await calcularQuantidadeDisponivelProcessoAnterior(
|
const quantidadeProcessadaAnterior = await calcularQuantidadeDisponivelProcessoAnterior(
|
||||||
peca.marca,
|
marcaPeca,
|
||||||
ordemAtual - 1,
|
ordemAtual - 1,
|
||||||
ofNumber,
|
ofNumber,
|
||||||
'peca'
|
'peca'
|
||||||
);
|
);
|
||||||
|
|
||||||
const quantidadeJaProcessadaAtual = await buscarQuantidadeProcessada(
|
const quantidadeJaProcessadaAtual = await buscarQuantidadeProcessada(
|
||||||
peca.marca,
|
marcaPeca,
|
||||||
processoId,
|
processoId,
|
||||||
ofNumber,
|
ofNumber,
|
||||||
'peca'
|
'peca'
|
||||||
@@ -219,23 +240,26 @@ export const useValidacaoSequencialProcessos = () => {
|
|||||||
|
|
||||||
// Processar componentes
|
// Processar componentes
|
||||||
for (const componente of componentes) {
|
for (const componente of componentes) {
|
||||||
|
const marcaComp = String(componente.marca_componente || '');
|
||||||
|
const qtdComp = Number(componente.quantidade_total || 0);
|
||||||
|
|
||||||
if (ordemAtual === 1) {
|
if (ordemAtual === 1) {
|
||||||
// Primeiro processo: todos os componentes estão disponíveis
|
// Primeiro processo: todos os componentes estão disponíveis
|
||||||
componentesDisponiveis.push({
|
componentesDisponiveis.push({
|
||||||
...componente,
|
...componente,
|
||||||
quantidade_disponivel: componente.quantidade_total || 0
|
quantidade_disponivel: qtdComp
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Calcular quantidade disponível baseada no processo anterior
|
// Calcular quantidade disponível baseada no processo anterior
|
||||||
const quantidadeProcessadaAnterior = await calcularQuantidadeDisponivelProcessoAnterior(
|
const quantidadeProcessadaAnterior = await calcularQuantidadeDisponivelProcessoAnterior(
|
||||||
componente.marca_componente,
|
marcaComp,
|
||||||
ordemAtual - 1,
|
ordemAtual - 1,
|
||||||
ofNumber,
|
ofNumber,
|
||||||
'componente'
|
'componente'
|
||||||
);
|
);
|
||||||
|
|
||||||
const quantidadeJaProcessadaAtual = await buscarQuantidadeProcessada(
|
const quantidadeJaProcessadaAtual = await buscarQuantidadeProcessada(
|
||||||
componente.marca_componente,
|
marcaComp,
|
||||||
processoId,
|
processoId,
|
||||||
ofNumber,
|
ofNumber,
|
||||||
'componente'
|
'componente'
|
||||||
@@ -253,25 +277,7 @@ export const useValidacaoSequencialProcessos = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return { pecasDisponiveis, componentesDisponiveis };
|
return { pecasDisponiveis, componentesDisponiveis };
|
||||||
}, [processos, buscarQuantidadeProcessada]);
|
}, [processos, buscarQuantidadeProcessada, calcularQuantidadeDisponivelProcessoAnterior]);
|
||||||
|
|
||||||
// Função auxiliar para calcular quantidade disponível do processo anterior
|
|
||||||
const calcularQuantidadeDisponivelProcessoAnterior = async (
|
|
||||||
marcaItem: string,
|
|
||||||
ordemProcessoAnterior: number,
|
|
||||||
ofNumber: string,
|
|
||||||
tipoItem: 'peca' | 'componente'
|
|
||||||
): Promise<number> => {
|
|
||||||
const processoAnterior = processos.find(p => p.ordem === ordemProcessoAnterior);
|
|
||||||
if (!processoAnterior) return 0;
|
|
||||||
|
|
||||||
return await buscarQuantidadeProcessada(
|
|
||||||
marcaItem,
|
|
||||||
processoAnterior.id,
|
|
||||||
ofNumber,
|
|
||||||
tipoItem
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
historico,
|
historico,
|
||||||
|
|||||||
Reference in New Issue
Block a user