pmtool / src /services /leaveApi.ts
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
13 kB
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<Leave[]> {
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<Leave | null> {
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<Leave[]> {
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<Leave[]> {
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<Leave[]> {
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<LeaveBalance | null> {
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<Leave | null> {
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<Leave | null> {
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<Leave | null> {
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<void> {
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<string | null> {
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<Leave[]> {
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();