Marwan Alwali 263292f6be update
2025-11-04 00:50:06 +03:00

258 lines
17 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('departments/hierarchy/', views.get_department_hierarchy, name='get_department_hierarchy'),
path('departments/tree/', views.department_tree, name='department_tree'),
path('departments/<int:department_id>/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/<int:pk>/', views.ScheduleDetailView.as_view(), name='schedule_detail'),
path('schedules/<int:pk>/update/', views.ScheduleUpdateView.as_view(), name='schedule_update'),
path('schedules/<int:pk>/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/<int:pk>/update/', views.ScheduleAssignmentUpdateView.as_view(), name='schedule_assignment_update'),
path('assignments/<int:pk>/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/<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 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/<int:pk>/', views.TrainingProgramDetailView.as_view(), name='training_program_detail'),
path('training/programs/<int:pk>/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/<int:pk>/', views.TrainingSessionDetailView.as_view(), name='training_session_detail'),
path('training/sessions/<int:pk>/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/<int:pk>/', views.TrainingRecordDetailView.as_view(), name='training_record_detail'),
path('training/records/<int:pk>/update/', views.TrainingRecordUpdateView.as_view(), name='training_record_update'),
path('training/records/<int:pk>/delete/', views.TrainingRecordDeleteView.as_view(), name='training_record_delete'),
# Training Record Management Actions
path('training/records/<int:record_id>/mark-complete/', views.training_record_mark_complete, name='training_record_mark_complete'),
path('training/records/<int:record_id>/renew/', views.training_record_renew, name='training_record_renew'),
path('training/records/<int:record_id>/mark-expired/', views.training_record_mark_expired, name='training_record_mark_expired'),
path('training/records/<int:record_id>/archive/', views.training_record_archive, name='training_record_archive'),
path('training/records/<int:record_id>/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/<int:pk>/', views.TrainingCertificateDetailView.as_view(), name='training_certificate_detail'),
path('training/certificates/issue/<int:enrollment_id>/', views.issue_certificate, name='issue_certificate'),
# Training Actions
path('training/sessions/<int:session_id>/enroll/', views.enroll_employee, name='enroll_employee'),
path('training/enrollments/<int:enrollment_id>/attendance/', views.mark_attendance, name='mark_attendance'),
# Employee Training Transcript
path('employees/<int:employee_id>/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/<int:employee_id>/clock-controls/', views.clock_controls, name='clock_controls'),
path('employees/<int:employee_id>/clock-in/', views.clock_in, name='clock_in'),
path('employees/<int:employee_id>/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'),
# ============================================================================
# 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/<int:pk>/', views.LeaveRequestDetailView.as_view(), name='leave_request_detail'),
path('leave/requests/<int:pk>/update/', views.LeaveRequestUpdateView.as_view(), name='leave_request_update'),
# Leave Request Actions
path('leave/requests/<int:pk>/approve/', views.approve_leave_request, name='approve_leave_request'),
path('leave/requests/<int:pk>/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/<int:employee_id>/', 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/<int:pk>/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/<int:pk>/', views.SalaryDetailView.as_view(), name='salary_detail'),
path('salary/<int:pk>/update/', views.SalaryUpdateView.as_view(), name='salary_update'),
path('salary/<int:pk>/delete/', views.SalaryDeleteView.as_view(), name='salary_delete'),
# Salary History
path('salary/employee/<int:employee_id>/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/<int:pk>/', views.DocumentRequestDetailView.as_view(), name='document_request_detail'),
path('documents/requests/<int:pk>/update/', views.DocumentRequestUpdateView.as_view(), name='document_request_update'),
# Document Request Actions
path('documents/requests/<int:pk>/cancel/', views.cancel_document_request, name='cancel_document_request'),
path('documents/requests/<int:pk>/process/', views.process_document_request, name='process_document_request'),
path('documents/requests/<int:pk>/generate/', views.generate_document, name='generate_document'),
path('documents/requests/<int:pk>/download/', views.download_document, name='download_document'),
path('documents/requests/<int:pk>/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/<int:pk>/', views.DocumentTemplateDetailView.as_view(), name='document_template_detail'),
path('documents/templates/<int:pk>/update/', views.DocumentTemplateUpdateView.as_view(), name='document_template_update'),
path('documents/templates/<int:pk>/delete/', views.DocumentTemplateDeleteView.as_view(), name='document_template_delete'),
# ============================================================================
# API ENDPOINTS
# ============================================================================
path('api/', include('hr.api.urls')),
]