export type UserRole = | 'CEO' | 'COO' | 'Account Manager' | 'Project Manager' | 'Tech Lead' | 'Senior Developer' | 'Developer' | 'Testing Manager' | 'Senior Tester' | 'Tester' | 'HR Manager' | 'HR'; export interface User { id: string; name: string; email: string; role: UserRole; avatar?: string; } export type ProjectStatus = 'Completed' | 'Overdue' | 'In Progress'; export interface Project { id: string; name: string; description: string; status: ProjectStatus; progress: number; startDate: string; endDate: string; teamId?: string; leadId?: string; } export interface Team { id: number; name: string; description: string; } export interface TeamCreateRequest { id: number; name: string; description: string; } export interface TeamUpdateRequest { id: number; name: string; description: string; } export interface TeamMember { id: number; description: string; teamsId: number; employeeId: number; roleId: number; isActive?: string; } export interface TeamMemberCreateRequest { id: number; description: string; teamsId: number; employeeId: number; roleId: number; } export interface TeamMemberUpdateRequest { id: number; description: string; teamsId: number; employeeId: number; roleId: number; } export type IssuePriority = 'Low' | 'Medium' | 'High' | 'Critical'; export type IssueStatus = 'New' | 'In Progress' | 'In Review' | 'Done'; export type IssueType = 'Bug' | 'Feature' | 'Task' | 'Improvement'; export interface Issue { id: string; title: string; description: string; projectId: string; assigneeId?: string; reporterId: string; priority: IssuePriority; status: IssueStatus; type: IssueType; createdAt: string; updatedAt: string; } export interface Task { id: string; title: string; description: string; issueId?: string; assigneeId?: string; status: IssueStatus; priority: IssuePriority; dueDate?: string; createdAt: string; updatedAt: string; } export interface DashboardStats { projects: number; employees: number; tasks: number; clients: number; revenue: number; expenses: number; profit: number; completedTasks: number; pendingTasks: number; inProgressTasks: number; onHoldTasks: number; reviewTasks: number; } export interface ChartData { name: string; value: number; color?: string; } export interface ResponseData { data: T; success: boolean; message?: string; } export interface LoginResponse { userId: number; email: string; firstName: string; lastName: string; roleId: number; roleName: string | null; token: string; employeeId: number; } export interface Employee { empCode: any; id: number; firstName: string; lastName: string; email: string; roleId: number; phone?: string; department?: string; position?: string; joiningDate?: string; profileImage?: string | null; address?: string; city?: string; state?: string; country?: string; postalCode?: string; managerId?: number | null; userId: number; reportingToId?: number | null; } export interface EmployeeRegistrationRequest { id: number; empCode: string; firstName: string; middleName: string; lastName: string; email: string; mobile: string; type: string; academics: string; financialData: string; description: string; passwordHash: string; roleId: number; status?: string; } export interface Role { roleId: number; roleName: string; description: string; } export interface RoleCreateRequest { roleName: string; description: string; } export interface RoleUpdateRequest { roleId: number; roleName: string; description: string; } export interface ProjectApi { id: number; projectName: string; projectCode: string; category: string; projectManager: string; client: string; startDate: string; endDate: string; description: string; teamId: number; taskStartDate?: string; taskEndDate?: string; status?: string; } export interface ProjectCreateRequest { projectName: string; projectCode: string; category: string; projectManager: string; client: string; startDate: string; endDate: string; description: string; teamId: number; } export interface ProjectUpdateRequest { id: number; projectName: string; projectCode: string; category: string; projectManager: string; client: string; startDate: string; endDate: string; description: string; teamId: number; } export interface Deliverable { id: number; name: string; description: string; deliveryDate: string; projectId: number; status?: string; startDate?: string; endDate?: string; } export interface DeliverableCreateRequest { name: string; description: string; deliveryDate: string; projectId: number; status?: string; startDate?: string; endDate?: string; } export interface DeliverableUpdateRequest { id: number; name: string; description: string; deliveryDate: string; projectId: number; status?: string; startDate?: string; endDate?: string; } export interface IssueApi { id: number; biCode: string; type: string; description: string; estimates: string; esUnit: number; priority: string; severity: string; reportedBy: number; assignedTo: number; remainingHr: number; title: string; projectId: number; deliverablesId: number; status?: string; startDate?: string; endDate?: string; } export interface IssueCreateRequest { biCode: string; type: string; description: string; estimates: string; esUnit: number; priority: string; severity: string; reportedBy: number; assignedTo: number; remainingHr: number; title: string; projectId: number; deliverablesId: number; status?: string; startDate?: string; endDate?: string; } export interface IssueUpdateRequest { id: number; biCode: string; type: string; description: string; estimates: string; esUnit: number; priority: string; severity: string; reportedBy: number; assignedTo: number; remainingHr: number; title: string; projectId: number; deliverablesId: number; status?: string; startDate?: string; endDate?: string; } export interface ProjectTeamApi { id: number; description: string | null; teamsId: number; projectId: number; } export interface Permission { permissionId: number; permissionName: string; description: string; } export interface RolePermission { rolePermissionID: number; roleId: number; permissionId: number; } export interface RolePermissionCreateRequest { rolePermissionID: number; roleId: number; permissionId: number; } export interface Feature { featureId: number; featureName: string; description?: string; category?: string; isActive?: boolean; } export interface FeatureCreateRequest { featureId: number; featureName: string; description?: string; category?: string; isActive?: boolean; } export interface FeatureUpdateRequest { featureId: number; featureName: string; description?: string; category?: string; isActive?: boolean; } export interface RoleFeature { roleFeatureId: number; roleId: number; featureId: number; permissionIds: number[]; } export interface RoleFeatureCreateRequest { roleFeatureId: number; roleId: number; featureId: number; permissionIds: number[]; } export interface RoleFeatureUpdateRequest { roleFeatureId: number; roleId: number; featureId: number; permissionIds: number[]; } // Attendance types export interface AttendanceRecord { id: number; employeeId: number; date: string; inTime: string | null; outTime: string | null; status: 'Present' | 'Absent' | 'Half Day' | 'Leave'; comments?: string; } export interface AttendanceUploadRequest { month: string; year: number; records: AttendanceRecord[]; } export interface AttendanceResponse { success: boolean; message: string; data: AttendanceRecord[]; } export type LeaveStatus = 'Pending' | 'Approved' | 'Rejected' | 'Cancelled'; export type LeaveType = | 'Annual' | 'Sick' | 'Personal' | 'Unpaid' | 'Maternity' | 'Paternity' | 'Bereavement' | 'Compensatory' | 'Half Day' | 'Other'; export interface Leave { id: number; employeeId: number; leaveMasterId?: number; startDate: string; endDate: string; reason: string; type: LeaveType; status: LeaveStatus; appliedOn: string; approvedById?: number; approvedOn?: string; actionDate?: string; comments?: string; documents?: string; halfDay?: boolean; workingDays?: number; compOff?: boolean; updatedByName?: string; } export interface LeaveCreateRequest { id?: number; employeeId: number; leaveMasterId?: number; startDate: string; endDate: string; reason: string; type: LeaveType; status?: LeaveStatus; appliedOn?: string; comments?: string; documents?: string; halfDay?: boolean; halfDayPortion?: 'first' | 'second'; workingDays?: number; compOff?: boolean; } export interface LeaveUpdateRequest { id: number; employeeId: number; leaveMasterId?: number; startDate: string; endDate: string; reason: string; type: LeaveType; status: LeaveStatus; appliedOn: string; approvedById?: number; approvedOn?: string; actionDate?: string; comments?: string; documents?: string; halfDay?: boolean; halfDayPortion?: 'first' | 'second'; workingDays?: number; compOff?: boolean; } export interface LeaveStatusUpdateRequest { id: number; status: LeaveStatus; approvedById: number; approverId?: number; comments?: string; actionDate: string; } export interface LeaveBalance { id: number; employeeId: number; year: number; leavesMasterId: number; allocated: number; used: number; pending: number; carryForward: number; leaveType?: string; createdBy?: number; createdAt?: string; createdByName?: string; updatedBy?: number; updatedAt?: string; updatedByName?: string; } export interface LeaveMaster { id: number; leaveType: string; description: string; defaultDays: number; carryForwardLimit: number; isActive: boolean; maxConsecutiveDays?: number; minDaysBeforeApply: number; requiresApproval: boolean; requiresDocumentation: boolean; applyToRoles: string; // Comma-separated list of role IDs createdAt: string; updatedAt: string; } export interface LeaveMasterCreateRequest { leaveType: string; description: string; defaultDays: number; carryForwardLimit: number; isActive: boolean; maxConsecutiveDays?: number; minDaysBeforeApply: number; requiresApproval: boolean; requiresDocumentation: boolean; applyToRoles: string; } export interface LeaveMasterUpdateRequest extends LeaveMasterCreateRequest { id: number; } export interface LeaveCalendarEvent { id: string; title: string; start: string; end: string; allDay: boolean; employeeId: number; employeeName: string; leaveType: LeaveType; status: LeaveStatus; } // Add a utility function to map API responses that might have different property names export function mapApiProject(apiProject: any): ProjectApi { // Robust status field detection // Handle various possible field names and normalize null/undefined to empty string const apiStatus = apiProject.status ?? apiProject.projectStatus ?? apiProject.Status ?? apiProject.ProjectStatus ?? ''; return { id: apiProject.id, projectName: apiProject.projectName || apiProject.name || `Project #${apiProject.id}`, projectCode: apiProject.projectCode || apiProject.code || '', category: apiProject.category || '', projectManager: apiProject.projectManager || '', client: apiProject.client || '', startDate: apiProject.startDate || '', endDate: apiProject.endDate || '', description: apiProject.description || '', teamId: apiProject.teamId || 0, taskStartDate: apiProject.taskStartDate || apiProject.TaskStartDate || '', taskEndDate: apiProject.taskEndDate || apiProject.TaskEndDate || '', status: (apiStatus !== null && apiStatus !== undefined) ? String(apiStatus) : '', }; } // Add a utility function to map API issues with different property names export function mapApiIssue(apiIssue: any): IssueApi { if (!apiIssue) { console.warn('Received null or undefined apiIssue object'); return { id: 0, biCode: '', type: 'Task', description: '', estimates: '', esUnit: 0, priority: 'Medium', severity: 'Minor', reportedBy: 0, assignedTo: 0, remainingHr: 0, title: '', projectId: 0, deliverablesId: 0, status: 'New' }; } console.log(`Mapping issue ID=${apiIssue.id}, title=${apiIssue.title || 'Untitled'}`); // Check for project ID in various formats let projectId = 0; if (apiIssue.projectId !== undefined && apiIssue.projectId !== null) { projectId = typeof apiIssue.projectId === 'string' ? parseInt(apiIssue.projectId, 10) : apiIssue.projectId; } else if (apiIssue.project_id !== undefined && apiIssue.project_id !== null) { projectId = typeof apiIssue.project_id === 'string' ? parseInt(apiIssue.project_id, 10) : apiIssue.project_id; } else if (apiIssue.project && apiIssue.project.id) { projectId = typeof apiIssue.project.id === 'string' ? parseInt(apiIssue.project.id, 10) : apiIssue.project.id; } // Check for deliverable ID in various formats let deliverableId = 0; const possibleDeliverableProps = ['deliverablesId', 'deliverableId', 'deliverable_id', 'deliverableID', 'deliverable_Id']; for (const prop of possibleDeliverableProps) { if (apiIssue[prop] !== undefined && apiIssue[prop] !== null) { // Convert to number if it's a string const value = typeof apiIssue[prop] === 'string' ? parseInt(apiIssue[prop], 10) : apiIssue[prop]; if (!isNaN(value)) { deliverableId = value; console.log(`Found deliverable ID ${deliverableId} in property ${prop} for issue ID=${apiIssue.id}`); break; } } } // Check if issue has a deliverable object with an id property if (deliverableId === 0 && apiIssue.deliverable) { if (typeof apiIssue.deliverable === 'number') { deliverableId = apiIssue.deliverable; console.log(`Found deliverable ID ${deliverableId} as direct number value for issue ID=${apiIssue.id}`); } else if (apiIssue.deliverable.id) { deliverableId = typeof apiIssue.deliverable.id === 'string' ? parseInt(apiIssue.deliverable.id, 10) : apiIssue.deliverable.id; console.log(`Found deliverable ID ${deliverableId} in nested deliverable.id property for issue ID=${apiIssue.id}`); } } // Get status from various possible fields let status = apiIssue.status || 'New'; if (!status && apiIssue.issueStatus) { status = apiIssue.issueStatus; } else if (!status && apiIssue.state) { status = apiIssue.state; } return { id: apiIssue.id || 0, biCode: apiIssue.biCode || apiIssue.code || '', type: apiIssue.type || apiIssue.issueType || 'Task', description: apiIssue.description || '', estimates: apiIssue.estimates || apiIssue.estimatedTime || '', esUnit: apiIssue.esUnit || apiIssue.estimationUnit || 0, priority: apiIssue.priority || 'Medium', severity: apiIssue.severity || 'Minor', reportedBy: apiIssue.reportedBy || apiIssue.reporter || 0, assignedTo: apiIssue.assignedTo || apiIssue.assignee || 0, remainingHr: apiIssue.remainingHr || apiIssue.remainingHours || 0, title: apiIssue.title || apiIssue.summary || '', projectId: projectId, deliverablesId: deliverableId, status: status, startDate: apiIssue.startDate || '', endDate: apiIssue.endDate || '' }; } export interface Todo { id: number; title: string; description: string; status: 'Pending' | 'In Progress' | 'Completed'; priority: 'Low' | 'Medium' | 'High'; dueDate: string; assigneeId?: number; projectId?: number; createdAt: string; updatedAt: string; } export interface TodoCreateRequest { title: string; description: string; status: 'Pending' | 'In Progress' | 'Completed'; priority: 'Low' | 'Medium' | 'High'; dueDate: string; assigneeId?: number; projectId?: number; } export interface TodoUpdateRequest { id: number; title: string; description: string; status: 'Pending' | 'In Progress' | 'Completed'; priority: 'Low' | 'Medium' | 'High'; dueDate: string; assigneeId?: number; projectId?: number; } export interface Holiday { id: number; name: string; date: string; description: string; isRecurring: boolean; appliesTo: string; } export interface HolidayCreateRequest { id?: number; name: string; date: string; description: string; isRecurring: boolean; appliesTo: string; } export interface HolidayUpdateRequest { id: number; name: string; date: string; description: string; isRecurring: boolean; appliesTo: string; } // Appraisal Module Types export interface AppraisalCycle { cycleId: number; name: string; startDate: string; endDate: string; } export interface AppraisalCycleCreateRequest { name: string; startDate: string; endDate: string; } export interface AppraisalCycleUpdateRequest { cycleId: number; name: string; startDate: string; endDate: string; } export interface Appraisal { appraisalId: number; employeeId: number; appraiserId: number; cycleId: number; dateOfAppraisal: string; place: string; status: 'Draft' | 'SelfSubmitted' | 'ManagerReviewed' | 'Completed'; } export interface AppraisalCreateRequest { employeeId: number; appraiserId: number; cycleId: number; dateOfAppraisal: string; place: string; } export interface AppraisalUpdateRequest { appraisalId: number; employeeId: number; appraiserId: number; cycleId: number; dateOfAppraisal: string; place: string; status: 'Draft' | 'SelfSubmitted' | 'ManagerReviewed' | 'Completed'; } export interface AssessmentArea { areaId: number; title: string; } export interface AssessmentAreaCreateRequest { title: string; } export interface AssessmentAreaUpdateRequest { areaId: number; title: string; } export interface RoleAssessmentQuestion { questionId: number; roleId: number; areaId: number; questionText: string; } export interface RoleAssessmentQuestionCreateRequest { roleId: number; areaId: number; questionText: string; } export interface RoleAssessmentQuestionUpdateRequest { questionId: number; roleId: number; areaId: number; questionText: string; } export interface AssessmentAnswer { answerId: number; appraisalId: number; questionId: number; selfRemarks: string; appraiserRemarks: string; createdBy?: number; createdAt?: string; createdByName?: string; updatedBy?: number; updatedAt?: string; updatedByName?: string; } export interface AssessmentAnswerCreateRequest { appraisalId: number; questionId: number; selfRemarks: string; appraiserRemarks?: string; createdBy?: number; createdAt?: string; createdByName?: string; updatedBy?: number; updatedAt?: string; updatedByName?: string; } export interface AssessmentAnswerUpdateRequest { answerId: number; appraisalId: number; questionId: number; selfRemarks: string; appraiserRemarks: string; updatedBy?: number; updatedAt?: string; updatedByName?: string; } export type CompetencyCategory = 'Core' | 'Technical' | 'Leadership' | 'Communication' | 'Teamwork'; export interface Competency { competencyId: number; title: string; weightage: number; category: CompetencyCategory; } export interface CompetencyCreateRequest { title: string; weightage: number; category: CompetencyCategory; } export interface CompetencyUpdateRequest { competencyId: number; title: string; weightage: number; category: CompetencyCategory; } export interface CompetencyIndicator { indicatorId: number; competencyId: number; indicatorText: string; } export interface CompetencyIndicatorCreateRequest { competencyId: number; indicatorText: string; } export interface CompetencyIndicatorUpdateRequest { indicatorId: number; competencyId: number; indicatorText: string; } export interface CompetencyRating { ratingId: number; appraisalId: number; indicatorId: number; selfRating: number; appraiserRating: number; weightedScore: number; appraiserRemark: string; } export interface CompetencyRatingCreateRequest { appraisalId: number; indicatorId: number; selfRating: number; appraiserRating?: number; weightedScore?: number; appraiserRemark?: string; } export interface CompetencyRatingUpdateRequest { ratingId: number; appraisalId: number; indicatorId: number; selfRating: number; appraiserRating: number; weightedScore: number; appraiserRemark: string; } export interface TrainingNeed { trainingId: number; appraisalId: number; needDescription: string; } export interface TrainingNeedCreateRequest { appraisalId: number; needDescription: string; } export interface TrainingNeedUpdateRequest { trainingId: number; appraisalId: number; needDescription: string; } export interface HrRemark { hrRemarkId: number; appraisalId: number; remarks: string; } export interface HrRemarkCreateRequest { appraisalId: number; remarks: string; } export interface HrRemarkUpdateRequest { hrRemarkId: number; appraisalId: number; remarks: string; } // Meeting Room Booking Types export interface MeetingRoom { id: number; name: string; capacity: number; location: string; features: string[]; isAvailable: boolean; description?: string; imageUrl?: string; } export interface MeetingRoomCreateRequest { name: string; capacity: number; location: string; features: string[]; isAvailable: boolean; description?: string; imageUrl?: string; } export interface MeetingRoomUpdateRequest { id: number; name?: string; capacity?: number; location?: string; features?: string[]; isAvailable?: boolean; description?: string; imageUrl?: string; } export interface RoomBooking { id: number; roomId: number; roomName: string; employeeId: number; employeeName: string; title: string; startTime: string; endTime: string; attendees: number[]; bookingAttendees?: string; description?: string; status: string; createdAt: string; updatedAt: string; } export interface RoomBookingCreateRequest { roomId: number; roomName?: string; employeeId: number; employeeName?: string; title: string; startTime: string; endTime: string; attendees: number[]; description?: string; status?: 'pending' | 'approved' | 'rejected' | 'cancelled'; createdAt?: string; updatedAt?: string; } export interface RoomBookingUpdateRequest { id: number; roomId?: number; title?: string; startTime?: string; endTime?: string; attendees?: number[]; description?: string; status?: 'pending' | 'approved' | 'rejected' | 'cancelled'; } // Communication Trail Types export interface Communication { communicationId: number; communicationDate: string; topic: string; details: string; decisionMade: string; mode: string; participants: string; projectId?: number | null; createdBy: number | null; createdAt: string | null; createdByName: string | null; updatedBy: number | null; updatedAt: string | null; updatedByName: string | null; } export interface CommunicationCreateRequest { communicationId?: number; communicationDate: string; topic: string; details: string; decisionMade: string; mode: string; participants: string; projectId?: number | null; } export interface CommunicationUpdateRequest { communicationId: number; communicationDate: string; topic: string; details: string; decisionMade: string; mode: string; participants: string; projectId?: number | null; } export interface ManagementRemark { id: number; appraisalId: number; designation: string; remarks: string; createdBy?: number | null; createdAt?: string | null; createdByName?: string | null; updatedBy?: number | null; updatedAt?: string | null; updatedByName?: string | null; } export interface ManagementRemarkCreateRequest { appraisalId: number; designation: string; remarks: string; } export interface ManagementRemarkUpdateRequest { id: number; appraisalId: number; designation: string; remarks: string; } export interface MaintenanceAmcDate { maintenanceId: number; projectId: number; maintenanceType: string; startDate: string; endDate: string; notes: string; createdBy: number | null; createdAt: string; createdByName: string | null; updatedBy: number; updatedAt: string; updatedByName: string | null; } export interface MaintenanceAmcDateCreateRequest { maintenanceId?: number; projectId: number; maintenanceType: string; startDate: string; endDate: string; notes: string; } export interface MaintenanceAmcDateUpdateRequest { maintenanceId: number; projectId: number; maintenanceType: string; startDate: string; endDate: string; notes: string; } export interface ReleaseDate { releaseId: number; projectId: number; releaseName: string; releaseDateValue: string; description: string; createdBy: number | null; createdAt: string; createdByName: string | null; updatedBy: number; updatedAt: string; updatedByName: string | null; } export interface ReleaseDateCreateRequest { releaseId?: number; projectId: number; releaseName: string; releaseDateValue: string; description: string; } export interface ReleaseDateUpdateRequest { releaseId: number; projectId: number; releaseName: string; releaseDateValue: string; description: string; } export interface EmployeeProjectDetail { id: number; employeeId: number; projectName: string; clientCompany: string; startDate: string; endDate: string; technologiesUsed: string; role: string; responsibilities: string; projectDetails: string; sector: string; createdBy?: number | null; createdAt?: string; createdByName?: string | null; updatedBy?: number | null; updatedAt?: string; updatedByName?: string | null; } // Asset Management Module Types export * from './asset-management'; // Asset Request Management Module Types export * from './asset-request';