109 lines
7.3 KiB
Python
109 lines
7.3 KiB
Python
"""
|
|
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/<int:pk>/', views.EmployeeDetailView.as_view(), name='employee_detail'),
|
|
path('employees/<int:pk>/update/', views.EmployeeUpdateView.as_view(), name='employee_update'),
|
|
path('employees/<int:pk>/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/<int:pk>/', views.DepartmentDetailView.as_view(), name='department_detail'),
|
|
path('departments/<int:pk>/update/', views.DepartmentUpdateView.as_view(), name='department_update'),
|
|
path('departments/<int:pk>/delete/', views.DepartmentDeleteView.as_view(), name='department_delete'),
|
|
path('departments/<int:pk>/activate/', views.activate_department, name='activate_department'),
|
|
path('departments/<int:pk>/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/<int:pk>/assign-head/', views.assign_department_head, name='assign_department_head'),
|
|
path('api/department-hierarchy/', views.get_department_hierarchy, name='get_department_hierarchy'),
|
|
path('htmx/department-tree/', views.department_tree, name='department_tree'),
|
|
path('search/departments/', 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/<int:pk>/', views.ScheduleDetailView.as_view(), name='schedule_detail'),
|
|
path('schedules/<int:pk>/update/', views.ScheduleUpdateView.as_view(), name='schedule_update'),
|
|
# 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/<int:pk>/update/', views.ScheduleAssignmentUpdateView.as_view(), name='schedule_assignment_update'),
|
|
# Note: No detail/delete 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/<int:pk>/', views.TimeEntryDetailView.as_view(), name='time_entry_detail'),
|
|
path('time-entries/<int:pk>/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/<int:pk>/', views.PerformanceReviewDetailView.as_view(), name='performance_review_detail'),
|
|
path('reviews/<int:pk>/update/', views.PerformanceReviewUpdateView.as_view(), name='performance_review_update'),
|
|
path('reviews/<int:pk>/delete/', views.PerformanceReviewDeleteView.as_view(), name='performance_review_delete'),
|
|
path('reviews/<int:review_id>/complete/', views.complete_performance_review, name='complete_performance_review'),
|
|
|
|
# ============================================================================
|
|
# TRAINING RECORD URLS (FULL CRUD - Operational Data)
|
|
# ============================================================================
|
|
path('training-management', views.TrainingManagementView.as_view(), name='training_management'),
|
|
path('training/', views.TrainingRecordListView.as_view(), name='training_record_list'),
|
|
path('training/create/', views.TrainingRecordCreateView.as_view(), name='training_record_create'),
|
|
path('training/<int:pk>/', views.TrainingRecordDetailView.as_view(), name='training_record_detail'),
|
|
path('training/<int:pk>/update/', views.TrainingRecordUpdateView.as_view(), name='training_record_update'),
|
|
path('training/<int:pk>/delete/', views.TrainingRecordDeleteView.as_view(), name='training_record_delete'),
|
|
|
|
# ============================================================================
|
|
# 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('clock-in/', views.clock_in, name='clock_in'),
|
|
path('clock-out/', views.clock_out, name='clock_out'),
|
|
path('time-entries/<int:entry_id>/approve/', views.approve_time_entry, name='approve_time_entry'),
|
|
path('schedules/<int:schedule_id>/publish/', views.publish_schedule, name='publish_schedule'),
|
|
|
|
|
|
# ============================================================================
|
|
# API ENDPOINTS
|
|
# ============================================================================
|
|
path('api/', include('hr.api.urls')),
|
|
]
|
|
|