import { API_BASE_URL } from '@/config'; import axios from 'axios'; import apiClient from '@/lib/api/axios-instance'; import { createHeaders } from '@/lib/api'; import { Leave, LeaveCreateRequest, LeaveUpdateRequest, LeaveStatusUpdateRequest, LeaveBalance } from '@/types'; class LeaveApi { private baseUrl = `/api/Leave`; async getAll(): Promise { try { console.log('LeaveApi: Fetching all leave records from', this.baseUrl); const response = await apiClient.get(this.baseUrl, { headers: createHeaders(true), withCredentials: false }); if (!response.data) { console.warn('LeaveApi: No data in response'); return []; } if (!Array.isArray(response.data)) { console.warn('LeaveApi: Response is not an array', response.data); return []; } console.log(`LeaveApi: Successfully fetched ${response.data.length} leave records`); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error('LeaveApi: Axios error fetching leave records:', error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response headers:', error.response.headers); console.error('LeaveApi: Response data:', error.response.data); } else if (error.request) { console.error('LeaveApi: No response received from server'); } else { console.error('LeaveApi: Error setting up request:', error.message); } if (error.message.includes('Network Error') || error.message.includes('CORS')) { console.error('LeaveApi: Possible CORS issue - check server CORS configuration'); } } else { console.error('LeaveApi: Unknown error fetching leave records:', error); } return []; } } async getById(id: number): Promise { try { console.log(`LeaveApi: Fetching leave record with ID ${id}`); const response = await apiClient.get(`${this.baseUrl}/${id}`); console.log(`LeaveApi: Successfully fetched leave record with ID ${id}`); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Error fetching leave record ${id}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); } } else { console.error(`LeaveApi: Unknown error fetching leave record ${id}:`, error); } return null; } } async getByEmployeeId(employeeId: number): Promise { try { console.log(`LeaveApi: Fetching leaves for employee ${employeeId}`); const response = await apiClient.get(`${this.baseUrl}/employee/${employeeId}`); console.log(`LeaveApi: Successfully fetched ${response.data?.length || 0} leaves for employee ${employeeId}`); return response.data || []; } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Error fetching leaves for employee ${employeeId}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response headers:', error.response.headers); console.error('LeaveApi: Response data:', error.response.data); } else if (error.request) { console.error('LeaveApi: No response received from server'); } else { console.error('LeaveApi: Error setting up request:', error.message); } if (error.message.includes('Network Error') || error.message.includes('CORS')) { console.error('LeaveApi: Possible CORS issue - check server CORS configuration'); } } else { console.error(`LeaveApi: Unknown error fetching leaves for employee ${employeeId}:`, error); } return []; } } async getByDateRange(startDate: string, endDate: string): Promise { try { const response = await apiClient.get(`${this.baseUrl}/range?startDate=${startDate}&endDate=${endDate}`); return response.data || []; } catch (error) { console.error(`Error fetching leaves for date range ${startDate} to ${endDate}:`, error); return []; } } async getPendingApprovals(): Promise { try { const response = await apiClient.get(`${this.baseUrl}/pending`); return response.data || []; } catch (error) { console.error('Error fetching pending leave approvals:', error); return []; } } async getLeaveBalance(employeeId: number, year: number): Promise { try { console.log(`LeaveApi: Fetching leave balance for employee ${employeeId} and year ${year}`); const response = await apiClient.get(`${this.baseUrl}Balance/employee/${employeeId}/year/${year}`); console.log(`LeaveApi: Successfully fetched leave balance for employee ${employeeId}`); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Error fetching leave balance for employee ${employeeId}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response data:', error.response.data); } else if (error.request) { console.error('LeaveApi: No response received from server'); } else { console.error('LeaveApi: Error setting up request:', error.message); } } else { console.error(`LeaveApi: Unknown error fetching leave balance for employee ${employeeId}:`, error); } return null; } } async create(leave: LeaveCreateRequest): Promise { try { console.log('LeaveApi: Creating new leave record', leave); // Ensure required fields are set according to API spec const leaveRequest = { id: leave.id || 0, employeeId: leave.employeeId, leaveMasterId: leave.leaveMasterId || 5, // Default to a common leave type if not specified startDate: leave.startDate, endDate: leave.endDate, reason: leave.reason, status: leave.status || 'Pending', appliedOn: leave.appliedOn || new Date().toISOString(), comments: leave.comments || '', documents: leave.documents || '', halfDay: leave.halfDay || false, halfDayPortion: leave.halfDayPortion || 'first', // Default to first half if not specified workingDays: leave.workingDays || 0, compOff: leave.compOff || false }; console.log('LeaveApi: Formatted request', leaveRequest); const response = await apiClient.post(this.baseUrl, leaveRequest, { headers: createHeaders(true), withCredentials: false }); console.log('LeaveApi: Successfully created leave record', response.data); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error('LeaveApi: Error creating leave record:', error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response data:', error.response.data); } } else { console.error('LeaveApi: Unknown error creating leave record:', error); } throw error; } } async update(id: number, leave: LeaveUpdateRequest): Promise { try { console.log(`LeaveApi: Updating leave record ${id}`, leave); // Ensure halfDayPortion is included in the update request if halfDay is true const updateRequest = { ...leave, halfDayPortion: leave.halfDay ? (leave.halfDayPortion || 'first') : undefined }; const response = await apiClient.put(`${this.baseUrl}/${id}`, updateRequest); console.log(`LeaveApi: Successfully updated leave record ${id}`, response.data); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Error updating leave record ${id}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response data:', error.response.data); } } else { console.error(`LeaveApi: Unknown error updating leave record ${id}:`, error); } throw error; } } async updateStatus(statusUpdate: LeaveStatusUpdateRequest): Promise { try { console.log(`LeaveApi: Updating leave status for ID ${statusUpdate.id} to ${statusUpdate.status}`); // For status updates, we'll use the regular update endpoint const leaveToUpdate = await this.getById(statusUpdate.id); if (!leaveToUpdate) { throw new Error(`Leave record with ID ${statusUpdate.id} not found`); } const updatedLeave = { ...leaveToUpdate, status: statusUpdate.status, comments: statusUpdate.comments || leaveToUpdate.comments, approvedById: statusUpdate.approvedById || statusUpdate.approverId, approvedOn: new Date().toISOString() }; const response = await apiClient.put(`${this.baseUrl}/${statusUpdate.id}`, updatedLeave); console.log('LeaveApi: Status update successful', response.data); return response.data; } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Axios error updating leave status for record ${statusUpdate.id}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response headers:', error.response.headers); console.error('LeaveApi: Response data:', error.response.data); } else if (error.request) { console.error('LeaveApi: No response received from server'); } else { console.error('LeaveApi: Error setting up request:', error.message); } if (error.message.includes('Network Error') || error.message.includes('CORS')) { console.error('LeaveApi: Possible CORS issue - check server CORS configuration'); } } else { console.error(`LeaveApi: Unknown error updating leave status for record ${statusUpdate.id}:`, error); } throw error; } } async delete(id: number): Promise { try { console.log(`LeaveApi: Deleting leave record ${id}`); await apiClient.delete(`${this.baseUrl}/${id}`); console.log(`LeaveApi: Successfully deleted leave record ${id}`); } catch (error) { if (apiClient.isAxiosError(error)) { console.error(`LeaveApi: Error deleting leave record ${id}:`, error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); } } else { console.error(`LeaveApi: Unknown error deleting leave record ${id}:`, error); } throw error; } } async uploadDocument(leaveId: number, file: File): Promise { try { console.log(`LeaveApi: Uploading document for leave ${leaveId}`); const formData = new FormData(); formData.append('file', file); const response = await apiClient.post(`${this.baseUrl}/${leaveId}/document`, formData); console.log(`LeaveApi: Successfully uploaded document for leave ${leaveId}`); return response.data.documentUrl; } catch (error) { console.error(`LeaveApi: Error uploading document for leave ${leaveId}:`, error); throw error; } } async getAllLeavesToday(): Promise { try { console.log('LeaveApi: Fetching all leaves for today'); const response = await apiClient.get(`${this.baseUrl}/GetAllLeavesToday`); console.log(`LeaveApi: Successfully fetched ${response.data?.length || 0} leaves for today`); return response.data || []; } catch (error) { if (apiClient.isAxiosError(error)) { console.error('LeaveApi: Error fetching leaves for today:', error.message); if (error.response) { console.error('LeaveApi: Response status:', error.response.status); console.error('LeaveApi: Response data:', error.response.data); } } else { console.error('LeaveApi: Unknown error fetching leaves for today:', error); } return []; } } } export const leaveApi = new LeaveApi();