import axios from 'axios'; import apiClient from '@/lib/api/axios-instance'; import { createHeaders } from '@/lib/api'; 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 apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // If response.data is an array, assume it's the cycles data if (Array.isArray(response.data)) { 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 apiClient.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 apiClient.post(`/api/AppraisalCycle`, cycle); return response.data; }; export const updateAppraisalCycle = async (cycle: AppraisalCycleUpdateRequest): Promise> => { const response = await apiClient.put(`/api/AppraisalCycle/${cycle.cycleId}`, cycle); return response.data; }; export const deleteAppraisalCycle = async (cycleId: number): Promise> => { const response = await apiClient.delete(`/api/AppraisalCycle/${cycleId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Appraisals // ===================================================================== export const getAppraisals = async (): Promise> => { const response = await apiClient.get(`/api/Appraisal`); return response.data; }; export const getAppraisalById = async (appraisalId: number): Promise> => { const response = await apiClient.get(`/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 apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // If response.data is an array, assume it's the appraisals data if (Array.isArray(response.data)) { 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> => { try { const apiUrl = `${BASE_URL}/Appraisal/appraiser/${appraiserId}`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // If response.data is an array, assume it's the appraisals data if (Array.isArray(response.data)) { 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 getAppraisalsByAppraiserId:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAppraisalsByCycleId = async (cycleId: number): Promise> => { const appraisals = await getAppraisals(); // Handle case when appraisals.data is undefined if (!appraisals.success || !appraisals.data) { console.warn("No appraisals data available"); return { data: [], success: true }; } const filteredAppraisals = appraisals.data.filter(appraisal => appraisal.cycleId === cycleId); return { data: filteredAppraisals, success: true }; }; export const createAppraisal = async (appraisal: AppraisalCreateRequest): Promise> => { const response = await apiClient.post(`/api/Appraisal`, appraisal); return response.data; }; export const updateAppraisal = async (appraisal: AppraisalUpdateRequest): Promise> => { const response = await apiClient.put(`/api/Appraisal/${appraisal.appraisalId}`, appraisal); return response.data; }; export const deleteAppraisal = async (appraisalId: number): Promise> => { const response = await apiClient.delete(`/api/Appraisal/${appraisalId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Role Assessment Questions // ===================================================================== export const getRoleAssessmentQuestions = async (): Promise> => { try { const apiUrl = `${BASE_URL}/RoleAssessmentQuestion`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // If response.data is an array, assume it's the questions data if (Array.isArray(response.data)) { 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(); // Handle case when questions.data is undefined if (!questions.success || !questions.data) { console.warn("No role assessment questions data available"); return { data: [], success: true }; } const filteredQuestions = questions.data.filter(question => question.roleId === roleId); return { data: filteredQuestions, success: true }; }; export const getRoleAssessmentQuestionById = async (questionId: number): Promise> => { const response = await apiClient.get(`/api/RoleAssessmentQuestion/${questionId}`); return response.data; }; export const createRoleAssessmentQuestion = async (questionData: RoleAssessmentQuestionCreateRequest): Promise> => { const response = await apiClient.post(`/api/RoleAssessmentQuestion`, questionData); return response.data; }; export const updateRoleAssessmentQuestion = async (questionData: RoleAssessmentQuestionUpdateRequest): Promise> => { const response = await apiClient.put(`/api/RoleAssessmentQuestion/${questionData.questionId}`, questionData); return response.data; }; export const deleteRoleAssessmentQuestion = async (questionId: number): Promise> => { const response = await apiClient.delete(`/api/RoleAssessmentQuestion/${questionId}`); 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 apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // If response.data is an array, assume it's the competencies data if (Array.isArray(response.data)) { 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 apiClient.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 apiClient.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 apiClient.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 apiClient.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> => { try { console.log("Fetching all competency indicators"); const apiUrl = `${BASE_URL}/CompetencyIndicator`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // Check if response has data property if (!response.data) { console.error("API response is missing data for competency indicators"); return { data: [], success: false, message: "API response is missing data for competency indicators" }; } // Check if response.data already has the expected structure if (typeof response.data.success !== 'undefined') { console.log(`Received ${response.data.data?.length || 0} competency indicators with success=${response.data.success}`); return response.data as ResponseData; } // If response.data is an array, assume it's the indicators data if (Array.isArray(response.data)) { console.log(`Received ${response.data.length} competency indicators as direct array`); return { data: response.data as CompetencyIndicator[], 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 for competency indicators:", response.data); return { data: [], success: false, message: "API returned data in an unexpected format for competency indicators" }; } catch (error) { console.error("Error in getCompetencyIndicators:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getCompetencyIndicatorsByCompetencyId = async (competencyId: number): Promise> => { try { console.log(`Fetching competency indicators for competencyId: ${competencyId}`); // First try to fetch using direct API endpoint if available try { const apiUrl = `${BASE_URL}/CompetencyIndicator/by-competency/${competencyId}`; console.log("Attempting to call filtered API endpoint:", apiUrl); const response = await apiClient.get(apiUrl); if (response.data) { if (typeof response.data.success !== 'undefined') { console.log(`Received ${response.data.data?.length || 0} competency indicators via filtered endpoint`); return response.data as ResponseData; } if (Array.isArray(response.data)) { console.log(`Received ${response.data.length} competency indicators via filtered endpoint as direct array`); return { data: response.data as CompetencyIndicator[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to filtering client-side", error); } // Fall back to the original approach const indicators = await getCompetencyIndicators(); // Handle case when indicators.data is undefined if (!indicators.success || !indicators.data) { console.warn("No competency indicators data available"); return { data: [], success: true }; } const filteredIndicators = indicators.data.filter(indicator => indicator.competencyId === competencyId); console.log(`Filtered ${indicators.data.length} indicators to ${filteredIndicators.length} for competency ${competencyId}`); return { data: filteredIndicators, success: true }; } catch (error) { console.error(`Error fetching indicators for competency ${competencyId}:`, error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getCompetencyIndicatorById = async (indicatorId: number): Promise> => { try { const apiUrl = `${BASE_URL}/CompetencyIndicator/${indicatorId}`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // Check if response has data property if (!response.data) { console.error("API response is missing data for competency indicator"); return { data: {} as CompetencyIndicator, success: false, message: "API response is missing data for competency indicator" }; } // 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 indicator object return { data: response.data as CompetencyIndicator, success: true }; } catch (error) { console.error(`Error in getCompetencyIndicatorById (${indicatorId}):`, error); return { data: {} as CompetencyIndicator, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const createCompetencyIndicator = async (indicator: CompetencyIndicatorCreateRequest): Promise> => { try { console.log("Creating competency indicator:", indicator); const apiUrl = `/api/CompetencyIndicator`; console.log("Calling API: POST", apiUrl); const response = await apiClient.post(apiUrl, indicator); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: {} as CompetencyIndicator, 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; } // If response.data is the indicator object, wrap it in ResponseData if (response.data.indicatorId) { return { data: response.data as CompetencyIndicator, 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: {} as CompetencyIndicator, success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in createCompetencyIndicator:", error); return { data: {} as CompetencyIndicator, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateCompetencyIndicator = async (indicator: CompetencyIndicatorUpdateRequest): Promise> => { const response = await apiClient.put(`/api/CompetencyIndicator/${indicator.indicatorId}`, indicator); return response.data; }; export const deleteCompetencyIndicator = async (indicatorId: number): Promise> => { const response = await apiClient.delete(`/api/CompetencyIndicator/${indicatorId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Assessment Answers - FIXED // ===================================================================== export const getAssessmentAnswers = async (): Promise> => { const response = await apiClient.get(`/api/AssessmentAnswer`); return response.data; }; export const getAssessmentAnswersByAppraisalId = async (appraisalId: number): Promise> => { try { // Use the correct endpoint path as specified in API documentation const apiUrl = `/api/AssessmentAnswer/by-appraisal/${appraisalId}`; console.log("Calling API for assessment answers by appraisal ID:", apiUrl); try { // First attempt: Try to use the correct filtered endpoint const response = await apiClient.get(apiUrl); // Check if response has data property and the expected format if (response.data) { if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } if (Array.isArray(response.data)) { return { data: response.data as AssessmentAnswer[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to all answers", error); // If filtered endpoint fails, fall back to getting all answers } // Fall back to getting all answers and filtering client-side 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); console.log(`Filtered ${answers.data.length} answers to ${filteredAnswers.length} for appraisal ${appraisalId}`); return { data: filteredAnswers, success: true }; } catch (error) { console.error("Error getting assessment answers by appraisal ID:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAssessmentAnswerById = async (answerId: number): Promise> => { const response = await apiClient.get(`/api/AssessmentAnswer/${answerId}`); return response.data; }; export const createAssessmentAnswer = async (answer: AssessmentAnswerCreateRequest): Promise> => { try { console.log("Creating assessment answer:", answer); const apiUrl = `/api/AssessmentAnswer`; console.log("Calling API: POST", apiUrl); // Add default timestamps if not provided const payload = { ...answer, createdAt: answer.createdAt || new Date().toISOString(), updatedAt: answer.updatedAt || new Date().toISOString() }; const response = await apiClient.post(apiUrl, payload); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: {} as AssessmentAnswer, 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; } // If response.data is the answer object, wrap it in ResponseData if (response.data.answerId) { return { data: response.data as AssessmentAnswer, 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: {} as AssessmentAnswer, success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in createAssessmentAnswer:", error); return { data: {} as AssessmentAnswer, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateAssessmentAnswer = async (answer: AssessmentAnswerUpdateRequest): Promise> => { const response = await apiClient.put(`/api/AssessmentAnswer/${answer.answerId}`, answer); return response.data; }; export const deleteAssessmentAnswer = async (answerId: number): Promise> => { const response = await apiClient.delete(`/api/AssessmentAnswer/${answerId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Competency Ratings - FIXED // ===================================================================== export const getCompetencyRatings = async (): Promise> => { const response = await apiClient.get(`/api/CompetencyRating`); return response.data; }; export const getCompetencyRatingsByAppraisalId = async (appraisalId: number): Promise> => { try { // Use the correct endpoint path as specified in API documentation const apiUrl = `/api/CompetencyRating/by-appraisal/${appraisalId}`; console.log("Calling API for competency ratings by appraisal ID:", apiUrl); try { // First attempt: Try to use the correct filtered endpoint const response = await apiClient.get(apiUrl); // Check if response has data property and the expected format if (response.data) { if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } if (Array.isArray(response.data)) { return { data: response.data as CompetencyRating[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to all ratings", error); // If filtered endpoint fails, fall back to getting all ratings } // Fall back to getting all ratings and filtering client-side 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); console.log(`Filtered ${ratings.data.length} ratings to ${filteredRatings.length} for appraisal ${appraisalId}`); return { data: filteredRatings, success: true }; } catch (error) { console.error("Error getting competency ratings by appraisal ID:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getCompetencyRatingById = async (ratingId: number): Promise> => { const response = await apiClient.get(`/api/CompetencyRating/${ratingId}`); return response.data; }; export const createCompetencyRating = async (rating: CompetencyRatingCreateRequest): Promise> => { const response = await apiClient.post(`/api/CompetencyRating`, rating); return response.data; }; export const updateCompetencyRating = async (rating: CompetencyRatingUpdateRequest): Promise> => { const response = await apiClient.put(`/api/CompetencyRating/${rating.ratingId}`, rating); return response.data; }; export const deleteCompetencyRating = async (ratingId: number): Promise> => { const response = await apiClient.delete(`/api/CompetencyRating/${ratingId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Training Needs - FIXED // ===================================================================== export const getTrainingNeeds = async (): Promise> => { const response = await apiClient.get(`/api/TrainingNeed`); return response.data; }; export const getTrainingNeedsByAppraisalId = async (appraisalId: number): Promise> => { try { // Use the correct endpoint path as specified in API documentation const apiUrl = `/api/TrainingNeed/by-appraisal/${appraisalId}`; console.log("Calling API for training needs by appraisal ID:", apiUrl); try { // First attempt: Try to use the correct filtered endpoint const response = await apiClient.get(apiUrl); // Check if response has data property and the expected format if (response.data) { if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } if (Array.isArray(response.data)) { return { data: response.data as TrainingNeed[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to all training needs", error); // If filtered endpoint fails, fall back to getting all training needs } // Fall back to getting all training needs and filtering client-side 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); console.log(`Filtered ${trainingNeeds.data.length} training needs to ${filteredNeeds.length} for appraisal ${appraisalId}`); return { data: filteredNeeds, success: true }; } catch (error) { console.error("Error getting training needs by appraisal ID:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getTrainingNeedById = async (trainingId: number): Promise> => { const response = await apiClient.get(`/api/TrainingNeed/${trainingId}`); return response.data; }; export const createTrainingNeed = async (trainingNeed: TrainingNeedCreateRequest): Promise> => { try { console.log("Creating training need:", trainingNeed); const apiUrl = `/api/TrainingNeed`; console.log("Calling API: POST", apiUrl); const response = await apiClient.post(apiUrl, trainingNeed); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: {} as TrainingNeed, 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; } // If response.data is the training need object, wrap it in ResponseData if (response.data.trainingId) { return { data: response.data as TrainingNeed, 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: {} as TrainingNeed, success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in createTrainingNeed:", error); return { data: {} as TrainingNeed, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const updateTrainingNeed = async (trainingNeed: TrainingNeedUpdateRequest): Promise> => { try { console.log("Updating training need:", trainingNeed); const apiUrl = `/api/TrainingNeed/${trainingNeed.trainingId}`; console.log("Calling API: PUT", apiUrl); const response = await apiClient.put(apiUrl, trainingNeed); // Check if response has data property if (!response.data) { console.error("API response is missing data"); return { data: {} as TrainingNeed, 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; } // If response.data is the training need object, wrap it in ResponseData if (response.data.trainingId) { return { data: response.data as TrainingNeed, 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: {} as TrainingNeed, success: false, message: "API returned data in an unexpected format" }; } catch (error) { console.error("Error in updateTrainingNeed:", error); return { data: {} as TrainingNeed, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const deleteTrainingNeed = async (trainingId: number): Promise> => { try { console.log("Deleting training need:", trainingId); const apiUrl = `/api/TrainingNeed/${trainingId}`; console.log("Calling API: DELETE", apiUrl); const response = await apiClient.delete(apiUrl); // Check if response has data property if (response.data && typeof response.data.success !== 'undefined') { return response.data as ResponseData; } return { data: response.status === 200, success: response.status === 200, message: response.status === 200 ? "Training need deleted successfully" : "Failed to delete training need" }; } catch (error) { console.error("Error in deleteTrainingNeed:", error); return { data: false, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; // ===================================================================== // HR Remarks - FIXED // ===================================================================== export const getHrRemarks = async (): Promise> => { const response = await apiClient.get(`/api/HrRemark`); return response.data; }; export const getHrRemarksByAppraisalId = async (appraisalId: number): Promise> => { try { // Use the correct endpoint path as specified in API documentation const apiUrl = `/api/HrRemark/by-appraisal/${appraisalId}`; console.log("Calling API for HR remarks by appraisal ID:", apiUrl); try { // First attempt: Try to use the correct filtered endpoint const response = await apiClient.get(apiUrl); // Check if response has data property and the expected format if (response.data) { if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } if (Array.isArray(response.data)) { return { data: response.data as HrRemark[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to all HR remarks", error); // If filtered endpoint fails, fall back to getting all HR remarks } // Fall back to getting all HR remarks and filtering client-side const hrRemarks = await getHrRemarks(); // Handle case when hrRemarks.data is undefined if (!hrRemarks.success || !hrRemarks.data) { console.warn("No HR remarks data available"); return { data: [], success: true }; } const filteredRemarks = hrRemarks.data.filter(remark => remark.appraisalId === appraisalId); console.log(`Filtered ${hrRemarks.data.length} HR remarks to ${filteredRemarks.length} for appraisal ${appraisalId}`); return { data: filteredRemarks, success: true }; } catch (error) { console.error("Error getting HR remarks by appraisal ID:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getHrRemarkById = async (hrRemarkId: number): Promise> => { const response = await apiClient.get(`/api/HrRemark/${hrRemarkId}`); return response.data; }; export const createHrRemark = async (hrRemark: HrRemarkCreateRequest): Promise> => { const response = await apiClient.post(`/api/HrRemark`, hrRemark); return response.data; }; export const updateHrRemark = async (hrRemark: HrRemarkUpdateRequest): Promise> => { const response = await apiClient.put(`/api/HrRemark/${hrRemark.hrRemarkId}`, hrRemark); return response.data; }; export const deleteHrRemark = async (hrRemarkId: number): Promise> => { const response = await apiClient.delete(`/api/HrRemark/${hrRemarkId}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Management Remarks - FIXED // ===================================================================== export const getManagementRemarks = async (): Promise> => { const response = await apiClient.get(`/api/ManagementRemark`); return response.data; }; export const getManagementRemarkById = async (id: number): Promise> => { const response = await apiClient.get(`/api/ManagementRemark/${id}`); return response.data; }; export const getManagementRemarksByAppraisalId = async (appraisalId: number): Promise> => { try { // Use the correct endpoint path as specified in API documentation const apiUrl = `/api/ManagementRemark/by-appraisal/${appraisalId}`; console.log("Calling API for management remarks by appraisal ID:", apiUrl); try { // First attempt: Try to use the correct filtered endpoint const response = await apiClient.get(apiUrl); // Check if response has data property and the expected format if (response.data) { if (typeof response.data.success !== 'undefined') { return response.data as ResponseData; } if (Array.isArray(response.data)) { return { data: response.data as ManagementRemark[], success: true }; } } } catch (error) { console.log("Filtered endpoint failed, falling back to all management remarks", error); // If filtered endpoint fails, fall back to getting all management remarks } // Fall back to getting all management remarks and filtering client-side 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); console.log(`Filtered ${remarks.data.length} management remarks to ${filteredRemarks.length} for appraisal ${appraisalId}`); return { data: filteredRemarks, success: true }; } catch (error) { console.error("Error getting management remarks by appraisal ID:", error); return { data: [], success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const createManagementRemark = async (remark: ManagementRemarkCreateRequest): Promise> => { const response = await apiClient.post(`/api/ManagementRemark`, remark); return response.data; }; export const updateManagementRemark = async (remark: ManagementRemarkUpdateRequest): Promise> => { const response = await apiClient.put(`/api/ManagementRemark/${remark.id}`, remark); return response.data; }; export const deleteManagementRemark = async (id: number): Promise> => { const response = await apiClient.delete(`/api/ManagementRemark/${id}`); return { data: response.status === 200, success: response.status === 200 }; }; // ===================================================================== // Report Generation // ===================================================================== export const generateAppraisalReport = async (appraisalId: number): Promise> => { try { const apiUrl = `${BASE_URL}/Appraisal/${appraisalId}/report`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // Assume response.data is the report URL or content return { data: response.data as string, success: true }; } catch (error) { console.error("Error in generateAppraisalReport:", error); return { data: "", success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; export const getAppraisalStatistics = async (): Promise> => { try { const apiUrl = `${BASE_URL}/Appraisal/statistics`; console.log("Calling API: GET", apiUrl); const response = await apiClient.get(apiUrl); // 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') { return response.data as ResponseData; } // Assume response.data is the statistics object return { data: response.data, success: true }; } catch (error) { console.error("Error in getAppraisalStatistics:", error); return { data: {}, success: false, message: error instanceof Error ? error.message : "Unknown error occurred" }; } }; // ===================================================================== // Assessment Areas // ===================================================================== export const getAssessmentAreas = async (): Promise> => { try { const apiUrl = `${BASE_URL}/AssessmentArea`; console.log("Calling API: GET", apiUrl); const response = await apiClient.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 apiClient.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 apiClient.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 apiClient.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 apiClient.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" }; } };