""" HR app URLs with comprehensive CRUD operations. """ from django.urls import path, include from . import views app_name = 'hr' urlpatterns = [ # ============================================================================ # DASHBOARD AND OVERVIEW # ============================================================================ path('', views.HRDashboardView.as_view(), name='dashboard'), # ============================================================================ # EMPLOYEE URLS (FULL CRUD - Master Data) # ============================================================================ path('employees/', views.EmployeeListView.as_view(), name='employee_list'), path('employees/create/', views.EmployeeCreateView.as_view(), name='employee_create'), path('employees//', views.EmployeeDetailView.as_view(), name='employee_detail'), path('employees//update/', views.EmployeeUpdateView.as_view(), name='employee_update'), path('employees//delete/', views.EmployeeDeleteView.as_view(), name='employee_delete'), # ============================================================================ # DEPARTMENT URLS (FULL CRUD - Master Data) # ============================================================================ path('departments/', views.DepartmentListView.as_view(), name='department_list'), path('departments/create/', views.DepartmentCreateView.as_view(), name='department_create'), path('departments//', views.DepartmentDetailView.as_view(), name='department_detail'), path('departments//update/', views.DepartmentUpdateView.as_view(), name='department_update'), path('departments//delete/', views.DepartmentDeleteView.as_view(), name='department_delete'), path('departments//activate/', views.activate_department, name='activate_department'), path('departments//deactivate/', views.deactivate_department, name='deactivate_department'), path('departments/bulk-activate/', views.bulk_activate_departments, name='bulk_activate_departments'), path('departments/bulk-deactivate/', views.bulk_deactivate_departments, name='bulk_deactivate_departments'), path('departments//assign-head/', views.assign_department_head, name='assign_department_head'), path('departments/hierarchy/', views.get_department_hierarchy, name='get_department_hierarchy'), path('departments/tree/', views.department_tree, name='department_tree'), path('departments//children/', views.department_children, name='department_children'), path('departments/search/', views.department_search, name='department_search'), # ============================================================================ # SCHEDULE URLS (LIMITED CRUD - Operational Data) # ============================================================================ path('schedules/', views.ScheduleListView.as_view(), name='schedule_list'), path('schedules/create/', views.ScheduleCreateView.as_view(), name='schedule_create'), path('schedules//', views.ScheduleDetailView.as_view(), name='schedule_detail'), path('schedules//update/', views.ScheduleUpdateView.as_view(), name='schedule_update'), path('schedules//delete/', views.ScheduleAssignmentDeleteView.as_view(), name='schedule_assignment_delete'), # Note: No delete view for schedules - use status updates instead # ============================================================================ # SCHEDULE ASSIGNMENT URLS (LIMITED CRUD - Operational Data) # ============================================================================ path('assignments/', views.ScheduleAssignmentListView.as_view(), name='schedule_assignment_list'), path('assignments/create/', views.ScheduleAssignmentCreateView.as_view(), name='schedule_assignment_create'), path('assignments//update/', views.ScheduleAssignmentUpdateView.as_view(), name='schedule_assignment_update'), path('assignments//delete/', views.ScheduleAssignmentDeleteView.as_view(), name='schedule_assignment_delete'), path('assignments/export/', views.export_assignments, name='export_assignments'), # Note: No detail views for assignments - managed via schedules # ============================================================================ # TIME ENTRY URLS (RESTRICTED CRUD - Operational Data) # ============================================================================ path('time-entries/', views.TimeEntryListView.as_view(), name='time_entry_list'), path('time-entries/create/', views.TimeEntryCreateView.as_view(), name='time_entry_create'), path('time-entries//', views.TimeEntryDetailView.as_view(), name='time_entry_detail'), path('time-entries//update/', views.TimeEntryUpdateView.as_view(), name='time_entry_update'), # Note: No delete view for time entries - use status updates instead # ============================================================================ # PERFORMANCE REVIEW URLS (FULL CRUD - Operational Data) # ============================================================================ path('reviews/', views.PerformanceReviewListView.as_view(), name='performance_review_list'), path('reviews/create/', views.PerformanceReviewCreateView.as_view(), name='performance_review_create'), path('reviews//', views.PerformanceReviewDetailView.as_view(), name='performance_review_detail'), path('reviews//update/', views.PerformanceReviewUpdateView.as_view(), name='performance_review_update'), path('reviews//delete/', views.PerformanceReviewDeleteView.as_view(), name='performance_review_delete'), path('reviews//complete/', views.complete_performance_review, name='complete_performance_review'), # ============================================================================ # TRAINING MANAGEMENT URLS (FULL CRUD - Operational Data) # ============================================================================ # Training Management Dashboard path('training-management/', views.TrainingManagementView.as_view(), name='training_management'), path('training/analytics/', views.training_analytics, name='training_analytics'), # Training Programs path('training/programs/', views.TrainingProgramListView.as_view(), name='training_program_list'), path('training/programs/create/', views.TrainingProgramCreateView.as_view(), name='training_program_create'), path('training/programs//', views.TrainingProgramDetailView.as_view(), name='training_program_detail'), path('training/programs//update/', views.TrainingProgramUpdateView.as_view(), name='training_program_update'), # Training Sessions path('training/sessions/', views.TrainingSessionListView.as_view(), name='training_session_list'), path('training/sessions/create/', views.TrainingSessionCreateView.as_view(), name='training_session_create'), path('training/sessions//', views.TrainingSessionDetailView.as_view(), name='training_session_detail'), path('training/sessions//update/', views.TrainingSessionUpdateView.as_view(), name='training_session_update'), # Training Enrollments/Records path('training/records/', views.TrainingRecordListView.as_view(), name='training_record_list'), path('training/records/create/', views.TrainingRecordCreateView.as_view(), name='training_record_create'), path('training/records//', views.TrainingRecordDetailView.as_view(), name='training_record_detail'), path('training/records//update/', views.TrainingRecordUpdateView.as_view(), name='training_record_update'), path('training/records//delete/', views.TrainingRecordDeleteView.as_view(), name='training_record_delete'), # Training Record Management Actions path('training/records//mark-complete/', views.training_record_mark_complete, name='training_record_mark_complete'), path('training/records//renew/', views.training_record_renew, name='training_record_renew'), path('training/records//mark-expired/', views.training_record_mark_expired, name='training_record_mark_expired'), path('training/records//archive/', views.training_record_archive, name='training_record_archive'), path('training/records//duplicate/', views.training_record_duplicate, name='training_record_duplicate'), # Training Certificates path('training/certificates/', views.TrainingCertificateListView.as_view(), name='training_certificate_list'), path('training/certificates//', views.TrainingCertificateDetailView.as_view(), name='training_certificate_detail'), path('training/certificates/issue//', views.issue_certificate, name='issue_certificate'), # Training Actions path('training/sessions//enroll/', views.enroll_employee, name='enroll_employee'), path('training/enrollments//attendance/', views.mark_attendance, name='mark_attendance'), # Employee Training Transcript path('employees//training-transcript/', views.employee_training_transcript, name='employee_training_transcript'), # ============================================================================ # HTMX ENDPOINTS FOR REAL-TIME UPDATES # ============================================================================ path('htmx/stats/', views.hr_stats, name='hr_stats'), path('htmx/employee-search/', views.employee_search, name='employee_search'), # ============================================================================ # ACTION URLS FOR WORKFLOW OPERATIONS # ============================================================================ path('employees//clock-controls/', views.clock_controls, name='clock_controls'), path('employees//clock-in/', views.clock_in, name='clock_in'), path('employees//clock-out/', views.clock_out, name='clock_out'), path('time-entries//approve/', views.approve_time_entry, name='approve_time_entry'), path('schedules//publish/', views.publish_schedule, name='publish_schedule'), # ============================================================================ # AJAX ENDPOINTS FOR DYNAMIC FORM FUNCTIONALITY # ============================================================================ path('ajax/get-program-sessions/', views.get_program_sessions, name='get_program_sessions'), path('ajax/get-program-details/', views.get_program_details, name='get_program_details'), path('ajax/check-time-entry-conflicts/', views.check_time_entry_conflicts, name='check_time_entry_conflicts'), path('ajax/get-employee-schedule-assignments/', views.get_employee_schedule_assignments, name='get_employee_schedule_assignments'), path('ajax/get-schedule-assignment-details/', views.get_schedule_assignment_details, name='get_schedule_assignment_details'), # ============================================================================ # SELF-SERVICE PORTAL URLS # ============================================================================ # Employee Self-Service path('my/profile/', views.my_profile, name='my_profile'), path('my/profile/edit/', views.my_profile_edit, name='my_profile_edit'), # Time & Attendance Self-Service path('my/clock/', views.clock_in_out, name='clock_in_out'), path('my/clock/in/', views.clock_in, name='clock_in'), path('my/clock/out/', views.clock_out, name='clock_out'), path('my/clock/break/start/', views.start_break, name='start_break'), path('my/clock/break/end/', views.end_break, name='end_break'), path('my/clock/lunch/start/', views.start_lunch, name='start_lunch'), path('my/clock/lunch/end/', views.end_lunch, name='end_lunch'), path('my/timesheet/', views.my_timesheet, name='my_timesheet'), # Leave Self-Service path('my/leave/', views.my_leave_dashboard, name='my_leave_dashboard'), # Manager Self-Service path('my/approvals/', views.pending_approvals, name='pending_approvals'), # ============================================================================ # LEAVE MANAGEMENT URLS # ============================================================================ # Leave Dashboard path('leave/dashboard/', views.leave_dashboard, name='leave_dashboard'), path('leave/calendar/', views.leave_calendar, name='leave_calendar'), # Leave Requests (FULL CRUD) path('leave/requests/', views.LeaveRequestListView.as_view(), name='leave_request_list'), path('leave/requests/create/', views.LeaveRequestCreateView.as_view(), name='leave_request_create'), path('leave/requests//', views.LeaveRequestDetailView.as_view(), name='leave_request_detail'), path('leave/requests//update/', views.LeaveRequestUpdateView.as_view(), name='leave_request_update'), # Leave Request Actions path('leave/requests//approve/', views.approve_leave_request, name='approve_leave_request'), path('leave/requests//cancel/', views.cancel_leave_request, name='cancel_leave_request'), # Leave Balances path('leave/balances/', views.LeaveBalanceListView.as_view(), name='leave_balance_list'), path('leave/balances/employee//', views.employee_leave_balance, name='employee_leave_balance'), # Leave Delegations path('leave/delegations/', views.LeaveDelegateListView.as_view(), name='leave_delegate_list'), path('leave/delegations/create/', views.LeaveDelegateCreateView.as_view(), name='leave_delegate_create'), path('leave/delegations//deactivate/', views.deactivate_delegation, name='deactivate_delegation'), # ============================================================================ # SALARY MANAGEMENT URLS # ============================================================================ # Salary Information (FULL CRUD) path('salary/', views.SalaryListView.as_view(), name='salary_list'), path('salary/create/', views.SalaryCreateView.as_view(), name='salary_create'), path('salary//', views.SalaryDetailView.as_view(), name='salary_detail'), path('salary//update/', views.SalaryUpdateView.as_view(), name='salary_update'), path('salary//delete/', views.SalaryDeleteView.as_view(), name='salary_delete'), # Salary History path('salary/employee//history/', views.salary_history, name='salary_history'), # Salary Adjustments path('salary/adjustments/', views.SalaryAdjustmentListView.as_view(), name='salary_adjustment_list'), path('salary/adjustments/create/', views.SalaryAdjustmentCreateView.as_view(), name='salary_adjustment_create'), # ============================================================================ # DOCUMENT REQUEST URLS # ============================================================================ # Document Requests (FULL CRUD) path('documents/requests/', views.DocumentRequestListView.as_view(), name='document_request_list'), path('documents/requests/create/', views.DocumentRequestCreateView.as_view(), name='document_request_create'), path('documents/requests//', views.DocumentRequestDetailView.as_view(), name='document_request_detail'), path('documents/requests//update/', views.DocumentRequestUpdateView.as_view(), name='document_request_update'), # Document Request Actions path('documents/requests//cancel/', views.cancel_document_request, name='cancel_document_request'), path('documents/requests//process/', views.process_document_request, name='process_document_request'), path('documents/requests//generate/', views.generate_document, name='generate_document'), path('documents/requests//download/', views.download_document, name='download_document'), path('documents/requests//approve/', views.approve_document_request, name='approve_document_request'), # Employee Self-Service Document Requests path('my/documents/', views.my_document_requests, name='my_document_requests'), # ============================================================================ # DOCUMENT TEMPLATE URLS (ADMIN ONLY) # ============================================================================ # Document Templates (FULL CRUD - Admin Only) path('documents/templates/', views.DocumentTemplateListView.as_view(), name='document_template_list'), path('documents/templates/create/', views.DocumentTemplateCreateView.as_view(), name='document_template_create'), path('documents/templates//', views.DocumentTemplateDetailView.as_view(), name='document_template_detail'), path('documents/templates//update/', views.DocumentTemplateUpdateView.as_view(), name='document_template_update'), path('documents/templates//delete/', views.DocumentTemplateDeleteView.as_view(), name='document_template_delete'), # ============================================================================ # API ENDPOINTS # ============================================================================ path('api/', include('hr.api.urls')), ]