import axios from 'axios'; import { API_BASE_URL } from '../config'; import { AppraisalCycle, AppraisalCycleCreateRequest, AppraisalCycleUpdateRequest, Appraisal, AppraisalCreateRequest, AppraisalUpdateRequest, AssessmentArea, AssessmentAreaCreateRequest, AssessmentAreaUpdateRequest, RoleAssessmentQuestion, RoleAssessmentQuestionCreateRequest, RoleAssessmentQuestionUpdateRequest, AssessmentAnswer, AssessmentAnswerCreateRequest, AssessmentAnswerUpdateRequest, Competency, CompetencyCreateRequest, CompetencyUpdateRequest, CompetencyIndicator, CompetencyIndicatorCreateRequest, CompetencyIndicatorUpdateRequest, CompetencyRating, CompetencyRatingCreateRequest, CompetencyRatingUpdateRequest, TrainingNeed, TrainingNeedCreateRequest, TrainingNeedUpdateRequest, HrRemark, HrRemarkCreateRequest, HrRemarkUpdateRequest, ResponseData, ManagementRemark, ManagementRemarkCreateRequest, ManagementRemarkUpdateRequest, } from '../types'; // This should match other API calls in the codebase const BASE_URL = `${API_BASE_URL}/api`; // Appraisal Cycles export const getAppraisalCycles = async (): Promise> => { try { const apiUrl = `${BASE_URL}/AppraisalCycle`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); console.log("Raw API response:", response); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: [], success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // If response.data is an array, assume it's the cycles data if (Array.isArray(response.data)) { console.log("Response is an array, wrapping in success structure"); return { data: response.data as AppraisalCycle[], success: true }; } // If we reach here, we have data but it's in an unexpected format console.warn("API returned data in an unexpected format:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in getAppraisalCycles:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAppraisalCycleById = async (cycleId: number): Promise> => { try { const apiUrl = `${BASE_URL}/AppraisalCycle/${cycleId}`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); // Similar error handling as in getAppraisalCycles if (!response.data) { return { data: {} as AppraisalCycle, success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } // Assume response.data is the cycle object return { data: response.data as AppraisalCycle, success: true }; } catch (error) { console.error("Error in getAppraisalCycleById:", error); return { data: {} as AppraisalCycle, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const createAppraisalCycle = async (cycle: AppraisalCycleCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/AppraisalCycle`, cycle); return response.data; }; export const updateAppraisalCycle = async (cycle: AppraisalCycleUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/AppraisalCycle/${cycle.cycleId}`, cycle); return response.data; }; export const deleteAppraisalCycle = async (cycleId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/AppraisalCycle/${cycleId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Appraisals export const getAppraisals = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/Appraisal`); return response.data; }; export const getAppraisalById = async (appraisalId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/Appraisal/${appraisalId}`); return response.data; }; export const getAppraisalsByEmployeeId = async (employeeId: number): Promise> => { try { const apiUrl = `${BASE_URL}/Appraisal/employee/${employeeId}`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); console.log("My Appraisals API response:", response); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: [], success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // If response.data is an array, assume it's the appraisals data if (Array.isArray(response.data)) { console.log("Response is an array, wrapping in success structure"); return { data: response.data as Appraisal[], success: true }; } // If we reach here, we have data but it's in an unexpected format console.warn("API returned data in an unexpected format:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in getAppraisalsByEmployeeId:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAppraisalsByAppraiserId = async (appraiserId: number): Promise> => { const appraisals = await getAppraisals(); const filteredAppraisals = appraisals.data.filter(appraisal => appraisal.appraiserId === appraiserId); return { data: filteredAppraisals, success: true }; }; export const getAppraisalsByCycleId = async (cycleId: number): Promise> => { const appraisals = await getAppraisals(); const filteredAppraisals = appraisals.data.filter(appraisal => appraisal.cycleId === cycleId); return { data: filteredAppraisals, success: true }; }; export const createAppraisal = async (appraisal: AppraisalCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/Appraisal`, appraisal); return response.data; }; export const updateAppraisal = async (appraisal: AppraisalUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/Appraisal/${appraisal.appraisalId}`, appraisal); return response.data; }; export const deleteAppraisal = async (appraisalId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/Appraisal/${appraisalId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Assessment Areas export const getAssessmentAreas = async (): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); console.log("Raw Assessment Areas API response:", response); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: [], success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // If response.data is an array, assume it's the areas data if (Array.isArray(response.data)) { console.log("Response is an array, wrapping in success structure"); return { data: response.data as AssessmentArea[], success: true }; } // If we reach here, we have data but it's in an unexpected format console.warn("API returned data in an unexpected format:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in getAssessmentAreas:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAssessmentAreaById = async (areaId: number): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea/${areaId}`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); // Check if response has data property if (!response.data) { return { data: {} as AssessmentArea, success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } // Assume response.data is the assessment area object return { data: response.data as AssessmentArea, success: true }; } catch (error) { console.error("Error in getAssessmentAreaById:", error); return { data: {} as AssessmentArea, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const createAssessmentArea = async (area: AssessmentAreaCreateRequest): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea`; console.log("Calling API: POST", apiUrl, area); const response = await axios.post(apiUrl, area); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.data as AssessmentArea, success: true }; } catch (error) { console.error("Error in createAssessmentArea:", error); return { data: {} as AssessmentArea, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateAssessmentArea = async (area: AssessmentAreaUpdateRequest): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea/${area.areaId}`; console.log("Calling API: PUT", apiUrl, area); const response = await axios.put(apiUrl, area); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.data as AssessmentArea, success: true }; } catch (error) { console.error("Error in updateAssessmentArea:", error); return { data: {} as AssessmentArea, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const deleteAssessmentArea = async (areaId: number): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea/${areaId}`; console.log("Calling API: DELETE", apiUrl); const response = await axios.delete(apiUrl); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.status === 200, success: response.status === 200 }; } catch (error) { console.error("Error in deleteAssessmentArea:", error); return { data: false, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; // Role Assessment Questions export const getRoleAssessmentQuestions = async (): Promise> => { try { const apiUrl = `${BASE_URL}/RoleAssessmentQuestion`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); console.log("Raw Role Assessment Questions API response:", response); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: [], success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // If response.data is an array, assume it's the questions data if (Array.isArray(response.data)) { console.log("Response is an array, wrapping in success structure"); return { data: response.data as RoleAssessmentQuestion[], success: true }; } // If we reach here, we have data but it's in an unexpected format console.warn("API returned data in an unexpected format:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in getRoleAssessmentQuestions:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getRoleAssessmentQuestionsByRoleId = async (roleId: number): Promise> => { const questions = await getRoleAssessmentQuestions(); const filteredQuestions = questions.data.filter(question => question.roleId === roleId); return { data: filteredQuestions, success: true }; }; export const getRoleAssessmentQuestionById = async (questionId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/RoleAssessmentQuestion/${questionId}`); return response.data; }; export const createRoleAssessmentQuestion = async ( questionData: RoleAssessmentQuestionCreateRequest ): Promise> => { try { const apiUrl = `${BASE_URL}/RoleAssessmentQuestion`; console.log("Calling API: POST", apiUrl, questionData); const response = await axios.post(apiUrl, questionData); console.log("Create Role Assessment Question API response:", response); if (!response.data) { console.error("API response is missing data"); return { data: null, success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // Assume the response.data is the created question return { data: response.data as RoleAssessmentQuestion, success: true }; } catch (error) { console.error("Error in createRoleAssessmentQuestion:", error); return { data: null, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateRoleAssessmentQuestion = async ( questionData: RoleAssessmentQuestionUpdateRequest ): Promise> => { const url = `${BASE_URL}/RoleAssessmentQuestion/${questionData.questionId}`; console.log("Calling API: PUT", url, questionData); try { const response = await axios.put>(url, questionData); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: {} as RoleAssessmentQuestion, success: false, message: "API response is missing data" }; } // Check if API response is in expected format if (response.data.success === undefined) { console.error("API response is not in expected format:", response.data); return { data: {} as RoleAssessmentQuestion, success: false, message: "API response is not in expected format" }; } return response.data; } catch (error) { console.error("Error updating role assessment question:", error); return { data: {} as RoleAssessmentQuestion, success: false, message: error instanceof Error ? error.message : "An unknown error occurred" }; } }; export const deleteRoleAssessmentQuestion = async (questionId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/RoleAssessmentQuestion/${questionId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Assessment Answers export const getAssessmentAnswers = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/AssessmentAnswer`); return response.data; }; export const getAssessmentAnswersByAppraisalId = async (appraisalId: number): Promise> => { const answers = await getAssessmentAnswers(); // Handle case when answers.data is undefined if (!answers.success || !answers.data) { console.warn("No assessment answers data available"); return { data: [], success: true }; } const filteredAnswers = answers.data.filter(answer => answer.appraisalId === appraisalId); return { data: filteredAnswers, success: true }; }; export const getAssessmentAnswerById = async (answerId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/AssessmentAnswer/${answerId}`); return response.data; }; export const createAssessmentAnswer = async (answer: AssessmentAnswerCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/AssessmentAnswer`, answer); return response.data; }; export const updateAssessmentAnswer = async (answer: AssessmentAnswerUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/AssessmentAnswer/${answer.answerId}`, answer); return response.data; }; export const deleteAssessmentAnswer = async (answerId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/AssessmentAnswer/${answerId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Competencies export const getCompetencies = async (): Promise> => { try { const apiUrl = `${BASE_URL}/Competency`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); console.log("Raw Competencies API response:", response); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: [], success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log("Response already in expected format:", response.data); return response.data as ResponseData; } // If response.data is an array, assume it's the competencies data if (Array.isArray(response.data)) { console.log("Response is an array, wrapping in success structure"); return { data: response.data as Competency[], success: true }; } // If we reach here, we have data but it's in an unexpected format console.warn("API returned data in an unexpected format:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in getCompetencies:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getCompetencyById = async (competencyId: number): Promise> => { try { const apiUrl = `${BASE_URL}/Competency/${competencyId}`; console.log("Calling API: GET", apiUrl); const response = await axios.get(apiUrl); // Check if response has data property if (!response.data) { return { data: {} as Competency, success: false, message: "API response is missing data" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } // Assume response.data is the competency object return { data: response.data as Competency, success: true }; } catch (error) { console.error("Error in getCompetencyById:", error); return { data: {} as Competency, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const createCompetency = async (competency: CompetencyCreateRequest): Promise> => { try { const apiUrl = `${BASE_URL}/Competency`; console.log("Calling API: POST", apiUrl, competency); const response = await axios.post(apiUrl, competency); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.data as Competency, success: true }; } catch (error) { console.error("Error in createCompetency:", error); return { data: {} as Competency, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateCompetency = async (competency: CompetencyUpdateRequest): Promise> => { try { const apiUrl = `${BASE_URL}/Competency/${competency.competencyId}`; console.log("Calling API: PUT", apiUrl, competency); const response = await axios.put(apiUrl, competency); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.data as Competency, success: true }; } catch (error) { console.error("Error in updateCompetency:", error); return { data: {} as Competency, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const deleteCompetency = async (competencyId: number): Promise> => { try { const apiUrl = `${BASE_URL}/Competency/${competencyId}`; console.log("Calling API: DELETE", apiUrl); const response = await axios.delete(apiUrl); if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.status === 200, success: response.status === 200 }; } catch (error) { console.error("Error in deleteCompetency:", error); return { data: false, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; // Competency Indicators export const getCompetencyIndicators = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/CompetencyIndicator`); return response.data; }; export const getCompetencyIndicatorsByCompetencyId = async (competencyId: number): Promise> => { const indicators = await getCompetencyIndicators(); const filteredIndicators = indicators.data.filter(indicator => indicator.competencyId === competencyId); return { data: filteredIndicators, success: true }; }; export const getCompetencyIndicatorById = async (indicatorId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/CompetencyIndicator/${indicatorId}`); return response.data; }; export const createCompetencyIndicator = async (indicator: CompetencyIndicatorCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/CompetencyIndicator`, indicator); return response.data; }; export const updateCompetencyIndicator = async (indicator: CompetencyIndicatorUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/CompetencyIndicator/${indicator.indicatorId}`, indicator); return response.data; }; export const deleteCompetencyIndicator = async (indicatorId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/CompetencyIndicator/${indicatorId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Competency Ratings export const getCompetencyRatings = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/CompetencyRating`); return response.data; }; export const getCompetencyRatingsByAppraisalId = async (appraisalId: number): Promise> => { const ratings = await getCompetencyRatings(); // Handle case when ratings.data is undefined if (!ratings.success || !ratings.data) { console.warn("No competency ratings data available"); return { data: [], success: true }; } const filteredRatings = ratings.data.filter(rating => rating.appraisalId === appraisalId); return { data: filteredRatings, success: true }; }; export const getCompetencyRatingById = async (ratingId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/CompetencyRating/${ratingId}`); return response.data; }; export const createCompetencyRating = async (rating: CompetencyRatingCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/CompetencyRating`, rating); return response.data; }; export const updateCompetencyRating = async (rating: CompetencyRatingUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/CompetencyRating/${rating.ratingId}`, rating); return response.data; }; export const deleteCompetencyRating = async (ratingId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/CompetencyRating/${ratingId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Training Needs export const getTrainingNeeds = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/TrainingNeed`); return response.data; }; export const getTrainingNeedsByAppraisalId = async (appraisalId: number): Promise> => { const trainingNeeds = await getTrainingNeeds(); // Handle case when trainingNeeds.data is undefined if (!trainingNeeds.success || !trainingNeeds.data) { console.warn("No training needs data available"); return { data: [], success: true }; } const filteredNeeds = trainingNeeds.data.filter(need => need.appraisalId === appraisalId); return { data: filteredNeeds, success: true }; }; export const getTrainingNeedById = async (trainingId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/TrainingNeed/${trainingId}`); return response.data; }; export const createTrainingNeed = async (trainingNeed: TrainingNeedCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/TrainingNeed`, trainingNeed); return response.data; }; export const updateTrainingNeed = async (trainingNeed: TrainingNeedUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/TrainingNeed/${trainingNeed.trainingId}`, trainingNeed); return response.data; }; export const deleteTrainingNeed = async (trainingId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/TrainingNeed/${trainingId}`); return { data: response.status === 200, success: response.status === 200 }; }; // HR Remarks export const getHrRemarks = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/HrRemark`); return response.data; }; export const getHrRemarksByAppraisalId = async (appraisalId: number): Promise> => { const hrRemarks = await getHrRemarks(); const filteredRemarks = hrRemarks.data.filter(remark => remark.appraisalId === appraisalId); return { data: filteredRemarks, success: true }; }; export const getHrRemarkById = async (hrRemarkId: number): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/HrRemark/${hrRemarkId}`); return response.data; }; export const createHrRemark = async (hrRemark: HrRemarkCreateRequest): Promise> => { const response = await axios.post(`${API_BASE_URL}/api/HrRemark`, hrRemark); return response.data; }; export const updateHrRemark = async (hrRemark: HrRemarkUpdateRequest): Promise> => { const response = await axios.put(`${API_BASE_URL}/api/HrRemark/${hrRemark.hrRemarkId}`, hrRemark); return response.data; }; export const deleteHrRemark = async (hrRemarkId: number): Promise> => { const response = await axios.delete(`${API_BASE_URL}/api/HrRemark/${hrRemarkId}`); return { data: response.status === 200, success: response.status === 200 }; }; // Reporting export const generateAppraisalReport = async (appraisalId: number): Promise => { const response = await axios.get(`${API_BASE_URL}/api/Appraisal/report/${appraisalId}`, { responseType: 'blob' }); return response.data; }; // Statistics export const getAppraisalStatistics = async (cycleId?: number): Promise> => { const url = cycleId ? `${API_BASE_URL}/api/Appraisal/statistics?cycleId=${cycleId}` : `${API_BASE_URL}/api/Appraisal/statistics`; const response = await axios.get(url); return response.data; }; // Management Remarks export const getManagementRemarks = async (): Promise> => { const response = await axios.get(`${API_BASE_URL}/api/ManagementRemark`); return response.data; }; export const getManagementRemarksByAppraisalId = async (appraisalId: number): Promise> => { const remarks = await getManagementRemarks(); // Handle case when remarks.data is undefined if (!remarks.success || !remarks.data) { console.warn("No management remarks data available"); return { data: [], success: true }; } const filteredRemarks = remarks.data.filter(remark => remark.appraisalId === appraisalId); return { data: filteredRemarks, success: true }; }; export const getManagementRemarkById = async (id: number): Promise> => { const response = await axios.get(`