112 lines
4.0 KiB
JavaScript
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
|
|
};
|
|
};
|