testes/src/features/rh/hooks/useExperienceContracts.js

112 lines
4.0 KiB
JavaScript

import { useState, useCallback, useMemo } from 'react';
import { rhExperienceContractService } from '../services/rhExperienceContractService';
import { toast } from 'sonner';
/**
* Hook para gerenciar contratos de experiência do RH.
*/
export const useExperienceContracts = () => {
const [contracts, setContracts] = useState([]);
const [stats, setStats] = useState(null);
const [loading, setLoading] = useState(false);
const [viewMode, setViewMode] = useState('registros'); // 'registros', 'dashboards'
const [displayMode, setDisplayMode] = useState('kanban'); // 'kanban', 'tabela'
const [filters, setFilters] = useState({
search: '',
empresa: ''
});
const fetchContracts = useCallback(async () => {
setLoading(true);
try {
const response = await rhExperienceContractService.getContracts();
const data = response?.dados || response?.Base_Dados_API || response || [];
setContracts(Array.isArray(data) ? data : []);
} catch (error) {
console.error('Erro ao buscar contratos:', error);
toast.error('Erro ao carregar contratos de experiência.');
} finally {
setLoading(false);
}
}, []);
const fetchStatistics = useCallback(async (empresa) => {
try {
const response = await rhExperienceContractService.getStatistics(empresa ? { empresa } : {});
// Preserva a estrutura completa: { experiencia, prorrogacao, resumo }
const data = response?.dados || response?.Base_Dados_API || response;
setStats(data || null);
} catch (error) {
console.error('Erro ao buscar estatísticas:', error);
}
}, []);
const handleCreateContract = async (payload) => {
try {
await rhExperienceContractService.createContract(payload);
toast.success('Contrato criado com sucesso!');
fetchContracts();
return true;
} catch (error) {
console.error('Erro ao criar contrato:', error);
toast.error('Erro ao criar contrato.');
return false;
}
};
const handleUpdateContract = async (payload) => {
try {
await rhExperienceContractService.updateContract(payload);
toast.success('Contrato atualizado com sucesso!');
fetchContracts();
return true;
} catch (error) {
console.error('Erro ao atualizar contrato:', error);
toast.error('Erro ao atualizar contrato.');
return false;
}
};
const handleMoveCard = async (idcolaborador, newStatus) => {
try {
await rhExperienceContractService.updateGlobalStatus({
idcolaborador,
global_status: newStatus
});
// Update local state for immediate feedback if needed,
// or just refetch. Refetching is safer for data consistency.
fetchContracts();
} catch (error) {
console.error('Erro ao mover contrato:', error);
toast.error('Erro ao atualizar status do contrato.');
}
};
const filteredContracts = useMemo(() => {
return contracts.filter(c => {
const matchesSearch = (c.nome || c.nome_completo || '').toLowerCase().includes(filters.search.toLowerCase()) ||
(c.idcolaborador?.toString() || '').includes(filters.search);
const matchesEmpresa = !filters.empresa || c.empresa === filters.empresa;
return matchesSearch && matchesEmpresa;
});
}, [contracts, filters]);
return {
contracts: filteredContracts,
rawContracts: contracts,
stats,
loading,
viewMode,
setViewMode,
displayMode,
setDisplayMode,
filters,
setFilters: (newFilters) => setFilters(prev => ({ ...prev, ...newFilters })),
fetchContracts,
fetchStatistics,
handleCreateContract,
handleUpdateContract,
handleMoveCard
};
};